如何决定何时何时不创建集成测试

时间:2015-04-17 18:28:17

标签: testing tdd integration-testing

是否有确定代码库中应该为其创建集成测试套件的最终流程?我在说...... “我的代码的这一部分符合A标准,因此应该创建测试。我的代码的这部分符合B标准,因此不应该创建测试。”

随着我的Rails应用程序的大小增加,我添加了一些小功能(与总体结构相比),就像User帐户中的字段一样,该字段指示是否允许User为自己创建一个约会,或者他或她要求父母这样做(我明白这个错误的含义可能很重要,但我只是想澄清这个功能实现的细微之处)。

集成测试应该是特定于字段的 - 如上所述吗?或者他们应该更全面和整合?对于集成测试创建的“是”或“否”的透明过程是我正在寻找的。它存在吗?

2 个答案:

答案 0 :(得分:2)

无法决定是否编写可以不经过思考使用的集成测试。任何真实的应用程序都有细微差别和特殊情况,可以挑战任何规则。 但肯定有一个共同的方法你可以遵循,除非你发现它不适合:使用验收测试作为集成测试的方法。

旁注:我正在进行“集成测试”,这意味着测试会运行多个代码层,而不是特定于Rails的含义,而这些含义大部分都是由更好的方法和工具所包含的。但是,如果您使用Rails集成测试,我的答案将适用。

验收测试捕获重要的用户流程。它也是一个集成测试,从UI一直到后端运行应用程序的所有层。行为驱动开发(BDD)和类似的方法通过编写所有重要用户流的验收测试来推动开发。验收测试编写起来很复杂并且运行缓慢,因此尝试编写最小数量的可能性,这仍然定义了所有重要的用户流程。

选择验收测试是一门艺术,但经验法则是如果两个场景涉及不同的演员和/或不同的主要系统组件(例如UI屏幕),他们应该有单独的验收测试,如果不是,他们是相同的详细情况和一次验收测试就足够了。

验收测试对于与利益相关者进行沟通(即记录要求)非常有用,因此无论您的其他测试策略如何,您都需要它们。但通常会发现一整套验收测试是您需要的所有集成测试。不符合验收测试的详细要求可以在单元测试中表达。

在您的示例中,我可能会为用户创建自己的约会的场景编写一个验收测试,而另一个用于父级必须帮助的场景,因为它们会完全不同。第一个是(使用Gherkin)

When I visit the new appointment page
And I create a new public appointment
And I visit my calendar
Then I see the public appointment

但第二种情况会有很大不同:

When there is an unrestricted user "Dad"
And there is a restricted user "Billy" supervised by "Dad"
And there is a user "Stalker"
When "Billy" visits the new appointment page
And "Billy" creates a new appointment
And "Billy" visits his calendar
Then "Billy" sees a pending appointment

When "Stalker" visits "Billy"'s calendar
Then "Stalker" does not see an appointment

When "Dad" visits "Billy"'s calendar
And "Dad" approves the pending appointment
Then "Dad" sees an appointment

When "Billy" visits his calendar
Then "Billy" sees an appointment

When "Stalker" visits "Billy"'s calendar
Then "Stalker" does not see an appointment

另一方面,对于有和没有位置的场景,我可能不会写两个不同的验收测试(假设位置只是一个可能填充或可能未填充的文本字段)。单元测试可能就足够了。

答案 1 :(得分:1)

如果您可以在没有错误的情况下进行小调整,那么您就不需要进行集成测试。但是,一旦你开始遇到2或3个错误,或者由于复杂性(使用你的直觉和经验)你预见到自己会遇到问题,那么你需要进行测试。
实际的公式比这更具体是不可能的,因为测试旨在检测不应该存在的错误。因此,如果没有检测到错误(编写测试),就无法知道它是否存在。