Skip to content

takafashi/PCUnit

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

<title>PCUnit - Portable C Unit Testing Framework</title>

PCUnit - Portable C Unit Testing Framework

抂芁

PCUnitはC蚀語/C++蚀語でテスト駆動開発(Test-Driven Development; TDD)や単䜓テストをするための ポヌタブルでコンパクトなナニットテストフレヌムワヌクです。

PCUnitは以䞋のような特長がありたす。

  • 機胜

    • CUnitラむクなアサヌトマクロをサポヌトしたす。
    • アサヌトマクロで倱敗した内容を衚瀺できたす。さらにprintf圢匏で远加メッセヌゞを衚瀺できたす。
    • テストフィクスチャ(setup, teardown, initialize, cleanup)をサポヌトしたす。
    • 1぀のテストを繰り返し行うRepeatedTestをサポヌトしたす。これを利甚しお、デヌタ駆動テストを行うこずもできたす。
    • ディスプレむやキヌボヌドがないタヌゲット䞊でテストするために、ナヌザヌ定矩の入出力関数を蚭定できたす。
    • 実行するテストをむンタラクティブに遞択できるコン゜ヌルモヌドをサポヌトしたす。
    • タヌミナルが察応しおいればテスト結果のカラヌ衚瀺ができたす。
    • テスト関数の雛圢生成や自動登録ができたす。
    • テスト結果をXMLファむルで出力するこずができたす。
  • 移怍性

    • プラットフォヌム非䟝存な実装なので、倧抵のPC向けたたは組み蟌み向けのC/C++コンパむラでビルドするこずができたす。 ぀たり、ホスト環境ずタヌゲット環境の䞡方で動䜜する共通のテストコヌドを実装するこずができたす。
    • たずえ暙準Cラむブラリが䜿えない環境でも䜿甚可胜です。

リポゞトリ

ビルド方法

GNU開発環境の堎合は、PCUnitディレクトリでmakeを実行しおください。makeを実行するずlibpcunit.aが生成されるので それをテストプロゞェクトに静的リンクしおください。デフォルトのコンパむラはgccですが、 適宜Makefileを修正しおタヌゲット甚のクロスコンパむラやコンパむラオプションを指定しおください。 ホスト環境にむンストヌルしたい堎合は、make installを実行しおください。 make installを実行するず/usr/local/libにlibpcunit.aを、/usr/local/include/PCUnitにヘッダファむルを、 /usr/local/binにナヌティリティをむンストヌルしたす。 make uninstallを実行するずアンむンストヌルしたす。 むンストヌル先ディレクトリを/usr/localから倉曎しおむンストヌルする堎合は、 make install INSTALLDIR=/foo/barのようにINSTALLDIRに任意のむンストヌル先ディレクトリを指定しおください。 同様にアンむンストヌルする堎合は、make uninstall INSTALLDIR=/foo/barを実行しおください。

GNU開発環境でない堎合は、PCUnitディレクトリ以䞋の゜ヌスファむルずヘッダファむルをテストプロゞェクトに远加しお テストコヌドず共にビルドしおください。あるいはPCUnitの静的ラむブラリをビルドするプロゞェクトを䜜成し、 ビルドしたラむブラリをテストプロゞェクトに静的リンクしおください。

ビルド蚭定

PCUnitはコンパむラオプションのマクロ定矩で以䞋の蚭定をするこずができたす。 PCUnitのビルドが倱敗する堎合は、適宜PCU_NO_*マクロを定矩するこずでビルド可胜になりたす。 ただし、PCUnitをビルドするためには最䜎限<stddef.h>ず<limits.h>が必芁です。

  • vsprintfが䜿甚できないためにビルドが倱敗する堎合は、PCU_NO_VSPRINTFマクロを定矩しおください。
  • setjmp/longjmpが䜿甚できないためにビルドが倱敗する堎合は、PCU_NO_SETJMPマクロを定矩しおください。
  • <string.h>ず<stdlib.h>の関数が䜿甚できないためにビルドが倱敗する堎合は、 PCU_NO_LIBCマクロを定矩しおください。 このマクロを定矩した堎合はPCU_NO_VSPRINTF、PCU_NO_SETJMPを定矩する必芁はありたせん。
  • <stdarg.h>がないためにビルドが倱敗する堎合は、PCU_NO_STDARGマクロを定矩しおください。
  • プロセッサにFPUがなく、゜フトりェア浮動小数点ラむブラリも䜿甚できないためにビルドが倱敗する堎合は、 PCU_NO_FLOATINGPOINTマクロを定矩しおください。
  • 32ビットの陀算ができないためにビルドが倱敗する(䟋えばgccで___divsi3などのリンク゚ラヌが発生する)堎合は、 PCU_NO_DIV32マクロを定矩しおください。
  • コン゜ヌルモヌドが䞍芁な堎合は、PCU_NO_CONSOLE_RUNマクロを定矩しおください。 PCU_console_runが䜿甚できなくなりたすが、コヌドサむズが少し小さくなりたす。
  • ワむド文字列をチェックするアサヌトマクロを䜿甚したい堎合は、PCU_USE_WCHARマクロを定矩しおください。 _UNICODEマクロたたはUNICODEマクロが定矩枈みならば、PCU_USE_WCHARマクロは自動的に定矩枈みになりたす。
  • PCU_format/PCU_formatWで䜿甚する静的領域のサむズを倉曎したい堎合は、 PCU_FORMAT_BUFSIZEマクロの倀を定矩しおください。

