命名单元和集成测试方法的最佳实践?

时间:2010-05-18 20:10:22

标签: java unit-testing naming-conventions

我最近继承了一个由不同人在不同时间编写的应用程序,并寻求如何标准化的指导。

8 个答案:

答案 0 :(得分:8)

假设NUnit:

[Test]
public void ObjectUnderTest_StateChanged_Consequence()
{
    Assert.That(tra_la_la);
}

[Test]
public void ObjectUnderTest_Behaviour_Consequence()
{
    Assert.That(tra_la_la);
}

例如:

[Test]
public void WifeIsTired_TakeWifeToDinner_WifeIsGrateful()
{
    Assert.That(tra_la_la);
}

[Test]
public void WifeIsTired_MentionNewGirlfriend_WifeGetsHalf()
{
    Assert.That(tra_la_la);
}

答案 1 :(得分:5)

我只是写出它的用途。这不像你必须在其他任何地方输入名称,所以拥有testWibbleDoesNotThrowAnExceptionIfPassedAFrobulator不是问题。显然,任何测试都以“测试”开始。

答案 2 :(得分:2)

特别关注BDD(行为驱动开发)和this blog post是有益的。

BDD主要关注组件及其应该做什么。因此,它直接影响您如何命名/构建测试,以及它们用于设置条件和验证的代码。 BDD不仅允许开发人员读/写测试,而且团队的非技术成员(业务分析师等)可以通过指定测试并验证它们来做出贡献。

答案 3 :(得分:2)

没有这样的标准,不同的人/地方会有不同的方案。重要的是你坚持标准。

我个人非常喜欢以下 - C#中的示例代码,但非常接近Java,同样的规则适用:

[Test]
public void person_should_say_hello()
{
     // Arrange
     var person = new Person();
     // Act
     string result = person.SayHello();
     // Assert
     Assert(..., "The person did not say hello correctly!");
}

<强>显

测试名称应该给出被测试类的名称。在此示例中,正在测试的类是Person。测试名称还应具有正在测试的方法的名称。这样,如果测试失败,你至少会知道在哪里解决它。我还建议遵循AAA - Arrange, Act, Assert规则,这将确保您的测试易于阅读和遵循。

友好失败消息

当声明结果/状态时,包含可选消息很有用。这使得测试失败时更容易,特别是在作为构建过程的一部分或通过外部工具运行时。

<强>下划线

我遵循的最后(虽然是可选的)姿势是使用下划线来表示测试名称。虽然我不喜欢生产代码中的下划线,但是它们在测试名称中的使用非常有用,因为测试名称通常要长得多。快速浏览使用下划线的测试名称证明更具可读性,尽管这是主观的,并且是关于单元测试实践的争论的来源。

整合测试

相同的标准适用于集成测试,唯一的区别是此类测试的位置与单元测试分开。在上面的示例代码中,测试类将被称为PersonTests,并位于名为PersonTests.cs的文件中。集成测试将以类似的方式命名 - PersonIntegrationTests,位于PersonIntegrationTests.cs。同一个项目可以用于这些测试,但要确保它们位于不同的目录中。

答案 4 :(得分:1)

答案 5 :(得分:1)

在那种情况下,我可能会找到最常用的命名约定,并重构其余的代码来使用它。如果使用最多的那个真的很可怕,我仍然会查看现有的代码,并尝试找到一个我可以忍受的代码。一致性比任意约定更重要。

答案 6 :(得分:1)

我使用FunctionTestCondition构造。如果我有两个方法GetSet,我可能会创建以下测试方法:

  • GetTest是一个积极的测试(一切都好)。
  • GetTestInvalidIndex测试传递给方法的无效索引。
  • GetTestNotInitialized用于测试数据在使用前的输入时间。
  • SetTest
  • SetTestInvalidIndex
  • SetTestTooLargeValue
  • SetTestTooLongString

答案 7 :(得分:0)

通过设置对测试进行分组,围绕此设置创建测试类,名称使用后缀Test或IntegrationTest。使用JUnitTestNG等测试框架,您可以根据需要命名测试方法。我将该方法命名为它测试的方法,驼峰情况下的一个句子,而不是测试前缀。框架使用@Test注释将方法标记为测试。