除了 xUnit 提供的基本断言之外,我无法理解其他断言可以提供什么Assert.True
。在我们的单元测试中使用其他类型的断言有什么好处?
4 回答
在 JUnit 中,我更喜欢使用 Hamcrest (assertThat) 进行所有匹配。我觉得它给出了更具可读性的断言。有大量可用的匹配器,错误消息的信息量更大。
例如,假设您有一个List<String>
. 其中assertTrue
可能是:
assertTrue(myList.size() == 3);
这个 if 的错误信息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
, 等等等等。
主要是为了可读性。例如:
StringAssert.StartsWith('abc', s);
可能比以下更具可读性:
Assert.True(s.StartsWith('abc'))
一些断言虽然做了其他有用的事情,例如Assert.Fail();
我想它提供了一些可读性。Assert.IsNotNull(obj) 比 Assert.True(obj != null) 更容易看
for readability. tests should be the documentation of your code.
whenever possible i use fest assert with plain old assertXXX without any expressions. if not possible (or requires to much work with predicates) i use hamcrest. using complex expressions with assertXXX is the last resort for me