Unit testing 单元测试断言的目的不是简单的真值测试

Unit testing 单元测试断言的目的不是简单的真值测试,unit-testing,Unit Testing,除了xUnit的Assert.True提供的基本断言之外,我无法理解其他断言还能提供什么。在我们的单元测试中使用其他类型的断言有什么好处?主要是为了可读性。 例如: StringAssert.StartsWith('abc', s); 可能比以下内容更具可读性: Assert.True(s.StartsWith('abc')) 不过,有些断言可以做其他有用的事情,比如Assert.Fail()在JUnit中,我更喜欢使用Hamcrest(assertThat)进行所有匹配。我觉得它提供了更具

除了xUnit的
Assert.True
提供的基本断言之外,我无法理解其他断言还能提供什么。在我们的单元测试中使用其他类型的断言有什么好处?

主要是为了可读性。 例如:

StringAssert.StartsWith('abc', s);
可能比以下内容更具可读性:

Assert.True(s.StartsWith('abc'))

不过,有些断言可以做其他有用的事情,比如
Assert.Fail()

在JUnit中,我更喜欢使用Hamcrest(assertThat)进行所有匹配。我觉得它提供了更具可读性的断言。有大量可用的匹配器,错误消息的信息量要大得多

例如,假设您有一个
列表
。在
assertTrue
中,它可能是:

assertTrue(myList.size() == 3);
如果
预期为真,则此错误消息为假
。与Hamcrest相比

assertThat(myList, IsCollectionWithSize.hasSize(3));
或者使用静态导入

 assertThat(myList, hasSize(3));
 assertThat(myList, containsInOrder("first", "second"));
此错误消息是
大小为3的预期集合,已获取列表[“blah”,“blah”…]

还有其他匹配程序,如
containsString
isterablecontainingorder
isterablecontaininganyorder
,等等


我想它提供了一些可读性。在可读性方面,Assert.IsNotNull(obj)比Assert.True(obj!=null)更容易理解。测试应该是代码的文档

只要可能,我就使用普通的旧assertXXX,而不使用任何表达式。如果不可能(或需要大量使用谓词),我将使用。在assertXXX中使用复杂表达式是我最后的选择