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

How to decide when and when not to create an integration test

是否有明确的流程来决定您应该为代码库中的哪些内容创建集成测试套件?我在说... "This part of my code meets A criteria, thus tests should be created. This part of my code meets B criteria, thus tests should not be created."

随着我的 Rails 应用程序规模的显着增长,我正在添加一些小功能(与总体结构相比),例如 User 帐户上的一个字段,该字段指示 User 被允许为他或她自己创建一个约会,或者他或她需要 parent 才能这样做(我知道这个错误的影响可能很重要,但我只是想阐明此功能实施的细节)。

集成测试是否应该针对特定领域——如上述情况?或者它们应该更全面和整合?我正在寻找从 "yes" 或 "no" 到集成测试创建的清晰过程。存在吗?

没有办法决定是否编写一个可以不假思索地使用的集成测试。任何实际应用程序都有细微差别和挑战任何规则的特殊情况。 但是肯定有一种通用的方法,除非您发现它不合适,否则您可以遵循:使用验收测试作为集成测试的方法.

旁注:我用 "integration test" 表示测试不止一层代码的测试,而不是 Rails-specific 的意思,后者主要包含在更好的方法和工具中。但是如果你确实使用 Rails 集成测试,我的回答就适用。

验收测试捕获重要的用户流。这也是一个集成测试,从 UI 一直到后端测试应用程序的所有层。 Behavior-Driven 开发 (BDD) 和类似方法通过为所有重要的用户流程编写验收测试来推动开发 outside-in。验收测试编写起来很复杂,而且 运行 速度很慢,因此我们尽量编写尽可能少的验收测试,但仍然定义了所有重要的用户流程。

选择验收测试是一门艺术,但根据经验,如果两个场景涉及不同的参与者 and/or 不同的主要系统组件(例如 UI 屏幕),他们应该有单独的验收测试,如果不是,则它们是具有详细信息的相同场景,一次验收测试就足够了。

验收测试有助于与利益相关者沟通(即记录需求),因此无论您的其余测试策略如何,您都需要它们。但是 通常会发现全套验收测试就是您需要的所有集成测试。不值得验收测试的详细需求可以在单元测试中表达。

在您的示例中,我可能会为用户创建自己的约会的场景编写一个验收测试,而另一个场景为 parent 必须提供帮助的场景,因为它们会大不相同。第一个是(使用 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

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

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