SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

連載記事

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

CodeZine BOOKS(コードジン・ブックス)は、CodeZineの連載からカットアップした、開発現場の課題解決に役立つ書籍シリーズです。

書籍に関する記事を見る

'); googletag.cmd.push(function() { googletag.pubads().addEventListener('slotRenderEnded', function(e) { var ad_id = e.slot.getSlotElementId(); if (ad_id == 'div-gpt-ad-1659428980688-0') { var ad = $('#'+ad_id).find('iframe'); if ($(ad).width() == 728) { var ww = $(window).width(); ww = ww*0.90; var style = document.createElement("style"); document.head.appendChild( style ); var sheet = style.sheet; sheet.insertRule( "#div-gpt-ad-1659428980688-0 iframe {-moz-transform: scale("+ww/728+","+ww/728+");-moz-transform-origin: 0 0;-webkit-transform: scale("+ww/728+","+ww/728+");-webkit-transform-origin: 0 0;-o-transform: scale("+ww/728+","+ww/728+");-o-transform-origin: 0 0;-ms-transform: scale("+ww/728+","+ww/728+");-ms-transform-origin: 0 0;}", 0 ); sheet.insertRule( "#div-gpt-ad-1659428980688-0 div{ height:"+(90*ww/728)+"px;width:"+728+"px;}", 0 ); } else { if ($(window).width() < 340) { var ww = $(window).width(); ww = ww*0.875; var style = document.createElement("style"); document.head.appendChild( style ); var sheet = style.sheet; sheet.insertRule( "#div-gpt-ad-1659428980688-0 iframe {-moz-transform: scale("+ww/320+","+ww/320+");-moz-transform-origin: 0 0;-webkit-transform: scale("+ww/320+","+ww/320+");-webkit-transform-origin: 0 0;-o-transform: scale("+ww/320+","+ww/320+");-o-transform-origin: 0 0;-ms-transform: scale("+ww/320+","+ww/320+");-ms-transform-origin: 0 0;}", 0 ); sheet.insertRule( "#div-gpt-ad-1659428980688-0 div{ height:"+(180*ww/320)+"px;width:"+320+"px;}", 0 ); } } } }); }); } else { document.write('
'); document.write('
'); }
特集記事

C/C++に対応した、もうひとつのUnitTestFramework ─ WinUnit

お手軽お気楽なWindows C/C++ テスト環境

  • X ポスト
  • このエントリーをはてなブックマークに追加

ダウンロード サンプルファイル (10.4 MB)

MSDNマガジンに収録されたWindows環境専用のC/C++単体テストフレームワーク「WinUnit」は CUnit/CppUnitとは一味違ったテスト環境です。最大の売りはその手軽さ。JUnit/NUnit並みのお手軽さを紹介します。

  • X ポスト
  • このエントリーをはてなブックマークに追加

はじめに

 単体テストを効率的に行うため、テスト対象となる言語に応じてさまざまなフレームワーク「xUnit」がリリースされています。例えばJavaならJUnit、.NETならNUnit、CならCUnit、C++ならCppUnitあたりがそれぞれの代表格といったところでしょうか。

 マイクロソフトのオンラインマガジン「MSDNマガジン2008年2月号」で、Windows環境に特化したC/C++対応の単体テストフレームワーク「WinUnit」が紹介されています。実行環境がWindowsに限定されてはいるものの、それを補って余りある使い勝手の良さを実現しています。

CUnit/CppUnitの問題点

 CUnitによる単体テストの例を示します。

CUnitによるテストコード
#include <CUnit.h>
#include "Car.h"
#include <stdio.h>

Car c;

int car_setup(void) {
  c = car_new(50,2);
  return c != NULL ? 0 : 1;
}

int car_teardown(void) {
  car_delete(c);
  return 0;
}

void test_car_init(void) {
  CU_ASSERT_EQUAL(car_distance(c), 0);
  CU_ASSERT_EQUAL(car_remain(c), 0);
}

void test_car_refuel(void) {
  car_refuel(c, 20);
  CU_ASSERT_EQUAL(car_remain(c), 20);
  car_refuel(c, 20);
  CU_ASSERT_EQUAL(car_remain(c), 40);
  car_refuel(c, 20);
  CU_ASSERT_EQUAL(car_remain(c), 50);
}

/*
 * test-suitの構築と実行
 */
static CU_TestInfo test_car[] = {
  { "初期化", test_car_init },
  { "給油",   test_car_refuel },
  CU_TEST_INFO_NULL,
};

static CU_SuiteInfo suites[] = {
  { "Carのテスト",  car_setup, car_teardown, test_car },
  CU_SUITE_INFO_NULL,
};

#include <Basic.h>

