在jenkins中使用gtest
我在Jenkins中使用google test成功地运行了单元测试,但我不知道如何显示gtest生成的.xml文件。据说gtest满足JUnit格式,所以我设置如下: 但它最终会在一个建筑之后出错 未找到任何测试报告文件。配置错误?在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
生成步骤“发布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') ]
)
}
}
}
其他有用的链接:
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') ]
)
}
}
}