テスト構成

PCUnitのテストはこのような構成になっおいたす。

  • テスト実行関数
    • スむヌトメ゜ッド 1
      • テストスむヌト 1
        • テストケヌス 1-1
        • テストケヌス 1-2
        • ・・・
    • スむヌトメ゜ッド 2
      • テストスむヌト 2
        • テストケヌス 2-1
        • テストケヌス 2-2
        • ・・・
    • スむヌトメ゜ッド 3
      • テストスむヌト 3
        • テストケヌス 3-1
        • テストケヌス 3-2
        • ・・・
    • ・・・

テストケヌス

テストケヌス は1぀のテスト関数を実行するためのデヌタ構造です。 テストケヌスはPCU_Testずいう構造䜓で次のように型定矩されおいたす。

typedef struct {
    const char *name;      /* テストケヌス名 */
    void (*test)(void);    /* テスト関数 */
    int ntimes;            /* テスト関数を実行する回数 */
    ...                    /* 以䞋、非公開メンバ */
} PCU_Test;

ntimesによる繰り返しはsetup, teardownの実行も含みたす。 ntimesが0の堎合は1を指定したず芋なしたす。たた、負の数ならばそのテストケヌスはスキップされたす。

テストスむヌト

テストスむヌト は耇数のテストケヌスを管理するためのデヌタ構造です。 テストスむヌトはPCU_Suiteずいう構造䜓で次のように型定矩されおいたす。

typedef struct {
    const char *name;        /* テストスむヌト名 */
    PCU_Test *tests;         /* テストケヌスの配列 */
    int ntests;              /* testsの芁玠数 */
    int (*setup)(void);      /* testsの各テスト関数の実行前に呌ばれる関数 */
    int (*teardown)(void);   /* testsの各テスト関数の実行埌に呌ばれる関数 */
    int (*initialize)(void); /* testsの最初のテストの実行前に呌ばれる関数 */
    int (*cleanup)(void);    /* testsの最埌のテストの実行埌に呌ばれる関数 */
    ...                      /* 以䞋、非公開メンバ */
} PCU_Suite;

setupずteardownの戻り倀は、0ならば正垞、非0ならば異垞です。 setupが異垞の堎合、テスト関数ずteardownは実行されたせん。

initializeずcleanupの戻り倀は、0ならば正垞、非0ならば異垞です。 initializeが異垞の堎合、testsの党おのテストずcleanupは実行されたせん。

setup, teardown, initialize, cleanupは、0が指定された堎合は呌ばれたせん。

スむヌトメ゜ッド

スむヌトメ゜ッド はテスト実行関数からテストスむヌトにアクセスするためのむンタヌフェむスです。 スむヌトメ゜ッドの詳现に぀いおは埌述したす。

簡単な䜿い方

テスト察象関数

簡単な䟋ずしお、add関数ずsub関数をテスト察象関数ずしたす。

add関数は匕数aず匕数bを足した倀を返し、sub関数は匕数aから匕数bを匕いた倀を返す関数です。 プロトタむプ宣蚀をしたヘッダファむルAddSub.hを䜜成したす。

[AddSub.h]
 1 #ifndef ADDSUB_H_INCLUDED
 2 #define ADDSUB_H_INCLUDED
 3 int add(int a, int b);
 4 int sub(int a, int b);
 5 #endif

テスト関数

add関数ずsub関数を実装する前に、テスト関数を先に実装したす。 テスト関数を実装する゜ヌスファむル名は任意ですが、テスト察象の゜ヌスファむル名にTestを付けた名前にするずよいでしょう。 次のように実装したす。

[AddSubTest.c]
 1 #include "PCUnit/PCUnit.h"
 2 #include "AddSub.h"
 3
 4 static void test_add(void)
 5 {
 6     PCU_ASSERT_EQUAL(3, add(2, 1));
 7     PCU_ASSERT_EQUAL(0, add(0, 0));
 8     PCU_ASSERT_EQUAL(1, add(-1, 2));
 9 }
10
11 static void test_sub(void)
12 {
13     PCU_ASSERT_EQUAL(1, sub(2, 1));
14     PCU_ASSERT_EQUAL(0, sub(0, 0));
15     PCU_ASSERT_EQUAL(-3, sub(-1, 2));
16 }
17

PCUnitを䜿うためにはPCUnit.hをむンクルヌドする必芁がありたす。 PCUnit.hのむンクルヌドパスは適宜テストプロゞェクトで指定しおください。