int main() {
  CU_initialize_registry();
  CU_register_suites(suites);
  CU_basic_set_mode(CU_BRM_VERBOSE);
  CU_basic_run_tests();
  CU_cleanup_registry();
  return 0;
}

 このコード、中ほどの/* --- */以降の部分はテストそのものではありません。いくつものテスト関数をまとめたスイートを組み上げ、スイート内のテスト関数を順に呼び出してはその結果を収集する(ライブラリ提供の)実行ルーチンを起動しています。テストの追加/削除あるいはテスト関数名の変更に伴ってスイート組み上げ部の修正が必要となります。そのためスイートの修正漏れがあると、コンパイル/リンクエラーとなったり、追加したテストが実行されません。

 かたやこちらは同じテストをNUnit(C++/CLI)で書いたもの。スイートの組み上げやテスト実行部がありません。

NUnitによるテストコード
#include "Car.h"

using namespace System;
using namespace NUnit::Framework;
using namespace NUnit::Framework::SyntaxHelpers;

namespace TestByNUnit {

  [TestFixture]
  public ref class CarTest {
    Car c;
  public:
    [SetUp]
    void SetUp() { c = car_new(50,2); }

    [TearDown]
    void TearDown() { car_delete(c); }

    [Test]
    void init() {
      Assert::That(car_distance(c), Is::EqualTo(0));
      Assert::That(car_remain(c), Is::EqualTo(0));
    }

    [Test]
    void refuel() {
      car_refuel(c, 20);
      Assert::That(car_remain(c), Is::EqualTo(20));
      car_refuel(c, 20);
      Assert::That(car_remain(c), Is::EqualTo(40));
      car_refuel(c, 20);
      Assert::That(car_remain(c), Is::EqualTo(50));
    }
  };

}

 Javaや.NETには生成されたバイトコードやアセンブリからクラス名、メソッド名、引数などを抽出し、インスタンスの生成とメソッドの呼び出しが可能です。JUnit、NUnitは「リフレクション」と呼ばれるこの機能を使ってテストを抽出/実行できるのですが、ネイティブコードを生成するC/C++はリフレクションを持ち合わせていないので、テストスイートの組み立ておよびテストの実行をソースコード内に置いておかなければなりません。

 本稿で紹介するWinUnitはテストコードからDLLを生成することで(簡易版の)リフレクションを実現しています。DLLは他のEXEやDLLから呼び出せるよう、関数名がその内部に埋め込まれています。WinUnitのテスト実行アプリケーション「WinUnit.exe」は、実行時に指定されたDLL内からテスト関数を抽出し呼び出してくれるので、テストコード中のスイート組み上げやテスト実行部(すなわちmain)を必要としないのです。

 Windowsという限られた環境に限定されるものの、CUnit、CppUnitに比べ使い心地/お手軽さが大きく向上しています。

会員登録無料すると、続きをお読みいただけます

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

次のページ
前準備

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
特集記事連載記事一覧

もっと読む

この記事の著者

επιστημη(エピステーメー)

C++に首まで浸かったプログラマ。Microsoft MVP, Visual C++ (2004.01~2018.06) "だった"りわんくま同盟でたまにセッションスピーカやったり中国茶淹れてにわか茶...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/2290 2008/03/18 14:00
" ); }

おすすめ

アクセスランキング

  1. 1
    ランサーズ、「2024年必要とされたスキルランキング」を公開。「Lancers」上のデータを集計 NEW
  2. 2
    いいエンジニアになるための2つのポイント ──元Google技術者・石原氏が説く「シリコンバレー流ソフトウェア開発術」
  3. 3
    「CentOS Stream 10」発表、Linuxカーネル 6.12 LTSを搭載 NEW
  4. 4
    AppleがSiriとChatGPTを統合、Apple Intelligence強化
  5. 5
    【超時短テクニカルライティング】生成AIを活用してドキュメントを書く流れを掴もう!
  1. 6
    Google、XRデバイス用OS「Android XR」発表 NEW
  2. 7
    フロントエンドの定番ライブラリ「React」バージョン19の新機能を紹介──アクションによる非同期処理の進化 NEW
  3. 8
    2024年の提示年収が高いプログラミング言語は? paiza調査によるランキングが発表
  4. 9
    「CUDA」 ~マンガでプログラミング用語解説
  5. 10
    デスクトップアプリを開発しよう! 「Rust」と「Tauri 2.0」の基本情報と環境整備の仕方を解説

