我无法理解其他断言可以提供的东西,而不是Xunit的Assert.True
提供的基本断言。在我们的单位测试中使用其他类型的断言的优点是什么?
在junit中,我更喜欢使用hamcrest(断言)进行所有匹配。我觉得这给出了更可读的断言。有很多可用的匹配器,错误消息更具信息性。
例如,假设您有一个List<String>
。在assertTrue
中可能是:
assertTrue(myList.size() == 3);
如果expected true, got false
,则此错误消息。将其与hamcrest进行比较,
assertThat(myList, IsCollectionWithSize.hasSize(3));
或静态导入
assertThat(myList, hasSize(3));
assertThat(myList, containsInOrder("first", "second"));
这是expected collection with size 3, got list["blah", "blah" ...]
还有其他匹配器,例如containsString
,IsIterableContainingInOrder
,IsIterableContainingInAnyOrder
等,等等,等等。
hamcrest
主要用于可读性。例如:
StringAssert.StartsWith('abc', s);
可能比:
更可读Assert.True(s.StartsWith('abc'))
一些断言尽管做其他有用的事情,例如Assert.Fail();
我想它提供了一些可读性。assert.isnotnull(obj)在眼睛上比assert.true(obj!= null)
可读性。测试应为您的代码文档。
尽可能,我将fest断言与普通的旧assertxxx无需任何表达方式。如果不可能(或需要与谓词进行太多工作),我使用hamcrest。使用AssertXxx使用复杂表达式是我的最后手段