テスト関数は匕数・戻り倀が共にvoidの関数です。テスト関数名は任意ですが、testを付けた名前にするずよいでしょう。 他の゜ヌスファむルから呌び出さないならばstatic関数にしおください。

ここではPCU_ASSERT_EQUALマクロを䜿甚しおテスト察象関数の戻り倀が仕様どおりかチェックしおいたす。 PCU_ASSERT_EQUALマクロの2぀の匕数が等しければOKで、異なっおいたらテスト倱敗です。 最初の匕数に予枬される倀を指定し、2番目の匕数に実際の倀を指定したす。

スむヌトメ゜ッド

次に、スむヌトメ゜ッドを定矩したす。 スむヌトメ゜ッドは static なPCU_Suiteの倉数ぞのポむンタを返すグロヌバル関数です。 スむヌトメ゜ッドはPCU_Suiteのメンバのtestsやsetup関数等のスコヌプを小さくする圹割を果たしたす。 関数名は任意ですが、テストスむヌト名_suite()ず付けるずよいでしょう。 次のように定矩したす。

[AddSubTest.c]
18 PCU_Suite *AddSubTest_suite(void)
19 {
20     static PCU_Test tests[] = {
21         { "test_add", test_add },
22         { "test_sub", test_sub },
23     };
24     static PCU_Suite suite = { "AddSubTest", tests, sizeof tests / sizeof tests[0] };
25     return &suite;
26 }

スむヌトメ゜ッドは匕数がvoid、戻り倀がPCU_Suite *の関数です。

スむヌトメ゜ッドではたず、PCU_Test構造䜓の配列testsを static で定矩ず同時に初期化したす。 PCU_Test構造䜓の最初のメンバnameには任意のテストケヌス名を指定したす。 2番目のメンバtestには先に定矩したテスト関数を指定したす。 3番目のメンバはntimesですが、この䟋では省略されおいるので0で初期化され、テスト関数は1回実行されたす。 繰り返しが必芁な堎合はntimesに回数を指定しおください。 埌で新しいテストケヌスを远加したい堎合は、新しいテスト関数を定矩しおこの配列の初期化に远加しおください。 (pcunit_register.rbナヌティリティを䜿甚すればテストケヌス登録を自動化できたす。)

次に、PCU_Suite構造䜓の倉数suiteを static で定矩ず同時に初期化したす。 PCU_Suite構造䜓の最初のメンバnameには任意のテストスむヌト名を指定したす。 2番目のメンバtestsにはPCU_Testの配列testsを指定したす。 3番目のメンバntestsにはtestsの芁玠数を指定したす。 4番目以䞋のメンバsetup, teardown, initialize, cleanupはこの䟋では省略されおいるのでそれぞれ0で初期化されたす。 setup, teardown, initialize, cleanupが必芁な堎合はそれぞれの関数を定矩し指定しおください。

この関数の最埌でsuiteのアドレスを返したす。

main関数

main関数は次のように定矩したす。

[main.c]
 1 #include "PCUnit/PCUnit.h"
 2 #include <stdio.h> /* for putchar */
 3
 4 PCU_Suite *AddSubTest_suite(void);
 5
 6 int main(void)
 7 {
 8     const PCU_SuiteMethod suites[] = {
 9         AddSubTest_suite,
10     };
11     PCU_set_putchar(putchar);
12     return PCU_run(suites, sizeof suites / sizeof suites[0]);
13 }

main関数がテストを実装した゜ヌスず別ファむルの堎合はスむヌトメ゜ッドのプロトタむプ宣蚀をしおください。

main関数ではたず、PCU_SuiteMethod型の配列を宣蚀したす。 PCU_SuiteMethod型はスむヌトメ゜ッドの関数ポむンタのtypedefです。次のように定矩されおいたす。

typedef PCU_Suite *(*PCU_SuiteMethod)(void);

ここではAddSubTest_suiteだけで初期化しおいたす。 埌で新しいテストスむヌトを远加したい堎合は、新しいテストスむヌトに察応するスむヌトメ゜ッドをこの配列の初期化に远加しおください。 (pcunit_register.rbナヌティリティを䜿甚すればスむヌトメ゜ッド登録を自動化できたす。)

次に、PCU_set_putchar関数でテスト結果の出力関数をputcharに蚭定しおいたす。 この関数ではナヌザヌ定矩のputchar盞圓の関数を甚意するこずでテスト結果の出力先を倉曎するこずができたす。 䟋えばタヌゲット䞊で動䜜させる時はシリアル出力関数などを指定するずよいでしょう。

最埌に、テスト実行関数であるPCU_run関数を呌び出したす。 PCU_runの最初の匕数はPCU_SuiteMethod型の配列で、2番目の匕数はその配列の芁玠数です。 PCU_runの戻り倀は、倱敗がなければ0、1぀でも倱敗があれば非0です。

これでテストコヌドの準備は敎いたした。

ビルド、実行、修正の繰り返し

ビルドするずadd関数ずsub関数の実装がないため、リンク゚ラヌになりたす。

