我在 Jenkins 中使用 google test 成功运行了我的单元测试,但我不知道如何显示 gtest 生成的 .xml 文件。据说gtest满足JUnit格式,所以我设置如下:
但它最终在构建后出现错误。
未找到测试报告文件。配置错误?
构建步骤“发布 JUnit 测试结果报告”将构建结果更改为 FAILURE
Finished: FAILURE
我在 Jenkins 中使用 google test 成功运行了我的单元测试,但我不知道如何显示 gtest 生成的 .xml 文件。据说gtest满足JUnit格式,所以我设置如下:
但它最终在构建后出现错误。
未找到测试报告文件。配置错误?
构建步骤“发布 JUnit 测试结果报告”将构建结果更改为 FAILURE
Finished: FAILURE
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
您是否使用正确的标志(即)运行您的测试可执行文件--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.
您的结果文件未存储在正确的位置,Jenkins 插件无法找到它。执行测试并生成 XML 文件后,您是否将其存储在任何地方?
我建议尝试通过将 result.xml 替换为 '*' 来使其工作(假设这是应该存储在那里的唯一 XML 文件),如果这将工作,那么开始使用正确的文件名。
我们在配置中遇到了同样的问题。确保生成的结果 XML 存储在插件期望的关键位置。您可以从项目配置中确定工作区根目录。
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)
.
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') ]
)
}
}
}
其他有用的链接:
这是一个 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%
)