单元测试名称是否重要?

时间:2008-09-06 13:59:56

标签: unit-testing

如果单位测试名称随着时间的推移而变得过时,并且如果您认为测试本身是最重要的,那么选择明智的测试名称是否重要?

[Test]
public void ShouldValidateUserNameIsLessThan100Characters() {}

诗歌

[Test]
public void UserNameTestValidation1() {}

13 个答案:

答案 0 :(得分:18)

任何方法的名称都应该清楚它的作用。

IMO,你的第一个建议有点长,第二个建议不够丰富。同样,在名称中加上“100”可能是一个坏主意,因为这很可能会改变。怎么样:

public void validateUserNameLength()

如果测试发生变化,则应相应更新名称。

答案 1 :(得分:10)

是的,名称非常重要,特别是在控制台或持续集成服务器中运行测试时。 Jay Fields写了post about it

此外,使用one assertion per test放置好的测试名称,当测试失败时,您的套件会为您提供出色的报告。

答案 2 :(得分:7)

<强>非常。选择好方法和变量名称同样重要。
如果您的测试套件将来会被新开发者引用,那么还有更多。

至于你原来的问题,肯定是答案1。输入几个字符是一个很小的代价

  • 可读性。为了你和他人。它会消除'我在想什么?'以及'WTF是这个人参加这个测试吗?'
  • 当您要修复别人写的内容时快速放大
  • 任何测试套件访问者的即时更新。如果操作正确,只需查看测试用例的名称即可告知读者该单元的规格。

答案 3 :(得分:6)

 [Test]
 public void UsernameValidator_LessThanLengthLimit_ShouldValidate() {}

首先放置测试对象,然后是测试语句,最后是预期结果 这样,您可以清楚地了解它正在做什么,并且您可以轻松地按名称排序:)

答案 4 :(得分:6)

Clean Code,第124页,Robert C. Martin写道:

  

故事的寓意很简单:测试代码与生产代码一样重要。它不是二等公民。它需要思想,设计和关怀。它必须像生产代码一样保持清洁。

答案 5 :(得分:2)

我认为如果找不到测试方法的简洁名称,则表明此测试的设计不正确。同样好的方法名称可以帮助您在更短的时间内找出发生的事情。

答案 6 :(得分:2)

是的,测试名称的重点是它告诉你测试失败时什么不起作用。

答案 7 :(得分:1)

我不会在名称中放置测试需要满足的条件,因为条件可能会及时发生变化。在你的例子中,我建议命名为

UserNameLengthValidate()

UserNameLengthTest()

或类似的东西来解释测试的作用,但不假设测试/验证参数。

答案 8 :(得分:1)

是的,受测试代码的名称(方法,属性等)可能会发生变化,但我认为如果期望发生变化,您现有的测试应该会失败。这是具有良好构造的测试的真正价值,而不是仔细阅读测试名称列表。话虽这么说,有名的测试方法是让新开发人员参与进来的好工具,帮助他们找到“可执行文档”,他们可以用这些文档来解决现有代码 - 所以我会保持测试方法的名称是最新的因为我会保持测试方法的断言是最新的。

我使用以下模式命名我的测试。每个测试夹具都试图专注于一个类,通常是名称{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()
   {
     // ...
   }
}

答案 9 :(得分:1)

具有非常具有描述性的名称有助于即时查看无法正常工作的内容,因此您实际上不需要查看单元测试代码。 此外,所有单元测试的列表描述了单元的预期行为,并且可以(或多或少)作为被测单元行为的文档。

注意,这仅适用于单元测试非常具体且在单元测试中不能验证太多的情况。

例如:

[Test]
void TestThatExceptionIsRaisedWhenStringLengthLargerThen100()

[Test]
void TestThatStringLengthOf99IsAccepted()

答案 10 :(得分:0)

名称需要在合理范围内。我不希望来自构建的电子邮件说测试389fb2b5-28ad3失败,但只知道它是UserName测试而不是其他东西将有助于确保合适的人得到诊断。

答案 11 :(得分:0)

[RowTest]
[Row("GoodName")]
[Row("GoodName2")]
public void Should_validate_username()
{
}

[RowTest]
[Row("BadUserName")]
[Row("Bad%!Name")]
public void Should_invalidate_username()
{
}

对于更复杂的验证类型,这可能更有意义。

答案 12 :(得分:0)

是的,他们是。我个人建议看一下SSW's rules to better unit tests。它包含一些非常有用的命名准则。