【问题标题】:How to write integration tests?如何编写集成测试?
【发布时间】:2016-03-27 16:51:03
【问题描述】:

我的团队使用实体框架 6 ORM 开发了一个 Web API 2 应用程序。

我们的应用程序充当电子邮件,它的主要目的和操作是从一个客户向另一个客户发送一封信。

由于这是应用程序的主要目的,我们都希望进行集成测试,以确保我们正确发送了一封信。那是因为我们不想意外插入会破坏它的代码。

发送一封信时发生的主要操作以及我们想要测试的主要操作是-

  • 通过HTTP Post方法收到一封信,并在服务器上验证
  • 信件被保存到数据库
  • 这封信被序列化了。
  • 序列化的信件通过外部模块发送到指定目的地。
  • 信件在接收方反序列化。
  • 这封信被添加到收到的客户的数据库中。

我问这个是因为我不知道如何解决这个问题,但我真的想要那种我可以依赖的测试。

应该如何设置测试?我从哪里开始?如何通过测试实现实际的信件发送并确保它有效?

不一定是端到端测试。

谢谢

编辑:

我不介意测试需要很长时间,它们可以在晚上运行,但我希望他们尽可能多地验证应用程序的主要部分是否按预期工作。

【问题讨论】:

    标签: c# entity-framework asp.net-web-api continuous-integration integration-testing


    【解决方案1】:

    我会设置多个非实际代码测试来验证您的逻辑:

    1. 收到信,顺理成章
    2. 验证是否只在应该调用数据库的保存方法时才调用
    3. 验证代码的序列化/反序列化位
    4. 验证目标选择器模块是否正常工作。

    一旦您进行了这些“非调用”测试,您就知道系统的所有部分都可以单独正常工作。然后,您可以设置带有某种标记的单元测试(即 TestCategory("SUPERSLOW")),然后在集成测试运行期间针对一组模拟的收件人手动运行该测试以进行验证,而不是作为 CI 的一部分。

    这里的关键词是:

    • SOLID 原则
    • 关注点分离
    • 嘲讽
    • 持续集成
    • 控制反转

    【讨论】:

    • 我们是否对所有应用程序部分进行了单元测试,我们希望进行一些测试来涵盖所有内容,并确保我们不会破坏发送
    • 我不介意这个测试超长并且在晚上运行,但我希望它尽可能地验证一切正常,而不仅仅是调用了正确的方法。
    • 是的,我并不是说您不应该运行集成测试,但是,它不应该是您持续集成的一部分,而应该是您手动运行或充其量运行的东西,每晚,否则,它将破坏您的开发人员体验。这里主要关注的是执行速度。如果测试开始运行缓慢,人们就会停止编写它们。
    • 是的,如果它不是 CI 的一部分并在夜间运行,我不介意,但我该如何编写这样的测试?
    • 您将其标记为“慢”或其他内容,然后在白天排除该类别中的所有测试,在您的夜间构建中,您可以允许所有测试执行。