【问题标题】:Detect test failures on jenkins检测 jenkins 上的测试失败
【发布时间】:2016-05-23 06:01:32
【问题描述】:


自从 5 天以来,我一直在 Jenkins 周围玩耍,但我遇到了问题。我有一个已使用 JUnit 进行单元测试的 Java 代码,我正在使用 Gradle Build 来构建代码。我故意尝试使三个测试中的一个测试失败,并且 gradle build 报告失败!这是意料之中的。然而,我将我的代码推送到了 github SampleTestProject,并且在一分钟后(按照配置)在 Jenkins 上触发了构建。然而,即使在本地机器上构建测试失败,詹金斯仍将构建标记为成功!

我要发布的代码确实很糟糕,但可以在 jenkins 上进行动手体验
主类

   package com.bitwise.test;

    /**
     * Created by AniruddhaS on 2/11/2016.
     */
    public class Hello {
        public String sayHello() {
            return "Hello";
        }

        public int addArgs(int i, int i1) {
            return (i+i1);
        }

        public String sayBye() {
            return "Bye";
        }

        public int mulArgs(int i, int i1) {
            return (i*i1);
        }
    }


测试类

package com.bitwise.test;

import junit.framework.Assert;
import org.junit.Test;
import org.junit.experimental.theories.suppliers.TestedOn;

/**
 * Created by AniruddhaS on 2/11/2016.
 */
public class HelloTest {
    @Test
    public void itShouldReturnHelloOnCallingHelloMethod(){
        //given
        Hello vector=new Hello();
        //when
        Assert.assertSame("Hello",vector.sayHello());
        //then
    }
    @Test
    public void itShouldReturnAValueAfterAdditionOfTheArgumentValues(){
        //given
        Hello adder=new Hello();
        //when
        Assert.assertEquals(3,adder.addArgs(2,1));
        //then
    }
    @Test
    public void itShouldPrintByeWhenRelevantFunctionIsCalled(){
        //given
        Hello bye=new Hello();
        //when
        Assert.assertSame("Bye",bye.sayBye());
        //then
    }
    @Test
    public void itShouldMultiply(){
        //given
        Hello bye=new Hello();
        //when


       Assert.assertEquals(6,bye.mulArgs(5,3));/*here mulArgs emits 15 but 
                                     test fails since expected value is 6*/
        //then
    }
}


build.gradle

group 'hello'
version '1.0'

apply plugin: 'java'

sourceCompatibility = 1.5

repositories {
    mavenCentral()
}
task test1<<
        {
    println("hello, test running")
}

test{
    testLogging{
        events 'started','passed'
        events 'started','failed'
    }
}

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.11'
}


请建议如何解决上述问题!
提前致谢 :)

【问题讨论】:

  • 构建输出是否显示测试失败(Jenkins 不会注意到)或者是通过 Jenkins 运行构建时测试通过的实际问题?

标签: git jenkins gradle junit tdd


【解决方案1】:

你是如何运行 Gradle 脚本的?

无论您是使用“执行 shell”步骤来执行 ./gradlew test 之类的操作,还是使用 Gradle plugin 来执行您的 test 任务,Jenkins 标记如果 Gradle 脚本失败,则构建为 failed,例如由于测试断言失败。

但是你想要的是 Jenkins 构建被标记为 unstable 而不是 failed

为此,您需要更新您的 Gradle 脚本,以便在 build.gradletest 块中不将测试失败视为致命:

test {
  ignoreFailures = true
}

然后你可以在 Jenkins 中运行你的 Gradle 脚本并让它analyse JUnit 结果,这会将构建状态设置为 successfulunstable,这取决于是否测试通过或失败。

Gradle java 插件以 JUnit XML 格式将测试结果写入 build/test-results/TEST-HelloTest.xml(在您的示例中)。

要分析结果,请进入作业配置中的“构建后操作”,添加“发布 JUnit 测试结果报告”,并在“测试报告 XMLs”字段中输入 **/TEST-*.xml

【讨论】:

    【解决方案2】:

    好吧,我无法理解您的代码,但您可以在 jenkins 中添加构建后操作,这会影响作业的状态。

    例如:Text finder plugin: 在您指定的日志文件中搜索关键字,并使用该关键字将“成功”的构建降级为失败。

    Log Parser Plugin :显示错误和警告的摘要

    【讨论】:

    • 在测试类代码中我故意用注释标记了一个错误。在本地运行测试时,我得到一个断言错误,但 jenkins 没有这样做,它通过了测试。
    • 构建后操作仅在构建日志中发现“断言错误”时帮助您将测试标记为失败(如果您将其配置为搜索文本断言错误)。但是,如果您在本地而不是在 jenkins 工作中遇到错误,那么您需要找到问题的根本原因。
    • Jenkins 有一个 JUnit 插件(您可能已经安装了),因此最好使用它来解析测试结果,而不是依赖控制台输出中的文本。
    猜你喜欢
    • 2011-09-16
    • 1970-01-01
    • 2017-05-21
    • 2012-12-29
    • 1970-01-01
    • 1970-01-01
    • 2019-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多