The Embedded system Unit Testing Framework V0.1
あえて組み込み環境でテストする目的で昔作ったやつ。 そのうち役に立つかもしれないからGithubに残しとく。
組み込み環境(C言語)で使用することを目的としたxUnitのようなものです。
cUnitのようなテストを意識して作成しています。
テストプログラムは、tesut.hをインクルードすることによって使用可能となります。
ターゲットのソース+テストプログラム+tesut.cと一緒にコンパイルして使用します。
簡単な使用方法は"how_to_use.c"を参考にしてください。
- テストを作成します。引数/戻り値がともにvoidの関数を用意します。
- 作成したテスト関数内に被テストであるプログラムの関数を呼び出します。
- 呼び出した機能が多目的通りに動いたことをアサート文を使用して呼び出します。
- 2-3を繰り返し、テストが完了したら関数をreturnします。
アサート分は、tesut.hに定義されています。
一番簡単なテストの作成例
void test01(void)
{
int a, b, c;
a = 5;
b = 8;
c = sum(a, b); /* Test Function */
TESU_ASSERT_EQUAL(c, 13); /* Assert c == 13? */
return; /* completed test */
}
アサート文は一つのテストに対して、複数個作成することができます。
テスト関数内で、スイートの実行、テストリストの書き換え、初期化処理を行わないでください。
呼び出した場合、動作は不定となり、正常な結果が出力されません。
作成したテストは、テストリストにまとめます。
このリストが、そのままテストスイートの実行に渡されます。
- 1列目 --- テスト関数を定義します。
- 2列目 --- テスト名を定義します。
- 3列目 --- テスト失敗時にその後のテストを実行するかを選択します。 (TESU_NO_FATAL:テスト失敗時も続けて実行する。/TESU_FATAL:テスト失敗時、その後のテストを実行しない。)
- 4列目 --- 登録の最後には必ずTESU_INFO_NULLを記載してください。
TESU_TEST Suite0[] = {
{sum_all_test00, "SUM_ALL_TEST00", TESU_NO_FATAL},
{sum_all_test01, "SUM_ALL_TEST01", TESU_NO_FATAL},
{sum_all_test02, "SUM_ALL_TEST02", TESU_NO_FATAL},
TESU_TEST_INFO_NULL
};
下記コードでテストスイート0が実行されます。
TESU_Start_Suite(Suite0, setup, tear_down, "Suite0");
- 引数1 : 「テストスイートの作成」で作成したテストのリスト
- 引数2 : テスト関数の実行前に実行される準備関数。(不要な場合はNULL)
- 引数3 : テスト終了後、最後に実行される関数(不要な場合はNULL)
- 引数4 : テストスイートの名前
本プログラム単体では、テストスイートを実行した場合には、
テスト/アサートの実行した数、成功した数、失敗した数のカウントを行う動作しかしません。
多くのxUnitが持っているxml出力、コンソール表示といった機能は何一つありません。
そのため、機能追加のための3つのハンドラ機能があります。
- アサートハンドラ
- テストハンドラ
- スイートハンドラ
これらの関数を使用することでメッセージをUARTで出力させるといったことができます。 これらの関数はそれぞれの機能の処理が終了した時に呼びだされます。
ハンドラの関数は、下記のように作成してください
void <HANDLER_NAME> (const TESU_HANDLER_ARGS *args)
{
/* ハンドラ処理 */
}
ハンドラの登録は、下記の関数を使用してください。
引数は、ハンドラの関数です。
TESU_Set_User_Suite_Handler(HANDLER_Suite);
TESU_Set_User_Test_Handler(HANDLER_Test);
TESU_Set_User_Assert_Handler(HANDLER_Assert);
ハンドラ関数内でアサート文、スイートの実行、テストリストの書き換え、初期化処理を行わないでください。
呼び出した場合、動作は不定となり、正常な結果が出力されません。
tesut.hに定義されているTESU_USE_LONGJMPをコメントアウトすることによって、setjmp/longjmpを使用しない環境に対応できます。
ただし、下記の制限事項があります。
・アサート文は、テスト関数内のみで呼び出してください。テスト関数から呼び出される他の関数からアサート文を呼び出すと、正常に動作しません。
zlibライセンス