在jenkins中使用gtest

在jenkins中使用gtest,jenkins,googletest,Jenkins,Googletest,我在Jenkins中使用google test成功地运行了单元测试,但我不知道如何显示gtest生成的.xml文件。据说gtest满足JUnit格式,所以我设置如下: 但它最终会在一个建筑之后出错 未找到任何测试报告文件。配置错误? 生成步骤“发布JUnit测试结果报告”将生成结果更改为失败 完成:失败 您是否使用正确的标志(即--gtest\u output=xml[:DIRECTORY\u PATH\:FILE\u PATH])运行测试可执行文件 从--help输出: --gtest_ou

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

但它最终会在一个建筑之后出错

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


您是否使用正确的标志(即
--gtest\u output=xml[:DIRECTORY\u PATH\:FILE\u PATH]
)运行测试可执行文件

--help
输出:

--gtest_output=xml[:目录_路径\|:文件_路径]
在给定目录中或使用给定文件生成XML报告
名称文件路径默认为test\u details.xml。


Jenkins配置页面上的错误有点令人费解

本质上,发生的是测试报告xml文件不是由构建作业生成的。因此,您将得到以下错误:

Recording test results
No test report files were found. Configuration error? 
当然,必须正确配置位置。为此,请参阅以下帖子:

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

一旦测试成功运行,假设正确配置了位置,就应该可以了

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

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

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

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

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

我建议尝试将result.xml替换为“*”(假设这是唯一一个应该存储在那里的xml文件),如果这样做可行,那么就开始使用正确的文件名


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

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

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

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

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

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

下面是一个windows批处理版本,用于通过windows批处理将google测试“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%
)
rem将gtest xml转换为junit兼容格式(将notRun替换为跳过的格式)
如果存在%INTEXTFILE%(
如果存在%OUTTEXTFILE%(
删除%OUTTEXTFILE%
等待文件系统ToDoitsStuff/t 1
)
对于/f“tokens=1,*delims=”%%A IN(“'type%INTEXTFILE%”)DO(
ECHO.“%%A”| findstr/C:“已禁用”>nul&IF错误级别1(
设置已修改=%%A
)否则(
设置字符串=%%A
SET modified=!string://^>=^>^^!
)
ECHO!已修改!>>%OUTTEXTFILE%
)
删除%INTEXTFILE%
等待文件系统ToDoitsStuff/t 1
移动%OUTTEXTFILE%%INTEXTFILE%
)

詹金斯有一个xunit插件,可以将googletest xml转换为junit格式:

管道示例

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') ]
            )
        }
    }
}
其他有用的链接:


result.xml是否位于工作区根目录中?如果您浏览您的工作区,您应该能够找到result.xml以及它所在的确切路径。@sti:我添加了确切的错误,Jenkins的工作区根在哪里?我知道可能会很晚,但可能有人再次遇到这个问题,幸运的是gtest现在与Jenkins中的JUnit兼容(我读到仍然存在一些问题,但对我来说一切都很好)我使用了他们主分支的最新gtest,生成的xml与JUnit兼容,这只是由Jenkins拾取和处理。现在还可以使用xUnit插件“googletest 1.6”解析googletest输出选项。它似乎可以在不使用
awk
magic的情况下处理禁用的测试,并且在googletest 1.7中也能正常工作。您的代码中似乎有一个括号“)”太多。已删除括号
# Publish JUnit Test Result Report
Test Report XMLs: gtestresults-skipped.xml
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%
)
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') ]
            )
        }
    }
}