我是一个 C++-er 做一些 Java。在 C++ 广泛使用的gtest包中,Expectations 和 Assertions 之间存在区别:
EXPECT_EQ(4, 2); // will ultimately cause test failure but test continues to run
ASSERT_EQ(4, 2); // test will stop here and fail
Run Code Online (Sandbox Code Playgroud)
如果测试失败,断言将停止测试。期望不会停止测试。如果未满足预期,则测试将失败。不同之处在于,我们可以在一次测试运行中看到代码块中有多少未满足预期。
这在 Java 中有等价的吗?我目前正在使用 JUnit,并且看到到处都在使用断言:
Assert.assertEquals(4, 2); // just like C++, this stops the show
Run Code Online (Sandbox Code Playgroud)
这很好,但问题是你看不到在一次测试运行中有多少失败!!
对于 JUnit 4,您可以使用 JUnit 的ErrorCollector,如下所示:
public class TestClass {
@Rule
public ErrorCollector collector = new ErrorCollector();
@Test
public void test() {
collector.checkThat(4, is(equalTo(5)));
collector.checkThat("foo" , is(equalTo("bar")));
}
}
Run Code Online (Sandbox Code Playgroud)
你会得到两个失败的报告:
java.lang.AssertionError:
Expected: is <5>
but: was <4>
java.lang.AssertionError:
Expected: is "bar"
but: was "foo"
Run Code Online (Sandbox Code Playgroud)
使用 JUnit 5,您可以使用assertAll方法并传递您的断言。将调用所有断言,在第一个失败的断言后测试不会停止:
@Test
void test() {
Executable assertion1 = () -> Assertions.assertEquals(4, 2);
Executable assertion2 = () -> Assertions.assertEquals(5, 2);
Assertions.assertAll(assertion1, assertion2);
}
Run Code Online (Sandbox Code Playgroud)
消息将是:
Multiple Failures (2 failures)
expected: <4> but was: <2>
expected: <5> but was: <2>
Run Code Online (Sandbox Code Playgroud)