我收到错误“找到测试报告,但没有一个是新的。测试是否已运行?”当试图通过电子邮件发送单元测试结果时。原因是我有一个专门的Jenkins作业,它将工件从测试作业导入到自身,并通过电子邮件发送测试结果。我这样做的原因是因为我不希望Jenkins在晚上发送所有开发人员的电子邮件:)所以我“邮寄”电子邮件发送,因为Jenkins本身不支持延迟的电子邮件通知(遗憾的是)。
但是,当“通过电子邮件发送测试结果”作业执行时,测试时间已经过了几个小时,我得到了问题标题中指定的错误。关于如何解决这个问题的任何想法?
答案 0 :(得分:54)
您可以尝试将测试报告的时间戳更新为构建步骤(“执行shell脚本”)。 E.g。
cd path/to/test/reports
touch *.xml
答案 1 :(得分:5)
还可以在gradle中实现更新上次修改日期:
task jenkinsTest{
inputs.files test.outputs.files
doLast{
def timestamp = System.currentTimeMillis()
test.testResultsDir.eachFile { it.lastModified = timestamp }
}
}
build.dependsOn(jenkinsTest)
如上所述:http://www.practicalgradle.org/blog/2011/06/incremental-tests-with-jenkins/
答案 2 :(得分:3)
这是 Jenkinsfile(声明性管道)的更新版本:
pipeline {
agent any
stages {
stage('Build') {
steps {
sh 'make build'
}
}
stage('Test') {
steps {
sh 'make test'
script {
def testResults = findFiles(glob: 'build/reports/**/*.xml')
for(xml in testResults) {
touch xml.getPath()
}
}
}
}
}
post {
always {
archiveArtifacts artifacts: 'build/libs/**/*.jar', fingerprint: true
junit 'build/reports/**/*.xml'
}
}
}
答案 3 :(得分:2)
执行 cd path / to / test / reports touch * .xml
对我不起作用,但运行以下命令有效:
通过控制台或jenkinsmvn clean test 。
这会生成新的测试报告。
答案 4 :(得分:2)
因为gradle缓存了以前版本的结果,所以我遇到了同样的问题。
我通过在发布阶段添加以下行来修复它:
sh 'find . -name "TEST-*.xml" -exec touch {} \\;'
所以我的文件是这样的:
....
stage('Unit Tests') {
sh './gradlew test'
}
stage('Publish Results') {
// Fool Jenkins into thinking the tests results are new
sh 'find . -name "TEST-*.xml" -exec touch {} \\;'
junit '**/build/test-results/test/TEST-*.xml'
}
答案 5 :(得分:1)
对于重复运行的作业(每30分钟)也存在相同的问题。
对于该作业,转到“配置”,“构建”,“高级”,然后在“开关”部分中添加: - 堆栈跟踪 - 继续 --rerun-tasks
答案 6 :(得分:0)
确保您在jenkins配置下提到了“测试报告XML”的正确路径,例如“target / surefire-reports / *。xml” 没有必要触摸* .xml,因为即使测试结果xml文件没有改变,jenkins也不会抱怨。
答案 7 :(得分:0)
如果你使用Windows奴隶,你可以触摸'结果使用了与PowerShell的groovy管道阶段:
powershell 'ls "junitreports\\*.*" | foreach-object { $_.LastWriteTime = Get-Date }'
答案 8 :(得分:0)
如果您使用的测试报告在该运行中未被该作业修改,则会发生这种情况。
如果出于测试目的,如果要使用已创建的文件进行测试,请在Build> Execute Shell下的jenkins job中添加以下命令
chmod -R 775 /root/.jenkins/workspace/JmeterTest/output.xml
echo " " >> /root/.jenkins/workspace/JmeterTest/output.xml
以上命令更改文件的时间戳,因此不会显示错误。
注意:要在 Execute Shell (而非上面的命令)中实现相同的功能,请不要尝试使用move mv 命令等来重命名文件。 t work时,追加和删除相同的更改文件时间戳才有效。
答案 9 :(得分:0)
对我来说,由于权限错误,chmod -R 775 test-results.xml
或touch test-results.xml
之类的命令不起作用。解决方法是在测试报告设置中设置新文件,并使用命令将旧的xml报告文件复制到新文件中。
答案 10 :(得分:0)
在Jenkins上配置作业时,可以在“ Pre Steps”部分中添加以下shell命令
mvn clean test
这将清除测试
答案 11 :(得分:0)
这是涉及每个测试结果文件的 gradle 任务的更新版本。 从 Jenkins 管道脚本中,只需调用“testAndTouchTestResult”任务而不是“test”任务。
以下代码使用 Kotlin 语法:
tasks {
register("testAndTouchTestResult") {
setGroup("verification")
setDescription("touch Test Results for Jenkins")
inputs.files(test.get().outputs)
doLast {
val timestamp = System.currentTimeMillis()
fileTree(test.get().reports.junitXml.destination).forEach { f ->
f.setLastModified(timestamp)
}
}
}
}
答案 12 :(得分:0)
这对我有用
cd /report_directory
rm *.xml
junit report_directory/*.xml
答案 13 :(得分:-1)
对我来说,解决方案是在詹金斯上删除node_modules
并将node
的版本(从7.1更改为8.4)。就是这样。