Unit testing 单元测试失败消息的推荐标准?
这是单元测试的一个相当小的方面,但我对(通常是可选的)失败消息感到好奇,您可以定义该消息以在测试执行期间测试断言失败时显示该消息是否有关于何时使用此类消息以及其中包含哪些信息的推荐做法?Unit testing 单元测试失败消息的推荐标准?,unit-testing,Unit Testing,这是单元测试的一个相当小的方面,但我对(通常是可选的)失败消息感到好奇,您可以定义该消息以在测试执行期间测试断言失败时显示该消息是否有关于何时使用此类消息以及其中包含哪些信息的推荐做法? 例如,我想不是每个断言都需要定义失败消息,也就是说,当测试的预期结果非常清楚时。但在某些情况下,您可能希望在执行单个操作后测试对象的几个方面,这意味着您可能在一个测试方法中列出了几个断言。该场景中的每个断言是否都应该有一个描述性的失败消息,以便很容易看出测试方法在给定点失败的原因?比较对于确定出错的原因非常有用
例如,我想不是每个断言都需要定义失败消息,也就是说,当测试的预期结果非常清楚时。但在某些情况下,您可能希望在执行单个操作后测试对象的几个方面,这意味着您可能在一个测试方法中列出了几个断言。该场景中的每个断言是否都应该有一个描述性的失败消息,以便很容易看出测试方法在给定点失败的原因?比较对于确定出错的原因非常有用。JUnit失败消息采用标准格式: 我原以为是这个,但我得到了这个
如果您可以显示差异标记就更好了。我发现自定义故障消息在数量有限的情况下非常有用。特别是,当您断言对象的多个属性时,这些属性的预期/实际值可能无法提供有关失败原因的最佳信息。考虑一个测试,例如:
[Test]
public void CreateOrder_CreatesValidOrderForProvidedCustomer()
{
// Assume we arranged test here
var order = orderFactory.Create(customer);
Assert.That(order.Type, Is.EqualTo("Immediate Dispatch"));
Assert.That(order.Details, Is.EqualTo("Very Important Package"));
Assert.That(order.CustomerNote, Is.EqualTo("Send fast or I tell mom"));
}
当上述任何一项断言失败时,您将收到的消息大致如下:
预计:“非常重要的包裹”实际:“迅速发送”
如果不查看单元测试(它使用的数据非常精确),就很难判断是哪个属性导致了这种情况。只需将属性名添加为失败消息,在此处会有所帮助
但是
这只是一个极端情况,当多个断言属性可能很难区分内容时。通常,您不应该面临这样的问题(请注意,我们通过提供一条字长的期望消息来解决这个问题)。如果您觉得需要使用冗长的描述性预期消息,那么这可能表明您的测试过于复杂。您可能会考虑将其分成几个测试,或者甚至重新设计测试类。
最重要的是,我建议看看像这样的项目。他们做对了:
没有什么比没有明确解释原因就失败的单元测试更令人讨厌的了
并通过非常简洁的语法和简洁的错误报告解决了这个问题:
"1234567890".Should().Be("0987654321");
将报告为:
预期字符串为“0987654321”,但
“1234567890”在“123”(索引0)附近有所不同
也许这不是你问题的答案,更多的是提示,但如果你使用Hamcrest matchers而不是老式的断言,那么默认情况下消息会更好,而且很少需要提供自定义消息。编辑:虽然我在Java标签中,但我的评论是非常特定于Java的…没问题,谢谢你的指针!我主要在C#语言中工作,但我在其他语言中也遇到过同样的问题,所以我把它留给了语言不可知论者。