如何编写好的单元测试消息

时间:2011-12-20 03:20:19

标签: unit-testing testing

我最近开始在我的项目中编写单元测试,我注意到所有断言语句都有一个消息参数。

什么是单元测试的好消息?

$cache->set('foo', 3);
$this->assertEquals($cache->get('foo'), 3, 'what should i say?');

谢谢!

3 个答案:

答案 0 :(得分:3)

陈述被测事实。

考虑:

$this->assertEquals($person->age, 21, "Age is 21")

VS:

$this->assertEquals($person->age, 21, "Age of person born on 1990-12-20");

一个好的单元测试消息可以帮助您快速猜出错误的位置。一个糟糕的人会让你花更多的时间去打猎。

答案 1 :(得分:1)

我通常会让它们保持良好和简短 - 只是正在测试的是什么。这条消息不必解释所有可能出错的事情的故事,只需要将读者指向正确的初始方向即可。测试应该足够清楚,以便他们可以从那里弄明白。

通常我会写下我的消息,以便不熟悉测试的人至少会有一些上下文,并且更了解测试的人可能会确切地知道出了什么问题(或者至少在测试中的位置)出了问题)。

在上面的示例中,我会说“cache for'foo'”之类的内容,这样消息就会回复为“foo'缓存预期为3但是为67”。对于熟悉测试的人来说,这将比“预期的3更有用,但在测试abc的第123行中是67”。

(我主要是一个Java开发人员,所以我说的就好像这是JUnit;我假设phpunit或其他所谓的工作方式相同。)

答案 2 :(得分:0)

This article在跳过message参数方面做得很好。总结:

  • 瞄准描述性/有用的测试方法名称(这通常会消除对消息的需求)
  • 目标是每次测试都有一个断言(以便测试方法名称可以描述单一用途)
  • 包含消息作为最后手段(例如,如果不能遵守上述内容)

附注:我发现使用DataRows等功能时,消息很好。该消息有助于区分哪个DataRow可能失败。 C#/ VS测试示例:

[TestMethod]
[DataRow(<some arguments>, <message1>)]
[DataRow(<some arguments>, <message2>)]
[DataRow(<some arguments>, <message3>)]
public void MyTest(<some params>, string message)
{
    ...
}