47

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

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

4

14 回答 14

66

您可以尝试将测试报告的时间戳更新为构建步骤(“执行 shell 脚本”)。例如

cd path/to/test/reports
touch *.xml
于 2013-02-05T08:20:05.253 回答
9
mvn clean test 

通过终端或詹金斯。这会生成新的测试报告。

另一个说cd path/to/test/reports touch *.xml的答案对我不起作用,但是mvn clean test是的。

于 2016-03-14T20:51:17.440 回答
8

更新最后修改日期也可以在 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/

于 2013-07-07T20:05:40.133 回答
6

这是Jenkinsfile (Declarative Pipeline)的更新版本:

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'
        }
    }
}
于 2018-07-06T08:46:35.863 回答
3

因为 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'

}
于 2020-01-08T17:37:09.047 回答
2

对于重复运行的作业(每 30 分钟)有同样的问题。

对于作业,请转到配置、构建、高级并在开关部分中添加:--stacktrace --continue --rerun-tasks

于 2018-12-20T20:46:16.707 回答
0

确保您在 jenkins 配置下针对“测试报告 XMLs”提到了正确的路径,例如“target/surefire-reports/*.xml” 无需触摸 *.xml,因为即使测试 jenkins 也不会抱怨结果 xml 文件没有改变。

于 2016-08-15T06:09:10.603 回答
0

如果您使用 Windows slave,您可以使用带有 powershell 的 groovy 管道阶段“触摸”结果:

powershell 'ls "junitreports\\*.*" | foreach-object { $_.LastWriteTime = Get-Date }'
于 2017-08-22T09:11:30.557 回答
0

如果您使用的测试报告在该运行中未被该作业修改,则会发生这种情况。

如果您正在使用已经创建的文件进行测试,那么为了测试目的,请在 Build > Execute Shell 下的 jenkins 作业中添加以下命令

chmod -R 775 /root/.jenkins/workspace/JmeterTest/output.xml

echo " " >> /root/.jenkins/workspace/JmeterTest/output.xml

上面的命令更改文件的时间戳,因此不会显示错误。

注意:要在Execute Shell而不是上面实现相同的效果,请不要尝试使用 move mv命令等重命名文件。它不会起作用,附加和删除相同的更改文件时间戳才有效。

于 2019-01-26T17:20:00.203 回答
0

对我来说,命令喜欢chmod -R 775 test-results.xmltouch test-results.xml由于权限错误而不起作用。解决方法是在测试报告设置中设置新文件,并命令将旧的 xml 报告文件复制到新文件。

在此处输入图像描述

于 2019-03-29T06:05:32.493 回答
0

在 Jenkins 上配置作业时,您可以将以下 shell 命令添加到“预步骤”部分

mvn clean test

这将清理测试

于 2019-06-26T19:46:34.120 回答
0

这是涉及每个测试结果文件的 gradle 任务的更新版本。从 Jenkins 管道脚本中,只需调用“testAndTouchTestResult”任务而不是“测试”任务。

下面的代码使用 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)
        }
    }
}

}

于 2021-03-09T22:02:46.630 回答
0

这对我有用

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

确保你有一个成功的构建没有任何失败,只有在这之后你才能看到报告

于 2021-05-24T16:00:05.433 回答
-1

我的解决方案是在詹金斯上删除node_modules和更改node版本(从 7.1 到 8.4)。就是这样。

于 2018-11-30T18:38:59.927 回答