1

私は 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で可能ですか?

4

0 に答える 0