Как получить отчет CMocka в формате JUnit?

Я могу использовать cmocka и получать результаты по умолчанию на экране. Я хочу получить результаты модульного теста в формате JUnit.

CMocka поддерживает формат JUnit с помощью переменной env CMOCKA_MESSAGE_OUTPUT или используя API cmocka_set_message_output(CM_OUTPUT_XML);

Но по-прежнему не генерируется XML-файл. Кто-нибудь может помочь в получении результатов в формате JUnit?

3

Решение

Самый достоверный источник на самом деле cmocka.c исходный файл, который содержит всю реализацию фреймворка. Этот файл не слишком большой, поэтому я приведу кое-что из исходного файла версии 1.0.1.

Существует два условия для генерации вывода XML с помощью cmocka, а третье условие необходимо для сохранения вывода в файле.

1. Вывод XML может быть сгенерирован, только если тесты вызываются cmocka_run_group_tests()

Настраиваемый формат вывода можно получить только у бегуна cmocka_run_group_tests() или из его полного варианта cmocka_run_group_tests_name(),

Нет другого маршрута, который может привести к выводу XML. Если одиночный тест начат run_test() вывод не может быть XML.

Сводный формат

[  PASSED  ] 0 test(s).
[  FAILED  ] 1 test(s), listed below:

может быть сгенерирован в одном из следующих возможных случаев:

  • тест запускается одним из устаревших участников теста: run_tests(), _run_tests() или же run_group_tests(), _run_group_tests(); в этом случае даже можно увидеть предупреждение компиляции об использовании устаревшей функции;
  • тест начинается cmocka_run_group_tests() и выходной формат CM_OUTPUT_STDOUT,

2. Вывод сообщения cmocka должен быть установлен на CM_OUTPUT_XML

Формат вывода по умолчанию может быть установлен путем вызова cmocka_set_message_output(CM_OUTPUT_XML) перед запуском тестов. Тем не менее, даже если в исходном коде задано такое значение по умолчанию, оно может быть перезаписано переменной среды CMOCKA_MESSAGE_OUTPUT, Эта переменная имеет более высокий приоритет, чем установленная по умолчанию cmocka_set_message_output(),

Значение CMOCKA_MESSAGE_OUTPUT является без учета регистра. Переменная учитывается, если она равна одному из следующих значений: stdout, subunit, tab или же xml,

Итак, если переменная окружения имеет значение stdout функция mocka_set_message_output() не имеет никакого эффекта

Эта переменная может использоваться для принудительного использования различных форматов вывода уже скомпилированного двоичного файла:

CMOCKA_MESSAGE_OUTPUT=stdout ./nulltest
CMOCKA_MESSAGE_OUTPUT=subunit ./nulltest
CMOCKA_MESSAGE_OUTPUT=tap ./nulltest
CMOCKA_MESSAGE_OUTPUT=xml ./nulltest

Таким образом, если тест запущен cmocka_run_group_tests() но на выход не влияет mocka_set_message_output() это значит, что есть заданная переменная CMOCKA_MESSAGE_OUTPUT=stdout в оболочке.

3. Должна быть возможность создать новый файл с помощью cmocka, чтобы записать его вывод XML непосредственно в этот файл.

Если оба предыдущих условия выполнены, можно попросить cmocka записать свои выходные данные XML непосредственно в файл. Если переменная среды CMOCKA_XML_FILE устанавливается, тогда cmocka попытается записать XML в файл с именем значения этой переменной.

Пример использования:

CMOCKA_XML_FILE='./out.xml' CMOCKA_MESSAGE_OUTPUT=xml ./nulltest

Файл пишется, если:

  • файл с таким именем не существует;
  • такой файл может быть создан.

Таким образом, если в одном скомпилированном двоичном тестовом приложении имеется более одного участника теста, только первый участник может записать свой вывод в этот файл.

Вывод записывается в оболочку, даже если CMOCKA_XML_FILE установлен, но файл уже существует или не может быть создан.

Конечно, можно просто перенаправить вывод оболочки в файл, перезаписав существующий файл или добавив его в существующий файл, если такой файл существует.

Пример ниже может использоваться для проверки различных вариантов вывода. Это может быть построено командой

gcc -g nulltest.c -o nulltest -Ipath_to_cmocka_headers -Lpath_to_cmocka_library_binary -lcmocka

nulltest.c

#include <stdarg.h>
#include <stddef.h>
#include <setjmp.h>
#include <cmocka.h>

/* A test case that fails. */
static void null_test_failed(void **state) {
(void) state; /* unused */
assert_int_equal(0, 1);
}

int main(void) {
const struct CMUnitTest tests[] = {
cmocka_unit_test(null_test_failed),
};
const struct UnitTest tests_deprecated[] = {
unit_test(null_test_failed),
};

cmocka_set_message_output(CM_OUTPUT_XML);

/* group test functions that use customizable output format */
cmocka_run_group_tests(tests, NULL, NULL);
cmocka_run_group_tests_name("custom group name", tests, NULL, NULL);

/* run single test with standard output */
run_test(null_test_failed);

/* DEPRECATED TEST RUNNER functions that can give only standard output */
run_tests(tests_deprecated);
_run_tests(tests_deprecated, 1);
run_group_tests(tests_deprecated);
_run_group_tests(tests_deprecated, 1);

return 0;
}
4

Другие решения

XML выводится на стандартный вывод, вам нужно перенаправить его в файл …

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector