2013年2月6日水曜日

CUnit

ダウンロード
C Unit Testing Framework - SourceForge.net
使い方
  1. VC++ 2008 EE で libcunit.lib を作成する
  2. CUnit-2.1-0/vc8/libcunit.vcproj を開くと VC++9 用に変換される
  3. libcunit をコンパイルすると libcunit.lib が作成される
  4. libcunit.lib と CUnit-2.1-0/CUnit にある /Headers ディレクトリをテストを行うソースファイルのディレクトリにコピーする
XML で結果を出力
CUnit-2.1.0/Share にある CUnit-List.dtd, CUnit-List.xsl, CUnit-Run.dtd, CUnit-Run.xsl をコピーする


  • CUnit を使う場合は CUnit.h を include する
  • Automated でテストする場合は Automated.h を include する
Test は registory, suite, test から構成され、下記のような配置になる。
Test registory
  +--- suite0
  |       +--- test_001
  |       +--- test_002
  +--- suite1
          +--- test_101
          +--- test_102
#include 
#include "CUnit/Headers/Automated.h"
#include "CUnit/Headers/Cunit.h"

/* テスト対象の関数を定義 */

int func(int a)
{
 return (a + 1);
}

int func_ng(int a)
{
 /* わざとエラーを仕込んだ場合 */
 return (a - 1);
}

/* 各テストを準備 */

void test_001(void)
{
 int ret;

 ret = func(1);

 CU_ASSERT(ret == 2);
}

void test_002(void)
{
 int ret;

 ret = func(2);

 CU_ASSERT(ret == 3);
}

void test_101(void)
{
 int ret;

 ret = func_ng(1 + 3);

 CU_ASSERT(ret == 5);
}

void test_102(void)
{
 int ret;

 ret = func_ng(3 * 5);

 CU_ASSERT(ret == 16);
}
テストを実行する main プログラムを作成する。
  1. CU_initialize_registory() でレジストリを準備
  2. CU_add_suite() でスイートを定義する
  3. 各スイートに CU_add_test() でテストを追加する
int main(void)
{
 CU_pSuite suite0, suite1;

 CU_initialize_registry();
 suite0 = CU_add_suite("suite0", NULL, NULL);
 CU_add_test(suite0, "test_001", test_001);
 CU_add_test(suite0, "test_002", test_002);

 /* こちらはエラーになるように仕込んだ関数のテスト */
 suite1 = CU_add_suite("suite1", NULL, NULL);
 CU_add_test(suite1, "test_101", test_101);
 CU_add_test(suite1, "test_102", test_102);

 /* コンソール版を使う場合はこちら */
 CU_console_run_tests();

 /* 結果を XML 出力する場合はこちら */
 CU_list_tests_to_file();
 CU_automated_run_tests();

 CU_cleanup_registry();

 return 0;
}
  • コンソール版でテストをする場合は CU_console_run_tests() で実行する
  • XML に出力する場合は CU_list_tests_to_file(), CU_automated_run_tests() で実行する
  • 最後に CU_cleanup_registory() で後片付けをする
サンプルソース全体は以下の通り
#include 
#include "CUnit/Headers/Automated.h"
#include "CUnit/Headers/Cunit.h"

/* Test registory
 *   +--- suite0
 *   |       +--- test_001
 *   |       +--- test_002
 *   +--- suite1
 *           +--- test_101
 *           +--- test_102
 */
int func(int a)
{
 return (a + 1);
}

int func_ng(int a)
{
 /* わざとエラーを仕込んだ場合 */
 return (a - 1);
}

void test_001(void)
{
 int ret;

 ret = func(1);

 CU_ASSERT(ret == 2);
}

void test_002(void)
{
 int ret;

 ret = func(2);

 CU_ASSERT(ret == 3);
}

void test_101(void)
{
 int ret;

 ret = func_ng(1 + 3);

 CU_ASSERT(ret == 5);
}

void test_102(void)
{
 int ret;

 ret = func_ng(3 * 5);

 CU_ASSERT(ret == 16);
}

int main(void)
{
 CU_pSuite suite0, suite1;

 CU_initialize_registry();
 suite0 = CU_add_suite("suite0", NULL, NULL);
 CU_add_test(suite0, "test_001", test_001);
 CU_add_test(suite0, "test_002", test_002);

 /* こちらはエラーになるように仕込んだ関数のテスト */
 suite1 = CU_add_suite("suite1", NULL, NULL);
 CU_add_test(suite1, "test_101", test_101);
 CU_add_test(suite1, "test_102", test_102);

 /* コンソール版を使う場合はこちら */
 // CU_console_run_tests();

 /* 結果を XML 出力する場合はこちら */
 CU_list_tests_to_file();
 CU_automated_run_tests();

 CU_cleanup_registry();

 return 0;
}

0 件のコメント:

コメントを投稿