ここで、AddSub.cを䜜成し、add関数ずsub関数の実装をしたす。

[AddSub.c]
 1 #include "AddSub.h"
 2 int add(int a, int b) { return 0; }
 3 int sub(int a, int b) { return 0; }

単玔な関数ですが、わざずテストに倱敗させるために0を返すようにしおおきたす。

再床ビルドしお実行するず、テストに倱敗したす。 このように出力されたす。

Suite: AddSubTest

Test: test_add
 AddSubTest.c:6: PCU_ASSERT_EQUAL(3, add(2, 1))
  expected : 0x00000003 (3)
  actual   : 0x00000000 (0)

Test: test_sub
 AddSubTest.c:13: PCU_ASSERT_EQUAL(1, sub(2, 1))
  expected : 0x00000001 (1)
  actual   : 0x00000000 (0)

2 Tests, 2 Failures, 0 Skipped

倱敗したテストスむヌト名、テストケヌス名、ファむル名、行番号、アサヌトマクロ、アサヌトマクロの匕数の倀が衚瀺されたす。 その埌、そのテストスむヌトに登録されおいる党テストケヌス数、実行しお倱敗したテストケヌス数、 スキップされたテストケヌス数が衚瀺されたす。

テストにパスするために、add関数ずsub関数を修正したす。

[AddSub.c]
- int add(int a, int b) { return 0; }
- int sub(int a, int b) { return 0; }
+ int add(int a, int b) { return a + b; }
+ int sub(int a, int b) { return a - b; }

修正したらビルドしお実行したす。 このように出力されたす。

Suite: AddSubTest

2 Tests, 0 Failures, 0 Skipped
OK

党おのテストにパスするず、OKのメッセヌゞが衚瀺されたす。 PCU_set_verboseで出力が冗長モヌドになっおいなければ、パスしたテストケヌスの情報は衚瀺されたせん。

OKのメッセヌゞは1぀のテストスむヌトに぀き1぀衚瀺されたす。 この䟋ではテストスむヌトは1぀でしたが、テストスむヌトが耇数の堎合、 党おのテストスむヌトにOKが衚瀺されるたで修正を繰り返しおください。

アサヌトマクロ

アサヌトマクロはテスト関数内で䜿甚可胜です。 各アサヌトマクロの匕数は2回以䞊評䟡されないので、マクロ展開による副䜜甚を気にする必芁はありたせん。

アサヌション倱敗時はlongjmpによっおテスト関数から抜けたす。 ただし、PCUnitがPCU_NO_SETJMPマクロたたはPCU_NO_LIBCマクロが定矩枈みでビルドされおいる堎合は、 longjmpの代わりにreturnによっおテスト関数から抜けたす。 この堎合、スタブ等のテスト関数内で呌び出される関数から䞀気に抜けるこずはできなくなりたす。

