当前位置: 首页 > 面试题库 >

如果单元测试失败,Jenkins脚本化管道不会获取测试结果

韦高阳
2023-03-14
问题内容

我有基于gradle的带有junit测试的Java项目,我正在为其构建CI工作。我使用松弛Slack
Notification插件成功地将松弛与Jenkins集成在一起。

Jenkins版本:2.173
松弛通知版本:2.20

jenkins CI是脚本化管道,具有以下代码:

stage('Test') {
        def slackHelper = new com.xyz.jenkins.libraries.SlackNotifier(env)
        try {
            sh "./gradlew test"
            junit 'build/test-results/test/*.xml'
        } finally {
            AbstractTestResultAction testResultAction =  currentBuild.rawBuild.getAction(AbstractTestResultAction.class)

            slackHelper.getTestStatuses(currentBuild)
            slackSend(channel: '#ci-cd', attachments: slackHelper.buildUnitTestSlackNotificationMessage())
        }
    }

SlackNotifier是一个包含以下代码的库:

/**
 * Calculates test result as a string
 * @param currentBuild : jenkins object, should be passed from jenkins pipeline script
 * @return the final test result as a string
 */
@NonCPS
def getTestStatuses(currentBuild) {
    final AbstractTestResultAction testResultAction = currentBuild.rawBuild.getAction(AbstractTestResultAction.class)
    if (testResultAction != null) {
        this.total = testResultAction.totalCount
        this.failed = testResultAction.failCount
        this.skipped = testResultAction.skipCount
        this.passed = total - failed - skipped
    }
}

buildUnitTestSlackNotificationMessage在同一类中执行此操作:

def buildUnitTestSlackNotificationMessage() {
        final JSONObject unitTestResult = new JSONObject()
        unitTestResult.put("fallback", this.jenkinsEnvironment.JOB_NAME + "with build#" + this.jenkinsEnvironment.BUILD_NUMBER + "finish with unit test result : Passed: " + this.passed + " | Failed: " + this.failed + " | Skipped: " + this.skipped )
        unitTestResult.put("color", this.getUnitTestReportColor())
        unitTestResult.put("pretext", "Message from CI job: " + this.jenkinsEnvironment.JOB_NAME + "#" + this.jenkinsEnvironment.BUILD_NUMBER)
        unitTestResult.put("title", "BuildLog")
        unitTestResult.put("title_link", "<<<JenkinsHost>>>" + this.jenkinsEnvironment.JOB_NAME + "/" + this.jenkinsEnvironment.BUILD_NUMBER  + "/console")
        unitTestResult.put("text", "Passed: " + this.passed +  " | Failed: " + this.failed + " | Skipped: " + this.skipped)
        unitTestResult.put("image_url", this.getLogoURL())
        this.attachments.add(unitTestResult)
        return this.attachments.toString()
    }

所有测试通过后,一切都很好。但是当测试失败时,我会收到以下通知:

Message from CI job: <<<JobName>>>#47
BuildLog
Passed: null | Failed: null | Skipped: null

testResultAction当任何单元测试在此处失败时,结果为null。

我无法深入探讨这一点。请帮忙。


问题答案:

我在reddit中得到了答案,功劳归于:/ u / Bodumin

这是根本原因,我在这里引用他:

Move the junit step into the finally. What's likely happening is that test returns a non 0 (error) status so it fails it of the try.

因此,脚本化管道如下所示:

stage('Test') {
        def slackHelper = new com.xyz.jenkins.libraries.SlackNotifier(env)
        try {
            sh "./gradlew test"
        } finally {
            junit 'build/test-results/test/*.xml'
            AbstractTestResultAction testResultAction =  currentBuild.rawBuild.getAction(AbstractTestResultAction.class)

            slackHelper.getTestStatuses(currentBuild)
            slackSend(channel: '#ci-cd', attachments: slackHelper.buildUnitTestSlackNotificationMessage())
        }
    }


 类似资料:
  • 安装程序:我有一个扩展IRetryAnalyzer的类,并实现了一个简单的重试逻辑,覆盖了以下方法:public boolean retry(ITestResult result){ 提前道谢。

  • 我有三份詹金斯的工作。烟雾试验、关键路径试验(第1部分)、关键路径试验(第2部分)。现在一个接一个的开始。我需要根据测试结果创建构建管道。我需要考虑单个测试的结果(TestNG中的@test注释),忽略测试套件的整体结果。 我想得到这样的配置: 烟雾测试- 那么,请告诉我Jenkins如何仅依赖于一个测试结果(而不是所有套件)?

  • 我写了500多个单元测试方法。当我发出< code>ng test命令时。它开始测试所有的500种方法。 如果任何测试用例失败,它不会停止,仍然会继续执行所有方法。所以我需要等待更多的时间来再次重新运行单元测试。 我知道我们可以通过执行来存在,然后使用命令再次重新运行单元测试。这种方式也需要太多时间。 那么,如果任何一个测试失败,是否有可能停止(不存在)单元测试?

  • 目前的情况: 每周一早上我都会手动检查周末运行的Jenkins作业jUnit结果,使用Project Health插件我可以过滤时间框运行。然后我将此表复制粘贴到Excel中,并检查每个测试用例的输出日志,以查看失败的原因并记下失败的原因。每个周末在Excel中都有另一个选项卡。所有这些都使可追溯性成为一场噩梦,并导致耗时的体力劳动。 我在寻找什么(并希望在某种程度上已经存在): 存储我指定的所有

  • 我有一个Selenium Python测试来检查一个网站是否有效工作。 当页面加载时,开始和结束日期将以这种格式显示,并且按钮将变灰,直到设置正确的日期格式(如屏幕截图所示) 我的硒代码:

  • 在我的nodejs项目(用Typescript编写)中,我可以用以下命令运行我的测试: 他们成功了。我还在我的 package.json 文件中使用此命令,以便 以相同的方式运行它们,但在本例中,我得到: 这是我的包裹。json文件包含: 通过npm运行摩卡的正确变体是什么?