Eclipse CDTを使ったMacでのPCUnitの環境構築

 引き続きTDDBC大阪向けの資料です。
 TDDBC大阪ではCのテスティングフレームワークにPCUnitが選択されそうなので、今回はPCUnitの概要と、Mac OS XでのEclipse CDT上のPCUnitの環境構築方法をまとめます。なおPCUnitはRubyスクリプトによるテストコード自動生成が大変便利なので、今回はスクリプト実行環境も合わせて構築しています。
 ちなみにPCUnitは日本人の @ さんが開発したものであるため、既に分かりやすい日本語ドキュメントが「katono/PCUnit · GitHub」等で公開されています。入門の際は本エントリよりまずそちらを当たった方が無難だと思います。


PCUnitについて

  • 組み込み開発も対象に含むC/C++向けユニットテスティングフレームワーク
  • サイト: https://github.com/katono/PCUnit
  • シンプルなフレームワーク。標準C89規格のファイルでコアを構成。マクロで標準ライブラリへの依存も取り除ける。Rubyスクリプトで機能拡張。そのためマルチプラットフォーム対応で、色々な開発環境(例えばHEW等も)に組み込める。
  • ホスト/ターゲット両方で実行可能。組み込みのプアなターゲット環境でも動作する。
  • CUnitに似た構文や命名、マクロ。ただ命名や実行フローはCUnitよりもよりxUnitファミリーの慣習に準拠している。
  • Rubyスクリプトを使ったテストランナー自動生成をサポート。テストメソッドを書いたら自動的に見つけ出して実行してくれる。そのためTDD向き。
  • 再利用しやすい緩いライセンスで、カスタマイズも容易。

手順

1. Rubyのインストール

 Rubyがインストールされていなければインストールします。

2. Eclipse CDTの環境構築

 「http://d.hatena.ne.jp/goyoki/20120526/1338055942」での手順1.、2.を実行し、C言語がビルド可能なEclipse CDTの環境を確保します。

3. PCUnitのダウンロード

 開発者のgithub「https://github.com/katono/PCUnit」から、最新版のZIPファイルをダウンロードし解凍します。

4. PCUnitのインストール

 Macのターミナルで、解凍したZIPファイルの中のPCUnitディレクトリに移動し、「make install」コマンドを実行します。

5. テストコードを書くプロジェクトの作成

 2.で構築したEclipseで、適宜の場所でテストコードを書くプロジェクトを作成します。プロジェクトはとりあえず「C Project」の「Hello World ANSI C Project」にします。またToolchainsは「MacOSX GCC」を選択します。

6. ライブラリおよびRubyスクリプトの登録

 EclipseのProject Properties(Project ExplorerでProjectを右クリック→Properties)にて、以下の設定を行います。

  • 「Tool Settings」タブのMacOS X C++ LinkerのLibrariesにて、
    • Libraries(-l)に「pcunit」を追加
  • 「Build Steps」タブの一番上の「Command:」にて、
    • 「/usr/local/bin/pcunit_register.rb -d [テストコードを置くディレクトリパス]」を入力
7. スケルトンコードの生成

 Macのターミナルでテストコードを置くディレクトリに移動し、「pcunit_temlate.rb -m」を実行。これによりTest Runnerであるmain関数が生成されます。なお自分は結果をカラフルに表示したいので、以下のように「 PCU_enable_color()」を生成コードに追記しています。

int main(void)
{
        const PCU_SuiteMethod suites[] = {
        };
        PCU_set_putchar(putchar);
        PCU_set_getchar(getchar);
        PCU_enable_color();
        PCU_run(suites, sizeof suites / sizeof suites[0]);
        return 0;
}
8. テストコードの実装

 テストコードを書く.cファイルを適宜作成し、以下のようなコードを書きます。コード中の「(テストスイート名)」はHogeTestなど、適当な名前に置換してください。
 

#include <PCUnit/PCUnit.h>

static void test_hoge(void)
{
     PCU_ASSERT_EQUAL(3, 3);
}

PCU_Suite *(テストスイート名)_suite(void)
{
	static PCU_Test tests[] = {
	};
	static PCU_Suite suite = {
		"(テストスイート名)", tests, sizeof tests / sizeof tests[0], NULL, NULL, NULL, NULL
	};
	return &suite;
}
9. ビルドと実行

 実行すると、「test_hoge()」が自動で「PCU_Test tests[] 」に追加され、さらに「(テストスイート名)_suite(void)」がmain()関数に登録されます。そして「test_hoge()」がテストコードとして実行されます。
 あとは「static void test_適当なテストメソッド名(void)」のような関数を継ぎ足していけば、実行の度にその関数が自動でmain()に登録され実行されます。

 新たなテストコードのファイルを作る際は、以下のようなコードをファイル末尾に追記します。なおこのコードを含むテストスイートのスケルトンは、スケルトンを生成したいディレクトリで「pcunit_template.rb テストスイート名 -m」を実行しても生成できます。

PCU_Suite *(テストスイート名)_suite(void)
{
	static PCU_Test tests[] = {
	};
	static PCU_Suite suite = {
		"(テストスイート名)", tests, sizeof tests / sizeof tests[0], NULL, NULL, NULL, NULL
	};
	return &suite;
}