继续执行测试中junit4即使当一个断言失败(Continuing test execution i

2019-06-23 18:44发布

我有我的现有框架,建立使用Jfunc它提供了一个工具,甚至继续exection时的一个断言的测试用例失败。 Jfunc使用的JUnit 3.X框架。 但是,现在我们正在向junit4,所以我不能再使用Jfunc并使用JUnit 4.10罐子代替它。
现在的问题是,因为我们已经广泛在我们的框架中使用jfunc,并使用JUnit 4,我们想使我们的代码,甚至继续执行时的一个断言在测试案例失败。
有没有人有这方面的任何建议/想法,我知道在JUnit测试需要为每测试用例多个原子即一个断言,但我们不能这样做,在我们出于某种原因框架。

Answer 1:

你可以使用一个做到这一点ErrorCollector规则。

要使用它,首先添加规则在您的测试类中的字段:

public class MyTest {
    @Rule
    public ErrorCollector collector = new ErrorCollector();

    //...tests...
}

然后更换你所声称的与呼叫collector.checkThat(...)

@Test
public void myTest() {
    collector.checkThat("a", equalTo("b"));
    collector.checkThat(1, equalTo(2));
}


Answer 2:

我用的是ErrorCollector太多,但也可以使用assertThat并将其放置在一个try catch块。

import static org.junit.Assert.*;
import static org.hamcrest.Matchers.*;

@Rule
public ErrorCollector collector = new ErrorCollector();

@Test
public void calculatedValueShouldEqualExpected() {
    try {
        assertThat(calculatedValue(), is(expected));
    } catch (Throwable t) {
        collector.addError(t);
        // do something
    }
}


Answer 3:

您还可以使用assertj -软断言

@Test
public void testCollectErrors(){
   SoftAssertions softly = new SoftAssertions();
   softly.assertThat(true).isFalse();
   softly.assertThat(false).isTrue();
   // Don't forget to call SoftAssertions global verification !
   softly.assertAll();
}

还存在其他的方式来使用它,而手动调用softly.assertAll();

  1. 与规则
  2. 与autoclosable
  3. 使用静态assertSoftly方法


Answer 4:

使用try / finally块。 这个工作在我的情况:

...
try {
    assert(...)
} finally {
    // code to be executed after assert
}
...


Answer 5:

尝试 - 捕捉,在“尝试”使用断言,在“捕捉”添加可能的错误来收集。 然后扔在测试结束时的例外,在拆解()。 因此,如果有会在断言失败/错误,它就会被获取,并测试将继续进行。 (例如,在收集是静态的,您还可以在设置(新实例),每个@Test)

    public static List<String> errors = new ArrayList<>();


    try {
        //some assert...
    }
    catch (AssertionError error) {
        errors.add(error.toString());
    }



    @After
    public void tearDown() {

        try {
            if (!errors.isEmpty()) {
                throw new AssertionError(errors);
            }
        }
        finally {
            //empty list because it's static, alternatively make instance for each test in setUp()
            errors.clear();
        }
    }


Answer 6:

另一种选择是在与lambda表达式一起可观察到的图案。 您可以使用类似上面。

public class MyTestClass {

    private final List<Consumer<MyTestClass>> AFTER_EVENT = new ArrayList<>();

    @After
    public void tearDown() {
        AFTER_EVENT.stream().forEach(c -> c.accept(this));
    }

    @Test
    public void testCase() {
        //=> Arrange
        AFTER_EVENT.add((o) -> {
            // do something after an assertion fail.
        }));

        //=> Act

        //=> Assert
        Assert.assertTrue(false);
    }
}


文章来源: Continuing test execution in junit4 even when one of the asserts fails
标签: java junit4