如何解决“发现测试报告但没有一个是新的。测试是否运行?”在詹金斯

时间:2012-12-14 13:33:30

标签: email junit jenkins report

我收到错误“找到测试报告,但没有一个是新的。测试是否已运行?”当试图通过电子邮件发送单元测试结果时。原因是我有一个专门的Jenkins作业,它将工件从测试作业导入到自身,并通过电子邮件发送测试结果。我这样做的原因是因为我不希望Jenkins在晚上发送所有开发人员的电子邮件:)所以我“邮寄”电子邮件发送,因为Jenkins本身不支持延迟的电子邮件通知(遗憾的是)。

但是,当“通过电子邮件发送测试结果”作业执行时,测试时间已经过了几个小时,我得到了问题标题中指定的错误。关于如何解决这个问题的任何想法?

14 个答案:

答案 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

对我不起作用,但运行以下命令有效:

通过控制台或jenkins

mvn 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.xmltouch test-results.xml之类的命令不起作用。解决方法是在测试报告设置中设置新文件,并使用命令将旧的xml报告文件复制到新文件中。

enter image description here

答案 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)

这对我有用

  1. 导航至报告目录 cd /report_directory
  2. 删除所有旧报告rm *.xml
  3. 在管道中添加 junit report_directory/*.xml
  4. 重新运行测试脚本,导航到 Build Number → Test Result

答案 13 :(得分:-1)

对我来说,解决方案是在詹金斯上删除node_modules并将node的版本(从7.1更改为8.4)。就是这样。