【问题标题】:Using gtest in jenkins在詹金斯中使用 gtest
【发布时间】:2012-07-18 11:47:36
【问题描述】:

我在 Jenkins 中使用 google test 成功运行了我的单元测试,但我不知道如何显示 gtest 生成的 .xml 文件。据说gtest满足JUnit格式,所以我设置如下:

但它在构建后以错误告终。

未找到测试报告文件。配置错误?
构建步骤“发布 JUnit 测试结果报告”将构建结果更改为 FAILURE
完成:失败

【问题讨论】:

  • result.xml 是否位于工作区根目录中?如果您浏览您的工作区,您应该能够找到 result.xml 以及它所在的确切路径。
  • @sti:我添加了确切的错误,Jenkins 的工作空间根在哪里?
  • 我知道可能会迟到,但也许有人再次遇到这个问题,幸运的是 gtest 现在与 Jenkins 中的 JUnit 兼容(我读到仍有一些问题,但对我来说一切都很好)我用过来自他们的 master 分支的最新 gtest,生成的 xml 与 JUnit 兼容,并且由 Jenkins 简单地提取和处理。

标签: jenkins googletest


【解决方案1】:

Fraser 的回答很好,您需要一些额外的处理才能将 gtest XML 转换为正确的 JTest 格式。

首先您要求 gtest 使用以下命令将结果输出到 XML:

mygtestapp --gtest_output=xml:gtestresults.xml

然后,您需要在脚本中添加额外的元素来正确标记跳过的测试。 Jenkins 的 JTest 处理器要求跳过的测试包含 元素,而不仅仅是将状态设置为“notrun”:

awk '{ if ($1 == "<testcase" && match($0, "notrun")) print substr($0,0,length($0)-2) "><skipped/></testcase>"; else print $0;}' gtestresults.xml > gtestresults-skipped.xml
mv gtestresults.xml gtestresults.off

如果在 Windows 批处理文件上运行此操作,请将 awk 操作放在文件中以避免引号出现问题。 awk.progfile:

{ if ($1 == "<testcase" && match($0, "notrun")) print substr($0,0,length($0)-2) "><skipped/></testcase>"; else print $0;}

并在你的 bat 文件中创建添加:

awk -f awk.progfile gtestresults.xml > gtestresults-skipped.xml

最后,您将 JTest 处理器作为 Post-Build 步骤来读取转换后的 XML:

# Publish JUnit Test Result Report
Test Report XMLs: gtestresults-skipped.xml

【讨论】:

  • 现在还可以使用 xUnit 插件“googletest 1.6”选项解析 googletest 输出。似乎它可以在没有 awk 魔法的情况下处理禁用的测试,并且也可以与 googletest 1.7 一起正常工作。
【解决方案2】:

您是否使用正确的标志(即--gtest_output=xml[:DIRECTORY_PATH\|:FILE_PATH])运行您的测试可执行文件?

来自--help 输出:

--gtest_output=xml[:DIRECTORY_PATH\|:FILE_PATH] Generate an XML report in the given directory or with the given file name. FILE_PATH defaults to test_details.xml.

【讨论】:

    【解决方案3】:

    Jenkins 配置页面上的错误有点像红鲱鱼。

    基本上,发生的事情是构建作业没有生成测试报告 xml 文件。所以,你会得到这个错误:

    Recording test results
    No test report files were found. Configuration error? 
    

    当然,必须正确配置位置。为此,请参阅这篇文章:

    How to configure test-reports on Jenkins CI working with grails?

    那么,如何修复错误?关键是研究控制台输出以检查测试是否成功运行。他们可能没有,这就是错误发生的原因。

    一旦你成功运行测试,假设你正确配置了位置,你应该没问题。

    您正在使用 JUnit,因此它将是一个 Java 项目。我会在这里指出,以防它可能对其他人有所帮助,我们正在运行 Xcode。测试没有运行。

    在错误上方的 Jenkins 控制台输出中隐藏了以下注释:

     note: RunUnitTests exited without running tests because TEST_AFTER_BUILD was set to NO.
    

    回到 Xcode,并将 UnitTests 目标的 Test After Build 标志设置为 YES 就成功了。那在单元测试部分。当然,您也可以在项目级别设置标志,并将目标更改为“其他”,将值设置为$(inherited)

    【讨论】:

      【解决方案4】:

      您的结果文件未存储在正确的位置,Jenkins 插件无法找到它。执行测试并生成 XML 文件后,您是否将其存储在任何地方?

      我建议尝试通过将 result.xml 替换为 '*' 来使其工作(假设这是应该存储在那里的唯一 XML 文件),如果这将工作,然后开始使用正确的文件名。

      我们在配置中遇到了同样的问题。确保生成的结果 XML 存储在插件期望的关键位置。您可以从项目配置中确定工作区根目录。

      【讨论】:

        【解决方案5】:

        Jenkins 有 xunit 插件,可将 googletest xml 转换为 junit 格式:https://plugins.jenkins.io/xunit/

        管道示例

        pipeline {
            agent any
            stages {
                stage('Test'){
                    steps {
                        sh "run_tests.bash"
                    }
                }
            }
            post {
                always{
                    xunit (
                        thresholds: [ skipped(failureThreshold: '0'), failed(failureThreshold: '0') ],
                        tools: [ GoogleTest(pattern: 'reports/*.xml') ]
                    )
                }
            }
        }
        

        其他有用的链接:

        【讨论】:

        • 您的代码中似乎有太多括号')'。
        • 移除了括号
        【解决方案6】:

        这是一个 windows 批处理版本,用于通过 windows 批处理将 google-test "notRun" 转换为 junit "skipped"。我知道还有更优雅的方法,但是这个只需要 windows 批处理就可以了

        rem convert gtest xml to junit compatible format (replace notRun by skipped)
        IF EXIST  %INTEXTFILE% (
            IF EXIST %OUTTEXTFILE% (
                del %OUTTEXTFILE%
                waitfor fileSystemToDoItsStuff /t 1
            )
            FOR /f "tokens=1,* delims=¶" %%A IN ( '"type %INTEXTFILE%"') DO (
                ECHO."%%A" | findstr /C:"DISABLED_">nul & IF ERRORLEVEL 1 (
                    SET modified=%%A
                ) ELSE (
                    SET string=%%A
                    SET modified=!string:/^>=^>^<skipped /^>^</testcase^>!
                )
                ECHO !modified!>> %OUTTEXTFILE%
            )
            del %INTEXTFILE%
            waitfor fileSystemToDoItsStuff /t 1
            move %OUTTEXTFILE% %INTEXTFILE%
        )
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-06-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-06-16
          • 2017-02-28
          相关资源
          最近更新 更多