Cmocka:测试失败时打印上下文

Cmocka:测试失败时打印上下文,c,unit-testing,cmocka,C,Unit Testing,Cmocka,我正在使用CMocka编写一些单元测试。我的一些测试循环使用存储在结构中的案例列表,以避免重复: 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 =

我正在使用CMocka编写一些单元测试。我的一些测试循环使用存储在结构中的案例列表,以避免重复:

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)
[===============]测试:运行1个测试。
[运行]测试案例
[错误]--0x1!=0x2
[LINE]--.c:64:错误:失败!
[失败]测试案例
[============]测试:运行1个测试。
[通过]0个测试。
[失败]测试:1个测试,如下所示:
[失败]测试案例
1个测试失败
但是,断言只是在第64行(
assert_int_equal(…)
),在本例中,失败的情况很明显。但是,它并不总是-可能故障是一个不直接出现在案例中的数字,或者是案例之间共享的数字,这意味着您无法从
错误和
行中分辨出哪个
TestCase
故障。我真的不想
printf()
每种情况,否则测试中会有数千行垃圾邮件,但我也不想在提高调试级别的情况下重新运行测试,以查看失败的内容

使用Boost测试,我可以使用消息或上下文()来完成这一操作,并在失败时打印一个方便的消息(包括RaIII范围之类的好东西,但它是C++,所以这就是原因)。在Cmocka中,如果需要,我可以使用

state
参数来存储消息,但是,我不知道如何连接到断言失败中,以便将消息打印给用户

如果您知道测试在拆卸过程中是否失败,您可以实现一个具有
状态的字符串堆栈,在执行过程中推送和弹出,并在发生故障时打印这些字符串,但实际上,我看不出拆卸回调对测试通过/失败状态有任何了解

这在CMocka中可能吗