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

vaqhlq81  于 2023-05-05  发布在  Java
关注(0)|答案(8)|浏览(79)

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

vsikbqxv

vsikbqxv1#

假设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);
}
643ylb08

643ylb082#

我只是写它的目的。你不需要在其他地方输入名字,所以有一个testWibbleDoesNotThrowAnExceptionIfPassedAFrobulator不是问题。任何测试都以“测试”开头。

brccelvz

brccelvz3#

没有这样的标准,不同的人/地方会有不同的计划。重要的是你要坚持一个标准。
就我个人而言,我是以下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规则,这将确保您的测试易于阅读和遵循。

友好失败消息

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

下划线

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

集成测试

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

de90aj5v

de90aj5v4#

特别是看看BDD(行为驱动开发)和this blog post是很有启发性的。
BDD本质上是关注组件和它们应该做什么。因此,它直接影响到您如何命名/构建测试,以及它们用于设置条件和验证的代码。BDD不仅允许开发人员读/写测试,而且团队的非技术成员(业务分析师等)也可以通过指定测试并验证它们来做出贡献。

vjrehmav

vjrehmav5#

在这种情况下,我可能会找到使用最多的命名约定,并重构其余代码以使用该命名约定。如果使用最多的代码确实很糟糕,我仍然会查看现有的代码,并尝试找到一个我可以接受的代码。一致性比武断的惯例更重要。

q35jwt9p

q35jwt9p6#

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

  • GetTest为阳性测试(一切正常)。
  • GetTestInvalidIndex来测试传递给该方法的无效索引。
  • GetTestNotInitialized测试数据在使用前未初始化。
  • SetTest
  • SetTestInvalidIndex
  • SetTestTooLargeValue
  • SetTestTooLongString
pgpifvop

pgpifvop8#

按设置对测试进行分组,围绕此设置创建一个测试类,名称带有后缀Test或IntegrationTest。使用像JUnitTestNG这样的测试框架,您可以根据需要命名您的测试方法。我会根据它所测试的内容来命名这个方法,使用 Camel 大小写的句子,而不是测试前缀。框架使用@Test注解将方法标记为test。

相关问题