我不希望assertJ assert在断言失败时结束测试

时间:2018-06-13 09:24:12

标签: java testing automated-tests assertj

我使用assertJ并在我的测试用例中有多个 assertThat 断言。 当第一次断言失败时,测试结束但我不希望这样。 我希望在单次执行测试用例后获得有关所有失败断言的信息。 有没有办法做到这一点? 我在这里找到了SoftAssertions的解决方案 - > http://joel-costigliola.github.io/assertj/assertj-core-features-highlight.html#soft-assertions 但是在每个断言之前添加变量。是很难的

3 个答案:

答案 0 :(得分:2)

一些示例代码会有所帮助,但是,这更像是一个理论问题,因为真正的答案是:考虑在一次测试调用中没有多个断言!

含义:测试失败的想法是尽快让您遇到问题。当您将多个断言组合到一个测试中时,默认情况下会让您的生活更加艰难。因为不是因为断言Y失败而不知道"测试X,所以你必须首先仔细研究日志,以确定哪些断言通过,哪一个失败。

因此,建议的做法是将多个断言/检查放入单个测试中。

答案 1 :(得分:1)

如果你不喜欢软断言,你可以尝试JUnit 5 assertAll但是否则我会遵循@GhostCat建议并尝试在每个测试中断言一件事(这通常只导致一些断言) )。

答案 2 :(得分:1)

我认为,在某些情况下,可能,有时甚至你必须在单个测试方法中断言多个内容,如果您的方法执行了多个您应该检查的更改不同层次/抽象。
例如,当您测试在存储它的对象中添加元素的方法时,您可以断言对象中包含的元素数量增加1,但您也可以检查新元素是否正确添加了有关其值的值。
您有两个级别/抽象:包含具有“直接/核心”状态的元素的对象及其包含的具有自己状态的元素。

在将它分成两个断言时,它会给出一个看起来像的测试:

@Test
public void addElt(){
    foo.addElt(new Element("a name", "a role"));

    assertThat(foo).extracting(Foo::getSize)
                   .contains(actualSize+1);    
    assertThat(foo.getLastElt()).extracting(Element::getName, Element::getRole)
                                .containsExactly(addedElt.getName(), addedElt.getRole());
}

所以现在为什么要尝试将两个断言结合起来检查两个不同的断言 事情?
它真的为调试测试带来了价值吗? 我不这么认为。
试图在一个断言中断言两个抽象层次的变化显然没有意义:复杂和无用的噪音。
如果第一个断言失败:

assertThat(foo).extracting(Foo::getSize)
               .contains(actualSize+1);  

很可能意味着没有添加元素 所以在这种情况下,执行第二个断言:

assertThat(foo.getLastElt()).extracting(Element::getName, Element::getRole)
                            .containsExactly(addedElt.getName(), addedElt.getRole());

毫无意义,因为它很可能也会出错 处理故障测试的开发人员只需要提供有用的信息,而不是噪声可以使其更难解决。因此,获得关于尺寸的反馈并不是您所期望的那样。

我试图解释的是AssertJ和任何测试框架一样。