読者です 読者をやめる 読者になる 読者になる

CppUTestを使う

 ちょっと前からTest-Driven Development for Embedded Cという組み込みC向けのTDD本を読んでいます。
http://www.amazon.co.jp/gp/product/193435662X

 この本、Test Doubleパターン、Breaking Dependenciesの手法、SOLID原則など、TDD/ユニットテストで活用されるノウハウやアプローチを組み込みCで再解釈してうまくまとめているなかなか良い本です。組み込み開発・Cの開発でTDDやユニットテストを考えている人にはお勧めできる内容と考えています。
 なおこの本ではテスティングフレームワークの1つにCppUTestというフレームワークを使っています。しばらく扱ってみたので一度導入方法を簡単にまとめたいと思います。

CppUTestについて

  • C/C++向けのユニットテスティングフレームワーク。組み込みでの使用も想定。
  • templateやC++固有のライブラリ、新しめの言語仕様の使用が避けられていて、古いor特殊な開発環境でも割と使える。中身のコードも組み込みC++ユニットテストをやっている人が書くような記述で、カスタマイズしやすい印象。
  • シンプルでxUnitに似たRunnerやマクロ。
  • 自動テストディスカバリ付き。テストメソッドを書いたら勝手に実行してくれる。

 テストコードを簡潔に書けて、かつ自動テストディスカバリ機能を持っている点で、TDDと親和性の高いフレームワークだと思います(C/C++ではそうじゃないフレームワークが多いのです。例えばCUnitやCppUnit等)。同じくTDDと相性がいいGoogle Testとよく似ています。

入手

 以下から入手。
Where to get CppUTest | CppUTest
 Visual C++など使用する開発環境でビルドして「CppUTest.lib」を確保します。

セッティング

 「CppUTest.lib」と、同じく同梱されている「include/CppUTest」フォルダを開発環境に組み込みます。そこらへんはCppUnitGoogle Testと同じです。

main関数

 main関数は以下。

#include <CppUTest/CommandLineTestRunner.h>

int main(int argc, char *argv[])
{
	return CommandLineTestRunner::RunAllTests(argc, argv);
}

 あとはテストディスカバリ機能により、テストメソッドを書けば勝手に実行してくれるようになります。

テストメソッド

 以下のように書きます。
 CppUTestでは、xUnit(NUnit除く)でいうTest SuiteをTest Groupと呼んでいます。

#include "CppUTest/TestHarness.h"


TEST_GROUP(TestSuiteHoge)
{};

TEST(TestSuiteHoge, TestCaseHoge)
{
	LONGS_EQUAL(3, hoge());
}

TEST(TestSuiteHoge, TestCaseHoge2)
{
	LONGS_EQUAL(3, hoge(2));
}

Four Phase Test

 xUnitのようにsetup()、teardown()が使えます。それら実行タイミングもxUnitと同じです。

#include "CppUTest/TestHarness.h"

TEST_GROUP(TestSuiteFuga)
{
	void setup()
	{
		//setup
	}

	void teardown()
	{
		//teardown
	}
};

TEST(TestSuiteFuga, TestCaseFuga)
{
	LONGS_EQUAL(3, Fuga());
}

TEST(TestSuiteFuga, testHogeFuga2)
{
	LONGS_EQUAL(3, Fuga2());
}


 その他、メモリリークチェックやMockもサポートしているなど、色々な機能を持っています。Google Testの使用に制約がある環境だったり、組み込み向けの固有機能を活用したかったりする場合に、有効な選択肢になると思います。