Я использую CMocka для написания некоторых модульных тестов. Некоторые из моих тестов oop, хотя список случаев, которые хранятся в структуре, чтобы избежать повторения:
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
для хранения сообщений, если мне нужно, однако я не вижу, как я могу подключиться к утверждению fail , чтобы напечатать это сообщение пользователю.
Бывает, что если вы знаете, что во время разрыва тесты не пройдены, вы можете реализовать стек строк с state
, pu sh и всплыть во время выполнения и распечатать их, если произошел сбой, но на самом деле я могу ' я не вижу, что обратный вызов прерывания имеет какое-либо представление о состоянии теста / не пройден.
Возможно ли это в CMocka?