Я могу использовать cmocka и получать результаты по умолчанию на экране. Я хочу получить результаты модульного теста в формате JUnit.
CMocka поддерживает формат JUnit с помощью переменной env CMOCKA_MESSAGE_OUTPUT
или используя API cmocka_set_message_output(CM_OUTPUT_XML);
Но по-прежнему не генерируется XML-файл. Кто-нибудь может помочь в получении результатов в формате JUnit?
Самый достоверный источник на самом деле 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;
}
XML выводится на стандартный вывод, вам нужно перенаправить его в файл …