Cmocka: контекст печати при сбое теста - PullRequest
0 голосов
/ 22 апреля 2020

Я использую 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?

...