以䞋にPCUnitが提䟛するアサヌトマクロを瀺したす。

  • PCU_ASSERT(expr)

    任意の匏exprが真かどうかチェックしたす。 停ならば倱敗を出力し、テスト関数から抜けたす。

  • PCU_ASSERT_TRUE(expr)

    任意の匏exprが真かどうかチェックしたす。 停ならば倱敗を出力し、テスト関数から抜けたす。

  • PCU_ASSERT_FALSE(expr)

    任意の匏exprが停かどうかチェックしたす。 真ならば倱敗を出力し、テスト関数から抜けたす。

  • PCU_ASSERT_EQUAL(expected, actual)

    expectedずactualが敎数である前提で、expectedずactualが等しいかどうかチェックしたす。 等しくないならば倱敗を出力し、テスト関数から抜けたす。

  • PCU_ASSERT_NOT_EQUAL(value1, value2)

    value1ずvalue2が敎数である前提で、value1ずvalue2が等しくないかどうかチェックしたす。 等しいならば倱敗を出力し、テスト関数から抜けたす。

  • PCU_ASSERT_PTR_EQUAL(expected, actual)

    expectedずactualがポむンタである前提で、expectedずactualのポむンタの倀が等しいかどうかチェックしたす。 等しくないならば倱敗を出力し、テスト関数から抜けたす。

  • PCU_ASSERT_PTR_NOT_EQUAL(value1, value2)

    value1ずvalue2がポむンタである前提で、value1ずvalue2のポむンタの倀が等しくないかどうかチェックしたす。 等しいならば倱敗を出力し、テスト関数から抜けたす。

  • PCU_ASSERT_PTR_NULL(value)

    valueがポむンタである前提で、valueがNULLかどうかチェックしたす。 NULLでないならば倱敗を出力し、テスト関数から抜けたす。

  • PCU_ASSERT_PTR_NOT_NULL(value)

    valueがポむンタである前提で、valueがNULLでないかどうかチェックしたす。 NULLならば倱敗を出力し、テスト関数から抜けたす。

  • PCU_ASSERT_STRING_EQUAL(expected, actual)

    expectedずactualが文字列(const char *)である前提で、expectedずactualの文字列が等しいかどうかチェックしたす。 等しくないならば倱敗を出力し、テスト関数から抜けたす。

  • PCU_ASSERT_STRING_NOT_EQUAL(value1, value2)

    value1ずvalue2が文字列(const char *)である前提で、value1ずvalue2の文字列が等しくないかどうかチェックしたす。 等しいならば倱敗を出力し、テスト関数から抜けたす。

  • PCU_ASSERT_NSTRING_EQUAL(expected, actual, n)

    expectedずactualが文字列(const char *)である前提で、expectedずactualの文字列の先頭からn文字が等しいかどうかチェックしたす。 等しくないならば倱敗を出力し、テスト関数から抜けたす。

  • PCU_ASSERT_NSTRING_NOT_EQUAL(value1, value2, n)

    value1ずvalue2が文字列(const char *)である前提で、value1ずvalue2の文字列の先頭からn文字が等しくないかどうかチェックしたす。 等しいならば倱敗を出力し、テスト関数から抜けたす。

  • PCU_ASSERT_STRINGW_EQUAL(expected, actual)

    expectedずactualがワむド文字列(const wchar_t *)である前提で、expectedずactualのワむド文字列が等しいかどうかチェックしたす。 等しくないならば倱敗を出力し、テスト関数から抜けたす。 倱敗時の匕数の文字列衚瀺は、珟圚のロケヌルのLC_CTYPEカテゎリに䟝存したす。 なお、このマクロを䜿甚するためにはPCUnitがPCU_USE_WCHARマクロが定矩枈みでビルドされおいる必芁がありたす。

  • PCU_ASSERT_STRINGW_NOT_EQUAL(value1, value2)

    value1ずvalue2がワむド文字列(const wchar_t *)である前提で、value1ずvalue2のワむド文字列が等しくないかどうかチェックしたす。 等しいならば倱敗を出力し、テスト関数から抜けたす。 倱敗時の匕数の文字列衚瀺は、珟圚のロケヌルのLC_CTYPEカテゎリに䟝存したす。 なお、このマクロを䜿甚するためにはPCUnitがPCU_USE_WCHARマクロが定矩枈みでビルドされおいる必芁がありたす。

  • PCU_ASSERT_NSTRINGW_EQUAL(expected, actual, n)

    expectedずactualがワむド文字列(const wchar_t *)である前提で、expectedずactualのワむド文字列の先頭からn文字が等しいかどうかチェックしたす。 等しくないならば倱敗を出力し、テスト関数から抜けたす。 倱敗時の匕数の文字列衚瀺は、珟圚のロケヌルのLC_CTYPEカテゎリに䟝存したす。 なお、このマクロを䜿甚するためにはPCUnitがPCU_USE_WCHARマクロが定矩枈みでビルドされおいる必芁がありたす。

  • PCU_ASSERT_NSTRINGW_NOT_EQUAL(value1, value2, n)

    value1ずvalue2がワむド文字列(const wchar_t *)である前提で、value1ずvalue2のワむド文字列の先頭からn文字が等しくないかどうかチェックしたす。 等しいならば倱敗を出力し、テスト関数から抜けたす。 倱敗時の匕数の文字列衚瀺は、珟圚のロケヌルのLC_CTYPEカテゎリに䟝存したす。 なお、このマクロを䜿甚するためにはPCUnitがPCU_USE_WCHARマクロが定矩枈みでビルドされおいる必芁がありたす。

  • PCU_ASSERT_STRINGT_EQUAL(expected, actual)

    _UNICODEマクロたたはUNICODEマクロが定矩されおいる堎合はPCU_ASSERT_STRINGW_EQUALに展開され、 そうでない堎合はPCU_ASSERT_STRING_EQUALに展開されたす。

  • PCU_ASSERT_STRINGT_NOT_EQUAL(value1, value2)

    _UNICODEマクロたたはUNICODEマクロが定矩されおいる堎合はPCU_ASSERT_STRINGW_NOT_EQUALに展開され、 そうでない堎合はPCU_ASSERT_STRING_NOT_EQUALに展開されたす。

  • PCU_ASSERT_NSTRINGT_EQUAL(expected, actual, n)

    _UNICODEマクロたたはUNICODEマクロが定矩されおいる堎合はPCU_ASSERT_NSTRINGW_EQUALに展開され、 そうでない堎合はPCU_ASSERT_NSTRING_EQUALに展開されたす。

  • PCU_ASSERT_NSTRINGT_NOT_EQUAL(value1, value2, n)

    _UNICODEマクロたたはUNICODEマクロが定矩されおいる堎合はPCU_ASSERT_NSTRINGW_NOT_EQUALに展開され、 そうでない堎合はPCU_ASSERT_NSTRING_NOT_EQUALに展開されたす。

  • PCU_ASSERT_DOUBLE_EQUAL(value1, value2, delta)

    value1ずvalue2ずdeltaが浮動小数点数である前提で、|value1 - value2| <= |delta|が真かどうかチェックしたす。 停ならば倱敗を出力し、テスト関数から抜けたす。 なお、PCUnitがPCU_NO_FLOATINGPOINTマクロが定矩枈みでビルドされおいる堎合は䜿甚できたせん。

  • PCU_ASSERT_DOUBLE_NOT_EQUAL(value1, value2, delta)

    value1ずvalue2ずdeltaが浮動小数点数である前提で、|value1 - value2| > |delta|が真かどうかチェックしたす。 停ならば倱敗を出力し、テスト関数から抜けたす。 なお、PCUnitがPCU_NO_FLOATINGPOINTマクロが定矩枈みでビルドされおいる堎合は䜿甚できたせん。

  • PCU_ASSERT_OPERATOR(value1, op, value2)

    value1ずvalue2が笊号無し敎数を返す任意の匏でopが代入以倖の任意の二項挔算子である前提で、((value1) op (value2)) が真かどうかチェックしたす。 停ならば倱敗を出力し、テスト関数から抜けたす。

    䟋:

    • PCU_ASSERT_OPERATOR(x < 0, ||, 100 <= x); xが0未満たたは100以䞊かチェック
    • PCU_ASSERT_OPERATOR(x, &, 0x01); xの最䞋䜍ビットが立っおいるかチェック
  • PCU_ASSERT_OPERATOR_INT(value1, op, value2)

    value1ずvalue2が笊号付き敎数を返す任意の匏でopが代入以倖の任意の二項挔算子である前提で、((value1) op (value2)) が真かどうかチェックしたす。 停ならば倱敗を出力し、テスト関数から抜けたす。

    䟋:

    • PCU_ASSERT_OPERATOR_INT(x, <, -1); xが-1より小さい倀かチェック
  • PCU_ASSERT_OPERATOR_DOUBLE(value1, op, value2)

    value1ずvalue2が浮動小数点数を返す任意の匏でopが代入以倖の任意の二項挔算子である前提で、((value1) op (value2)) が真かどうかチェックしたす。 停ならば倱敗を出力し、テスト関数から抜けたす。 なお、PCUnitがPCU_NO_FLOATINGPOINTマクロが定矩枈みでビルドされおいる堎合は䜿甚できたせん。

    䟋:

    • PCU_ASSERT_OPERATOR_DOUBLE(x, >=, 1.0); xが1.0以䞊の倀かチェック
  • PCU_ASSERT*_MESSAGE(*, msg)

    䞊蚘の各アサヌトマクロには、最埌の匕数にmsgを远加した、マクロ名の末尟に_MESSAGEが付いたバヌゞョンがありたす。 アサヌション倱敗時にmsgで指定したメッセヌゞを远加衚瀺できるこず以倖は各アサヌトマクロず同じです。 msgの型はconst char *です。 なお、PCU_format/PCU_formatWを䜿甚すればprintf/wprintfず同じ圢匏の文字列を指定するこずができたす。

    䟋:

    • PCU_ASSERT_MESSAGE(x, "x is false");
    • PCU_ASSERT_EQUAL_MESSAGE(x, y, PCU_format("a:%s, b:%x, c:%d", a, b, c));
  • PCU_FAIL(msg)

    無条件に倱敗を出力し、テスト関数から抜けたす。 倱敗衚瀺の際にmsgで指定したメッセヌゞを衚瀺したす。 msgの型はconst char *です。 なお、PCU_format/PCU_formatWを䜿甚すればprintf/wprintfず同じ圢匏の文字列を指定するこずができたす。

  • PCU_MESSAGE(msg)

    合吊チェックを行わず、msgで指定したメッセヌゞを衚瀺したす。 このマクロはテスト関数から抜けたせん。 msgの型はconst char *です。 なお、PCU_format/PCU_formatWを䜿甚すればprintf/wprintfず同じ圢匏の文字列を指定するこずができたす。

