单元测试名称重要吗?
如果单元测试名称会随着时间的流逝而过时,并且我们认为测试本身是最重要的事情,那么选择明智的测试名称是否重要?
IE
[Test] public void ShouldValidateUserNameIsLessThan100Characters() {}
诗
[Test] public void UserNameTestValidation1() {}
解决方案
回答
我不会将测试需要满足的条件放在名称中,因为条件可能会随时间变化。在示例中,我建议命名为
UserNameLengthValidate()
或者
UserNameLengthTest()
或者类似的内容来解释测试的功能,但不假定测试/验证参数。
回答
任何方法的名称都应清楚说明其作用。
IMO,第一个建议有点长,而第二个建议还不够翔实。另外,在名称中加上" 100"可能也不是一个好主意,因为这很有可能会改变。关于什么:
public void validateUserNameLength()
如果测试更改,则应相应更新名称。
回答
我认为,如果找不到一种测试方法的简洁明了的名称,则表明该测试的设计不正确。好的方法名称还可以在更短的时间内找出发生了什么情况。
回答
名称必须在合理范围内。我不希望生成的电子邮件中说测试389fb2b5-28ad3失败了,但是仅知道这是一个UserName测试,而不是其他测试,将有助于确保正确的人来进行诊断。
回答
是的,被测代码的名称(方法,属性等)可以更改,但是我认为,如果期望发生变化,则我们现有的测试应该会失败。拥有结构合理的测试,而不细读测试名称列表,这才是真正的价值。话虽这么说,命名良好的测试方法是吸引新开发人员的好工具,可以帮助他们找到"可执行文档",使他们可以不厌其烦地使用现有代码-因此,我将使测试方法的名称保持最新我将使测试方法所做的断言保持最新。
我使用以下模式命名测试。每个测试装置都尝试着重于一个类,通常将其命名为{ClassUnderTest} Test。我将每种测试方法命名为{MemberUnderTest} _ {Assertion}。
[TestFixture] public class IndexableFileTest { [Test] public void Connect_InitializesReadOnlyProperties() { // ... } [Test,ExpectedException(typeof(NotInitializedException))] public void IsIndexable_ErrorWhenNotConnected() { // ... } [Test] public void IsIndexable_True() { // ... } [Test] public void IsIndexable_False() { // ... } }
回答
非常。与选择好的方法和变量名同等重要。
如果测试套件将来会被新开发人员使用,则还有更多。
至于原始问题,肯定是Answer1. 再输入几个字符是一个很小的代价
- 可读性。对于我们和其他人。它将消除"我在这里想什么?"以及" WTF这个人正在参加这次测试吗?"
- 当我们要修复别人写的东西时可以快速放大
- 任何测试套件访问者的即时更新。如果做得正确,只需翻阅测试用例的名称,即可将单元的规格告知读者。
回答
是的。
[Test] public void UsernameValidator_LessThanLengthLimit_ShouldValidate() {}
首先放置测试对象,然后放置测试语句,然后放置预期结果。
这样,我们就可以清楚地知道它在做什么,并且可以按名称轻松地进行排序:)
回答
是的,测试名称的全部要点是,它告诉我们测试失败时什么不起作用。
回答
[RowTest] [Row("GoodName")] [Row("GoodName2")] public void Should_validate_username() { } [RowTest] [Row("BadUserName")] [Row("Bad%!Name")] public void Should_invalidate_username() { }
实际上,对于更复杂的验证类型,这可能更有意义。
回答
对,他们是。我个人建议查看SSW的规则以更好地进行单元测试。它包含一些非常有用的命名准则。
回答
是的,名称非常重要,尤其是在控制台或者持续集成服务器中运行测试时。杰伊·菲尔德斯(Jay Fields)发表了一篇关于它的文章。
此外,在每个测试中放置一个带有一个断言的好的测试名称,当测试失败时,套件将为我们提供出色的报告。
回答
具有非常描述性的名称有助于立即查看哪些内容无法正常工作,因此我们实际上不需要查看单元测试代码。
同样,所有单元测试的列表都描述了单元的预期行为,并且可以(或者多或者少)用作被测单元行为的文档。
请注意,这仅在单元测试非常具体且在一个单元测试中验证不太多时才起作用。
因此,例如:
[Test] void TestThatExceptionIsRaisedWhenStringLengthLargerThen100() [Test] void TestThatStringLengthOf99IsAccepted()
回答
Robert C. Martin在第124页的"清洁代码"中写道:
The moral of the story is simple: Test code is just as important as production code. It is not a second-class citizen. It requires thought, design, and care. It must be kept as clean as production code.