我最近继承了不同人在不同时间编写的应用程序,并寻找关于如何标准化的指导。命名单元和集成测试方法的最佳做法是什么?
回答
假设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);
}
在这种情况下我可能会发现,使用最多和重构代码的其余部分使用的命名约定。如果最常用的是真的很可怕,我仍然会看现有的代码,并试图找到一个可以与之共存的代码。一致性比任意惯例更重要。
它不是一个随意的习惯,而是一种最佳做法。 – HDave 2010-05-19 04:30:38
我使用FunctionTestCondition
构造。如果我有两个方法,Get
和Set
我也许会创建以下测试方法:
GetTest
是一个积极的测试(一切正常)。GetTestInvalidIndex
测试传递给方法的无效索引。GetTestNotInitialized
用于测试数据在使用前未被检测的时间。SetTest
SetTestInvalidIndex
SetTestTooLargeValue
SetTestTooLongString
它的启发看看BDD(行为驱动开发)和this blog post尤其如此。
BDD本质上集中在组件上,他们应该做什么。因此,它会直接影响您如何命名/构建测试,以及它们用于设置条件和验证的代码。 BDD不仅允许开发人员读/写测试,而且团队中的非技术成员(业务分析师等)可以通过指定测试和验证测试来做出贡献。
非常有趣的链接 - 谢谢。 – HDave 2010-05-19 04:29:37
我只写了它的用途。这不像是你必须在其他地方输入名字,所以有testWibbleDoesNotThrowAnExceptionIfPassedAFrobulator
不是一个问题。任何测试都是以“测试”开始的,显然。
没有标准正因为如此,不同的人/地方都会有不同的方案。重要的是你坚持为标准。
个人,我的下面的风扇 - 在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
。同一个项目可以用于这些测试,但确保它们位于不同的目录中。
- 1. 单元测试/集成测试GXT代码的最佳方法是什么?
- 2. 单元测试异步方法的最佳方法是什么?
- 3. 在.NET中单元测试私有方法的最佳做法是什么?
- 4. 最佳做法/集成测试
- 5. 单元测试使用ServerSocket类的方法的最佳方法是什么?
- 6. 构建单元测试程序集的最佳方法是什么?
- 7. 集成测试数据库驱动的php的最佳做法是什么?
- 8. 测试命令行工具的最佳方法是什么?
- 9. 使用水豚调试rspec集成测试的最佳方法是什么?
- 10. 在插入单元测试后清理数据的最佳做法是什么
- 11. Nginx和runit ....什么是最佳做法
- 12. 测试中的最佳做法是什么?
- 13. hadoop基准测试的最佳做法是什么?
- 14. 单元测试方法有断言而非异常时的最佳做法是什么?
- 15. 在单元测试中检查矩阵值的最佳方法是什么?
- 16. 在单元测试中验证Set值的最佳方法是什么?
- 17. Rails5 - 编写服务单元测试的最佳方法是什么?
- 18. 为iPhone/iPad编写单元测试的最佳方法是什么?
- 19. 在node.js中编写单元测试的最佳方法是什么?
- 20. 测试方法内部方法的最佳方法是什么? (JUnit)
- 21. 在Android中命名XML元素的ID的最佳做法是什么?
- 22. 使用Maven进行集成测试的最佳做法?
- 23. 生成火花单选按钮的最佳做法是什么?
- 24. 命名和封装多字CSS类和ID的最佳做法是什么?
- 25. 在C#中,测试数据集是否为空的最佳方法是什么?
- 26. 单元测试生成图像的代码的最佳方式是什么?
- 27. 调用对方的元类方法的最佳做法是什么?
- 28. c#单元测试 - 重载方法测试的命名约定
- 29. 验证类的公共方法的最佳方法是单元测试?
- 30. 处理元素集合的最佳方法是什么?
另一种方法是MethodUnderTest_Scenario_Expectation。例如AddItem_EmptyCart_OneItemInCart()。这假定每个测试类的测试夹具类。 – Ryan 2010-05-18 23:50:18
@Ryan - 你的建议是我最终使用的。这也是该书“单元测试的艺术”的推荐。 – HDave 2010-07-07 02:50:07