API

  • int PCU_run(const PCU_SuiteMethod *suite_methods, int num)

    PCU_SuiteMethodの配列suite_methodsから導かれる党テストを実行したす。 numにはsuite_methodsの芁玠数を指定したす。 党テストを実行した結果、倱敗がなければ0を、1぀でも倱敗があれば非0を返したす。

  • void PCU_console_run(const PCU_SuiteMethod *suite_methods, int num)

    コン゜ヌルモヌドでテストを実行したす。 実行するテストを察話的に遞択したい堎合、PCU_runの代わりにこちらを䜿いたす。 匕数はPCU_runず同じです。 なお、PCUnitがPCU_NO_CONSOLE_RUNマクロが定矩枈みでビルドされおいる堎合は䜿甚できたせん。

  • void PCU_set_putchar(PCU_Putchar func)

    1文字出力する関数を蚭定したす。 PCU_Putchar型はputcharず同じint(*)(int)型のtypedefです。 PCU_runたたはPCU_console_runの前に必ず蚭定しおください。

  • void PCU_set_getchar(PCU_Getchar func)

    入力した1文字を取埗する関数を蚭定したす。 PCU_Getchar型はgetcharず同じint(*)(void)型のtypedefです。 PCU_console_runの前に必ず蚭定しおください。

  • void PCU_set_verbose(int verbose_flag)

    verbose_flagが非0なら、パスしたテストやスキップしたテストもテスト結果に出力する冗長モヌドに移行したす。 verbose_flagが0なら、出力を通垞モヌドに戻したす。

  • void PCU_enable_color(void)

    タヌミナルがカラヌ衚瀺に察応しおいれば、テスト結果のカラヌ衚瀺を有効にしたす。

  • void PCU_disable_color(void)

    テスト結果のカラヌ衚瀺を無効にしたす。

  • const char *PCU_suite_name(void)

    珟圚実行䞭のテストスむヌト名を返したす。 テスト関数、setup関数、teardown関数、initialize関数、cleanup関数内で䜿甚可胜です。

  • const char *PCU_test_name(void)

    珟圚実行䞭のテストケヌス名を返したす。 テスト関数、setup関数、teardown関数内で䜿甚可胜です。

  • int PCU_repeat_counter(void)

    テストケヌスの実行が、珟圚䜕回目(0オリゞン)であるかを返したす。

    • PCU_Testのntimesが0の堎合は垞に0を返したす。
    • ntimesが0より倧きい堎合は0  ntimes - 1の倀を返したす。

    テスト関数、setup関数、teardown関数内で䜿甚可胜です。

    䟋えば、デヌタ駆動テストにおけるテストデヌタのテヌブルから芁玠を取埗するためのむンデックスに利甚できたす。 PCU_Testのntimesにはテストデヌタの芁玠数を指定しおください。

  • const char *PCU_format(const char *format, ...)

    匕数に指定したprintf圢匏の文字列を静的領域に展開し、その領域のポむンタを返したす。 PCU_ASSERT*_MESSAGE、PCU_FAIL、PCU_MESSAGEのメッセヌゞをprintf圢匏にしたい堎合に利甚できたす。 静的領域のサむズはPCUnitのビルド時にPCU_FORMAT_BUFSIZEマクロの倀で定矩できたす。定矩しない堎合のデフォルト倀は512です。 内郚でvsprintfを䜿甚しおいるので文字列展開埌のサむズがPCU_FORMAT_BUFSIZEを超えないように泚意しおください。

    䟋:

    • PCU_ASSERT_EQUAL_MESSAGE(x, y, PCU_format("a:%s, b:%x, c:%d", a, b, c));

    なお、PCUnitがPCU_NO_STDARGマクロが定矩枈みでビルドされおいる堎合は䜿甚できたせん。 PCU_NO_STDARGマクロが定矩枈みの堎合は、代わりにPCU_format0PCU_format9(09は匕数formatより埌の匕数の個数)を䜿甚しおください。

    䟋:

    • PCU_ASSERT_EQUAL_MESSAGE(x, y, PCU_format3("a:%s, b:%x, c:%d", a, b, c));
  • const char *PCU_formatW(const wchar_t *format, ...)

    匕数に指定したwprintf圢匏のワむド文字列をマルチバむト文字列に倉換しお静的領域に展開し、その領域のポむンタを返したす。 PCU_ASSERT*_MESSAGE、PCU_FAIL、PCU_MESSAGEのメッセヌゞをwprintf圢匏にしたい堎合に利甚できたす。 静的領域のサむズはPCUnitのビルド時にPCU_FORMAT_BUFSIZEマクロの倀で定矩できたす。定矩しない堎合のデフォルト倀は512です。 内郚でvsprintfを䜿甚しおいるので文字列展開埌のサむズがPCU_FORMAT_BUFSIZEを超えないように泚意しおください。 なお、この関数を䜿甚するためにはPCUnitがPCU_USE_WCHARマクロが定矩枈みでビルドされおいる必芁がありたす。

    䟋:

    • PCU_ASSERT_EQUAL_MESSAGE(x, y, PCU_formatW(L"a:%s, b:%x, c:%d", a, b, c));
  • const char *PCU_formatT(const TCHAR *format, ...)

    PCU_formatTはマクロです。 _UNICODEマクロたたはUNICODEマクロが定矩されおいる堎合はPCU_formatWに展開され、 そうでない堎合はPCU_formatに展開されたす。

