C言語向けBDDフレームワーク CSpecについて

 「C言語向けユニットテスティングフレームワーク Cmockeryについて - 千里霧中の犀」に続いて、C言語のテスティングフレームワークを紹介していきたいと思います。今回はCSpecについて。

CSpecについて

テストコード

 テストメソッドは以下の通り。

#include <cspec.h>

DESCRIBE(hoge, "hoge")
	IT("returns 0 when the argument is 0.")
		SHOULD_EQUAL(hoge(0), 0)
	END_IT

	IT("returns -1 when the argument is not 0.")
		SHOULD_EQUAL(hoge(4), -1)
	END_IT	
END_DESCRIBE

 xUnitの用語でいえば、「SHOULD_EQUAL」がAssertionメソッド(assertThatに近い)に該当します。
 また「IT("returns 0 when the argument is 0.")」がテストメソッドの識別子になります。「IT」はテスト対象のことであり、「IT returns 0 when the argument is 0.」と、自然言語でテスト対象のSpecを説明するようにテストを書いていきます。
 さらにC言語特有の「;」や「{」「}」を隠している等、DSLを意識した実装となっています。

 このように自然言語に似たDSLで仕様や振る舞いを記述していくのが、xSpecをはじめとするBDDフレームワークの一般的な特徴です。


 一方main関数は以下の通りです。自動テストディスカバリ機能はなく、手動でmain関数にDESCRIBE構文をリストアップして実行させます。

#include <cspec.h>
#include <cspec_output_verbose.h>

int main(int argc, char **argv)
{
	CSpec_Run(DESCRIPTION(hoge), CSpec_NewOutputVerbose());
	return 0;
}


 結果は以下のようになります。デフォルト設定ではドキュメントを意識したような出力となります。

Describe:hoge
   - it returns 0 when the argument is 0.
       OK: (hoge(0)) == (0)

   - it returns -1 when the argument is not 0.
       OK: (hoge(4)) == (-1)

補足

 CSpecのようなユニットテストレベルのBDDフレームワークは、効果的なユニットテストを書くために必要な、いくつかの重要な心がけや習慣・手法を使用者に身につけさせる効果を持っています。
 例えば「Test as Documentation」(ドキュメントのようにテストを書いて、テストをドキュメントとして活用する)の考え方や、テスト駆動開発のようなテストを活用する設計手法などは、BDDフレームワークを使用すれば自然と身についていきます。
 CSpecに限らなくてよいですし、メインのフレームワークとして必ず使用する必要はないですが、何かしら1つは身につけておくと良いかと思います。