如何将CMocka报告转换为JUnit格式?

4

我能够使用cmocka并在屏幕上获得默认结果。我希望以JUnit格式获得单元测试的结果。

通过使用环境变量CMOCKA_MESSAGE_OUTPUT或使用API cmocka_set_message_output(CM_OUTPUT_XML);,CMocka支持JUnit格式。

但仍然没有生成xml文件。有人可以帮忙以JUnit格式获取结果吗?

2个回答

7
最可靠的来源实际上是包含整个框架实现的 "cmocka.c" 源文件。该文件不太大,因此我将从源文件版本 1.0.1 中引用一些内容。
有两个条件可以通过 cmocka 生成 XML 输出,需要第三个条件才能将输出存储在文件中。
1. 只有通过 "cmocka_run_group_tests()" 调用测试才能生成 XML 输出。
只能从测试运行器 "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的值不区分大小写。如果该变量等于以下任何一个值,则将考虑该变量:stdoutsubunittabxml

因此,如果环境变量的值为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()影响,则说明在Shell中设置了变量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,但如果该文件已经存在或无法创建,则输出仍会写入shell。

当然,也可以将shell输出重定向到文件中,覆盖现有文件或添加到已存在的文件中。

以下示例可用于检查不同的输出选项。它可以通过命令进行构建。

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;
}

谢谢,Orest。这个答案确实值得奖金。事实上,这是网络上唯一一个cmcoka的最佳单一文档和示例,就我所知。@asn我错了吗? - Mawg says reinstate Monica
1
为了完整性,我通过使用cmocka_run_group_tests_name更新了帖子。 - Orest Hera

1
XML会被打印到标准输出(stdout),你需要将其重定向到一个文件中...

你好Andreas,感谢回复。我正在使用Cmocka 1.0.1,并在单元测试的main()中添加了cmocka_set_message_output(CM_OUTPUT_XML);。但是我在stdout上看到的结果格式如下... 0x3 == 0x3 cmockatest.c:8: error: Failure! [ PASSED ] 0 test(s). [ FAILED ] 1 test(s), listed below: [ FAILED ] test - Divya Y
asn@magrathea:~/workspace/projects/cmocka/obj> CMOCKA_MESSAGE_OUTPUT=XML ./example/simple_test <?xml version="1.0" encoding="UTF-8" ?> <testsuites> <testsuite name="tests" time="0.009" tests="1" failures="0" errors="0" skipped="0" > <testcase name="null_test_success" time="0.009" > </testcase> </testsuite> </testsuites> 运行正常。 - asn
哦,如果@asn确实是作者的话,那么我很惊讶他没有提到我通过阅读代码发现的内容。你可以在环境变量CMOCKA_XML_FILE中设置XML输出文件的名称-请参阅cmocka.c,第1913行。 - Mawg says reinstate Monica
1
@Mawg,您正在使用已弃用的测试运行程序“run_tests()”,请查看我的答案帖子。 - Orest Hera
cmocka-1.1.0已经改进了XML输出。现在您可以为每个组创建一个XML文件。请参见https://api.cmocka.org/-> 输出格式 - asn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接