如果单元测试名称会随着时间的推移而过时,并且如果您认为测试本身是最重要的,那么选择明智的测试名称很重要吗?单元测试名称很重要吗?
即
[Test]
public void ShouldValidateUserNameIsLessThan100Characters() {}
诗句
[Test]
public void UserNameTestValidation1() {}
如果单元测试名称会随着时间的推移而过时,并且如果您认为测试本身是最重要的,那么选择明智的测试名称很重要吗?单元测试名称很重要吗?
即
[Test]
public void ShouldValidateUserNameIsLessThan100Characters() {}
诗句
[Test]
public void UserNameTestValidation1() {}
任何方法的名称都应该清楚它的作用。
IMO,你的第一个建议有点长,第二个建议不够丰富。在名字中加上“100”也许是个坏主意,因为这很可能会改变。如何:
public void validateUserNameLength()
如果测试更改,名称应该相应地更新。
我不会把该测试需要在名称满足条件,因为条件可能随时间而改变。在你的榜样,我建议命名像
UserNameLengthValidate()
或
UserNameLengthTest()
或类似的说明测试做什么东西,但没有假设测试/验证参数。
我认为如果找不到测试方法的简明名称,这是一个迹象表明此测试的设计不正确。同样好的方法名称可以帮助您在更短的时间内找出发生的事情。
该名称需要在合理范围内处理。我不希望构建电子邮件说测试389fb2b5-28ad3失败,但只是知道这是一个用户名测试而不是别的东西,这将有助于确保合适的人进行诊断。
是的,被测代码的名称(方法,属性,任何)都可以改变,但是我认为如果期望值改变,你现有的测试应该会失败。这是构造良好的测试的真正价值,而不是阅读测试名称列表。话虽如此,有名的测试方法是获取新开发人员的好工具,帮助他们找到“可执行文档”,以便他们可以摒弃现有代码 - 所以我会保持测试方法的名称为最新因为我会保持更新测试方法的断言。
我使用以下模式命名我的测试。每个测试夹具都试图专注于一个类,通常是名称{ClassUnderTest}测试。我将每个测试方法命名为{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()
{
// ...
}
}
很。与选择好的方法和变量名同等重要。
如果您的测试套件将在未来由新开发人员引用,则还有更多。
至于你的原始问题,绝对答案1。输入几个字符是一个小的代价支付
是的。
[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's rules to better unit tests。它包含一些非常有用的命名准则。
是的,名称是非常重要的,尤其是当您在控制台或持续集成服务器上运行测试时。 Jay Fields写了一个post about it。
此外,把好的测试名称与one assertion per test和你的套件会给你很好的报告,当一个测试失败。
+1对于每个测试的一个断言 – 2009-05-20 12:59:14
具有非常具有描述性的名称有助于即时查看哪些功能无法正常工作,因此您实际上不需要查看单元测试代码。另外,所有单元测试的列表描述了单元的预期行为,并且可以(或多或少)用作被测单元行为的文档。
请注意,这只适用于单元测试非常具体且在单元测试中不会验证太多的情况。
因此,例如:
[Test]
void TestThatExceptionIsRaisedWhenStringLengthLargerThen100()
[Test]
void TestThatStringLengthOf99IsAccepted()
在Clean Code,第124页,Robert C. Martin写道:
这个故事的寓意很简单:测试代码是一样的生产代码一样重要。它不是二等公民。它需要思考,设计和关怀。它必须像生产代码一样保持清洁。
这就是我喜欢的方式! – 2009-05-20 12:59:52