アクセスランキング

  1. 1
    ランサーズ、「2024年必要とされたスキルランキング」を公開。「Lancers」上のデータを集計 NEW
  2. 2
    いいエンジニアになるための2つのポイント ──元Google技術者・石原氏が説く「シリコンバレー流ソフトウェア開発術」
  3. 3
    「CentOS Stream 10」発表、Linuxカーネル 6.12 LTSを搭載 NEW
  4. 4
    AppleがSiriとChatGPTを統合、Apple Intelligence強化
  5. 5
    【超時短テクニカルライティング】生成AIを活用してドキュメントを書く流れを掴もう!
  6. 6
    Google、XRデバイス用OS「Android XR」発表 NEW
  7. 7
    フロントエンドの定番ライブラリ「React」バージョン19の新機能を紹介──アクションによる非同期処理の進化 NEW
  8. 8
    2024年の提示年収が高いプログラミング言語は? paiza調査によるランキングが発表
  9. 9
    「CUDA」 ~マンガでプログラミング用語解説
  10. 10
    デスクトップアプリを開発しよう! 「Rust」と「Tauri 2.0」の基本情報と環境整備の仕方を解説
  1. 1
    いいエンジニアになるための2つのポイント ──元Google技術者・石原氏が説く「シリコンバレー流ソフトウェア開発術」
  2. 2
    「CUDA」 ~マンガでプログラミング用語解説
  3. 3
    ITエンジニア本大賞2025、投票締切直前! みんなで選んだ歴代の大賞本を振り返って一挙紹介
  4. 4
    デスクトップアプリを開発しよう! 「Rust」と「Tauri 2.0」の基本情報と環境整備の仕方を解説
  5. 5
    今後生成AIとどう向き合うべきなのか? 現場のエンジニアと研究者が最新研究事例から語り合う
  6. 6
    2024年12月に開催される注目のITエンジニア向けカンファレンス5選
  7. 7
    日本在住の英語を話すソフトウェア開発者、年収の中央値は950万円に
  8. 8
    Vue.js3.4~3.5の新機能をまとめて紹介! 新しいAPIやSSRの改善
  9. 9
    VSCodeをドキュメント作成に活用――テキストエディタ、Markdownエディタの設定と拡張機能を解説
  10. 10
    Python 3.13の新機能、対話型インタプリタの機能強化や高速化などを解説

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

メールバックナンバー

アクセスランキング

  1. 1
    ランサーズ、「2024年必要とされたスキルランキング」を公開。「Lancers」上のデータを集計 NEW
  2. 2
    いいエンジニアになるための2つのポイント ──元Google技術者・石原氏が説く「シリコンバレー流ソフトウェア開発術」
  3. 3
    「CentOS Stream 10」発表、Linuxカーネル 6.12 LTSを搭載 NEW
  4. 4
    AppleがSiriとChatGPTを統合、Apple Intelligence強化
  5. 5
    【超時短テクニカルライティング】生成AIを活用してドキュメントを書く流れを掴もう!
  1. 6
    Google、XRデバイス用OS「Android XR」発表 NEW
  2. 7
    フロントエンドの定番ライブラリ「React」バージョン19の新機能を紹介──アクションによる非同期処理の進化 NEW
  3. 8
    2024年の提示年収が高いプログラミング言語は? paiza調査によるランキングが発表
  4. 9
    「CUDA」 ~マンガでプログラミング用語解説
  5. 10
    デスクトップアプリを開発しよう! 「Rust」と「Tauri 2.0」の基本情報と環境整備の仕方を解説

アクセスランキング

  1. 1
    ランサーズ、「2024年必要とされたスキルランキング」を公開。「Lancers」上のデータを集計 NEW
  2. 2
    いいエンジニアになるための2つのポイント ──元Google技術者・石原氏が説く「シリコンバレー流ソフトウェア開発術」
  3. 3
    「CentOS Stream 10」発表、Linuxカーネル 6.12 LTSを搭載 NEW
  4. 4
    AppleがSiriとChatGPTを統合、Apple Intelligence強化
  5. 5
    【超時短テクニカルライティング】生成AIを活用してドキュメントを書く流れを掴もう!
  6. 6
    Google、XRデバイス用OS「Android XR」発表 NEW
  7. 7
    フロントエンドの定番ライブラリ「React」バージョン19の新機能を紹介──アクションによる非同期処理の進化 NEW
  8. 8
    2024年の提示年収が高いプログラミング言語は? paiza調査によるランキングが発表
  9. 9
    「CUDA」 ~マンガでプログラミング用語解説
  10. 10
    デスクトップアプリを開発しよう! 「Rust」と「Tauri 2.0」の基本情報と環境整備の仕方を解説
  1. 1
    いいエンジニアになるための2つのポイント ──元Google技術者・石原氏が説く「シリコンバレー流ソフトウェア開発術」
  2. 2
    「CUDA」 ~マンガでプログラミング用語解説
  3. 3
    ITエンジニア本大賞2025、投票締切直前! みんなで選んだ歴代の大賞本を振り返って一挙紹介
  4. 4
    デスクトップアプリを開発しよう! 「Rust」と「Tauri 2.0」の基本情報と環境整備の仕方を解説
  5. 5
    今後生成AIとどう向き合うべきなのか? 現場のエンジニアと研究者が最新研究事例から語り合う
  6. 6
    2024年12月に開催される注目のITエンジニア向けカンファレンス5選
  7. 7
    日本在住の英語を話すソフトウェア開発者、年収の中央値は950万円に
  8. 8
    Vue.js3.4~3.5の新機能をまとめて紹介! 新しいAPIやSSRの改善
  9. 9
    VSCodeをドキュメント作成に活用――テキストエディタ、Markdownエディタの設定と拡張機能を解説
  10. 10
    Python 3.13の新機能、対話型インタプリタの機能強化や高速化などを解説