我正在使用 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)
然而,断言只是在第 64 行(assert_int_equal(...)
),在这种情况下,失败的情况很明显。但是,并非总是如此 - 也许失败是一个没有直接出现在案例中的数字,或者是在案例之间共享的,这意味着您无法分辨出ERROR
哪个LINE
失败TestCase
了。我真的不希望printf()
每一种情况都如此,否则测试中会有数千行垃圾邮件,但我也不想在提高调试级别的情况下重新运行测试以查看失败的原因。
使用 Boost Test,我可以使用消息或上下文 ( docs ) 来执行此操作并在失败时打印一条方便的消息(包括 RAII 范围之类的好东西,但它是 C++,所以这就是原因)。在 Cmocka中,state
如果需要,我有存储消息的参数,但是,我看不到如何挂钩断言失败以将该消息打印给用户。
state
如果您知道测试是否在拆卸期间失败,您可以在执行期间使用 、push 和 pop实现一堆字符串,并在发生失败时打印它们,但事实上,我看不出拆卸回调有任何想法测试通过/失败状态。
这在 CMocka 中可能吗?