私は CMokka を使用していくつかの単体テストを作成しています。私のテストのいくつかは、繰り返しを避けるために構造体に格納されているケースのリストをループします:
typedef struct {
char* test_arg;
int expected;
} TestCase;
const static TestCase cases[] = {
{"1", 1}, {"2", 1},
{0}
};
void test_the_cases(void **state)
{
for (const TestCase* case = cases; case->test_arg != NULL; case++)
{
int got_result = atoi(case->test_arg);
// Check the result matches
// If this fails, this line is where the assertion is
assert_int_equal(c->expected, got_result);
}
}
これは機能します:
[==========] tests: Running 1 test(s).
[ RUN ] test_the_cases
[ ERROR ] --- 0x1 != 0x2
[ LINE ] --- <file>.c:64: error: Failure!
[ FAILED ] test_the_cases
[==========] tests: 1 test(s) run.
[ PASSED ] 0 test(s).
[ FAILED ] tests: 1 test(s), listed below:
[ FAILED ] test_the_cases
1 FAILED TEST(S)
ただし、アサーションは単純に 64 行目 ( assert_int_equal(...)
) であり、この場合、失敗したケースは明らかです。ただし、常にそうとは限りません。おそらく、失敗はケースに直接表示されない番号であるか、ケース間で共有されているため、ERROR
とからはLINE
どれTestCase
が失敗したかわかりません。テストに何千行ものスパムが含まれるわけではありませんprintf()
が、何が失敗したかを確認するためにデバッグ レベルを上げてテストを再実行する必要もありません。
Boost Test を使用すると、メッセージまたはコンテキスト ( docs ) を使用してこれを実行し、失敗時に便利なメッセージを出力できます (RAII スコープなどの優れたものを含みますが、これは C++ であるためです)。Cmocka には、必要に応じてメッセージを格納するパラメーターがありますが、アサーションの失敗にフックしてそのメッセージをユーザーに出力state
する方法がわかりません。
ティアダウン中にテストが失敗したかどうかがわかっている場合、state
実行中に 、 push 、 pop を使用して文字列のスタックを実装し、失敗が発生した場合はそれらを出力できますが、そのままでは、ティアダウン コールバックに何らかのアイデアがあることがわかりません。テストの合格/不合格ステータスの。
これはCMockaで可能ですか?