29

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

截屏

但它最终在构建后出现错误。

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

4

6 回答 6

24

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

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

mygtestapp --gtest_output=xml:gtestresults.xml

然后在脚本中,您需要添加额外的元素来正确标记跳过的测试。Jenkins 的 JTest 处理器要求跳过的测试包含 <skipped> 元素,而不仅仅是将状态设置为“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.prog 文件:

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

并在你的 bat 文件中创建 add :

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

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

# Publish JUnit Test Result Report
Test Report XMLs: gtestresults-skipped.xml
于 2012-12-28T19:28:34.103 回答
10

您是否使用正确的标志(即)运行您的测试可执行文件--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.

于 2012-07-18T13:55:14.407 回答
1

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

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

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

于 2012-08-22T14:47:04.187 回答
1

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

本质上,发生的事情是构建作业没有生成测试报告 xml 文件。因此,您会收到此错误:

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

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

如何在使用 grails 的 Jenkins CI 上配置测试报告?

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

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

您正在使用 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).

于 2012-08-17T11:06:40.077 回答
1

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') ]
            )
        }
    }
}

其他有用的链接:

于 2020-04-16T17:20:42.467 回答
0

这是一个 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%
)
于 2017-09-22T08:40:17.583 回答