如果单元测试名称会随着时间的推移而过时,并且您认为测试本身是最重要的,那么选择明智的测试名称是否重要?
IE
[Test]
public void ShouldValidateUserNameIsLessThan100Characters() {}
诗
[Test]
public void UserNameTestValidation1() {}
如果单元测试名称会随着时间的推移而过时,并且您认为测试本身是最重要的,那么选择明智的测试名称是否重要?
IE
[Test]
public void ShouldValidateUserNameIsLessThan100Characters() {}
诗
[Test]
public void UserNameTestValidation1() {}
任何方法的名称都应该清楚地说明它的作用。
IMO,您的第一个建议有点长,第二个建议不够丰富。此外,在名称中加上“100”可能是个坏主意,因为这很可能会改变。关于什么:
public void validateUserNameLength()
如果测试发生变化,则名称应相应更新。
是的,名称非常重要,特别是当您在控制台或持续集成服务器中运行测试时。Jay Fields 写了一篇关于它的文章。
此外,为每个测试添加一个断言的好测试名称,当测试失败时,您的套件将为您提供出色的报告。
非常。与选择好的方法和变量名同样重要。
如果您的测试套件将来会被新开发人员引用,则更多。
至于你原来的问题,肯定是Answer1。输入更多字符是一个很小的代价
是的。
[Test]
public void UsernameValidator_LessThanLengthLimit_ShouldValidate() {}
将测试对象放在第一位,然后是测试语句,最后是预期结果。
这样,您就可以清楚地了解它在做什么,并且可以轻松地按名称排序:)
在Clean Code,第 124 页,Robert C. Martin写道:
这个故事的寓意很简单:测试代码与生产代码一样重要。它不是二等公民。它需要思考、设计和关怀。它必须像生产代码一样保持干净。
我认为,如果找不到一个简洁的测试方法名称,则表明该测试的设计不正确。好的方法名称也可以帮助您在更短的时间内找出发生的事情。
是的,测试名称的全部意义在于它告诉您测试失败时什么不起作用。
我不会将测试需要满足的条件放在名称中,因为条件可能会随着时间而改变。在您的示例中,我建议命名为
UserNameLengthValidate()
或者
UserNameLengthTest()
或类似的东西来解释测试的作用,但不假定测试/验证参数。
是的,被测代码的名称(方法、属性等)可以更改,但我认为如果期望发生更改,您现有的测试应该会失败。这是构建良好测试的真正价值,而不是仔细阅读测试名称列表。话虽这么说,命名良好的测试方法是让新开发人员加入进来的好工具,帮助他们找到“可执行文档”,他们可以用它来摆脱现有代码的疲劳——所以我会保持测试方法的名称是最新的因为我会让测试方法做出的断言保持最新。
我使用以下模式命名我的测试。每个测试夹具都试图专注于一个类,通常名称为 {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()
{
// ...
}
}
有一个非常具有描述性的名称有助于立即查看哪些工作不正常,因此您实际上不需要查看单元测试代码。此外,所有单元测试的列表描述了单元的预期行为,并且可以(或多或少地)用作被测单元行为的文档。
请注意,这仅适用于单元测试非常具体并且在一个单元测试中没有过多验证的情况。
例如:
[Test]
void TestThatExceptionIsRaisedWhenStringLengthLargerThen100()
[Test]
void TestThatStringLengthOf99IsAccepted()
这个名字需要在合理的范围内起作用。我不想要来自构建的电子邮件说测试 389fb2b5-28ad3 失败,但只要知道这是一个用户名测试而不是其他测试将有助于确保正确的人进行诊断。
[RowTest]
[Row("GoodName")]
[Row("GoodName2")]
public void Should_validate_username()
{
}
[RowTest]
[Row("BadUserName")]
[Row("Bad%!Name")]
public void Should_invalidate_username()
{
}
这对于更复杂的验证类型可能更有意义。
是的,他们是。我个人建议查看SSW 的规则以更好地进行单元测试。它包含一些非常有用的命名指南。