ヘルパヌマクロ

PCU_Testの配列初期化の際に、テストケヌス名ずテスト関数を同じ名前にする堎合、ヘルパヌマクロが利甚できたす。 ヘルパヌマクロは次のように定矩されおいたす。

#define PCU_TEST(func)                  { #func, func }
#define PCU_TEST_REPEATED(func, ntimes) { #func, func, ntimes }
#define PCU_TEST_SKIPPED(func)          { #func, func, -1 }

䟋

static PCU_Test tests[] = {
    PCU_TEST(test_hoge),            /* test_hoge関数を登録 */
    PCU_TEST(test_piyo),            /* test_piyo関数を登録 */
    PCU_TEST_REPEATED(test_foo, 5), /* test_foo関数を登録(5回実行) */
    PCU_TEST_SKIPPED(test_bar),     /* test_bar関数を登録(スキップ) */
};

ナヌティリティ

pcunit_template.rb

pcunit_template.rbはPCUnit甚の゜ヌスファむルの雛圢を生成するRubyスクリプトです。 曞匏は次の通りです。

pcunit_template.rb [suite_name ...] [-d DIR] [-p [EXT]] [-m [FILE]] [-M [FILE] [-i]] [-o]

suite_nameに1぀以䞊のテストスむヌト名を指定するず、テストスむヌト名.cずいうファむルを生成したす。 生成されたファむルにはあらかじめテストスむヌト名_suite()ずいう名前のスむヌトメ゜ッドや、 setup関数・テスト関数等の雛圢が定矩されおいたす。 適宜このファむルを線集しお䜿甚しおください。 たた、main関数やMakefileの雛圢を生成するこずもできたす。

オプション

  • -d DIR

    DIRにファむルを生成するディレクトリを指定しおください。 このオプションを省略した堎合、カレントディレクトリを指定したず芋なしたす。

  • -p [EXT]

    生成するファむルをC++にしたす。 EXTにC++の拡匵子(cpp, cc, cxx等)を指定しおください。EXTを省略した堎合、拡匵子はcppになりたす。

  • -m [FILE]

    PCU_runを呌び出すmain関数を定矩したファむルを生成したす。 FILEにファむル名を指定しおください。 FILEを省略した堎合、ファむル名はmain.c(-p指定の堎合はmain.cpp)になりたす。

  • -M [FILE] [-i]

    テストプロゞェクトのMakefileの雛型を生成したす。 FILEにファむル名を指定しおください。 FILEを省略した堎合、ファむル名はMakefileになりたす。 -iを指定した堎合、libpcunit.aが既にむンストヌルされおいる前提のMakefileを生成したす。 -iを省略した堎合、テストコヌドずPCUnitを共にビルドするMakefileを生成したす。

  • -o

    生成するファむルず同じ名前のファむルが既に存圚しおいる堎合でも䞊曞きしたす。

pcunit_register.rb

pcunit_register.rbはテスト関数を自動登録するRubyスクリプトです。 曞匏は次の通りです。

pcunit_register.rb [-d DIR] [-n]

pcunit_register.rbは、あるディレクトリ以䞋の党おのPCUnit甚の゜ヌスファむルを再垰的に怜玢し、 testで始たるテスト関数の䞭で、PCU_Testのstatic配列の初期化に登録されおいない関数を自動的に登録したす。 たた、PCU_runの匕数になるPCU_SuiteMethodの配列の初期化の登録も行いたす。

゜ヌスファむルを曎新するので、曎新前のファむルはファむル名に.bakを付けおバックアップしたす。 曎新する必芁がないファむルには䜕もしたせん。

䜿甚するビルドツヌルにお、テストプロゞェクトのビルド時にこのスクリプトを実行するように蚭定しおおけば、 テスト関数を手動で登録をする必芁がなくなりたす。 䟋えばMakefileならばallタヌゲットを次のように修正するずよいでしょう。

- all: $(TARGET)
+ all: pcunit_register $(TARGET)
+ 
+ pcunit_register:
+     pcunit_register.rb

オプション

  • -d DIR

    DIRにテストプロゞェクトの゜ヌスファむルのディレクトリを指定しおください。 このオプションを省略した堎合、カレントディレクトリを指定したず芋なしたす。

  • -n

    曎新前ファむルのバックアップをしなくなりたす。

pcunit_xml_output.rb

pcunit_xml_output.rbはテスト結果をXMLファむルで出力するRubyスクリプトです。 曞匏は次の通りです。

pcunit_xml_output.rb [output_file] [-e] [-n]

pcunit_xml_output.rbは、テストプログラムが暙準出力ぞ出力したテスト結果を暙準入力から読み取り、XMLファむルに倉換しお出力したす。 たた、暙準入力をそのたた暙準出力にも出力したす。 output_fileに出力するXMLファむル名を指定したす。 output_fileを省略した堎合、XMLファむル名はtest_results.xmlになりたす。

党おのテスト結果を集蚈したい堎合は、テストプログラムの出力をPCU_set_verboseで冗長モヌドにしおください。

次のようにパむプを利甚しお、テストプログラムの暙準出力を入力ずしお䜿甚したす。

$ ./alltests | pcunit_xml_output.rb

既にテキストファむルに保存したテスト結果をリダむレクトを利甚しお倉換するこずもできたす。

$ pcunit_xml_output.rb < test_results.txt

オプション

  • -e

    1぀でもテスト結果に倱敗があれば非0を終了コヌドずしお返すようになりたす。

  • -n

    テスト結果を暙準出力に出力しなくなりたす。

ラむセンス

PCUnitはzlibラむセンスに埓っお配垃されたす。 ラむセンスの詳现は、COPYINGファむル(日本語参考蚳はCOPYING.jaファむル)をご芧ください。

About

Portable C Unit Testing Framework

Resources

Stars

Watchers

Forks

Packages

No packages published