【问题标题】:Shoe-horning Integration and System tests into a Unit Test Framework将鞋钉集成和系统测试集成到单元测试框架中
【发布时间】:2011-03-05 16:22:24
【问题描述】:
如domain-manager article 所示,我有兴趣创建一个集成测试工具,该工具可创建一个服务器和许多客户端,其中所有客户端都在单个进程中运行。但是一旦我实现了这个目标,我就会很想从单元测试框架(NUnit 或 VS Team 测试)中执行这样的集成和系统测试。
选择从单元测试框架中运行集成或系统测试有哪些优缺点?这是我自己的刺:
优点
- 它可以减少执行集成测试的时间和成本。
- 每次构建都可能完成集成测试。
缺点
- 并非所有集成测试都很快。其中一些需要一分钟才能运行(例如面向性能的集成测试)。
无论哪种方式,如果我的新集成测试代码没有放入单元测试框架中,您会推荐它放在哪里?换句话说,您会推荐哪些“集成测试”框架?
【问题讨论】:
标签:
.net
unit-testing
integration-testing
【解决方案1】:
我认为使用您已经熟悉的单元测试框架编写集成测试没有任何问题。由于这些是集成测试,因此有几件事可以将它们与您的单元测试区分开来。一是它们依赖于外部系统(即使您在代码中旋转其中一些系统),因此如果其中一个不可用,您的测试将失败。正如您已经指出的那样,另一个问题是集成测试需要更长的时间才能运行。
处理这些问题的方法是将构建脚本配置为不在 CI 构建期间运行集成测试,而是在计划构建期间运行它们(例如每晚构建)。开发人员能够按需手动运行集成测试也很重要,这样他们就可以在本地机器上验证没有任何测试被破坏,如果他们有,能够验证他们已经纠正了没有手动触发系统构建的问题。
根据您使用的测试框架,有不同的方法可以将单元测试与集成测试分开,以便您可以将构建配置为执行一个或两个。一种方法是将您的集成测试移动到一个单独的项目中,并且只在您的夜间构建期间在该项目中执行测试。另一种是使用Category attribute in NUnit 之类的东西将一些测试标记为集成测试。然后,您可以配置测试运行程序,为您不想执行集成测试的构建排除此类别中的测试。
【解决方案3】:
如果您考虑一下,大多数 unit 测试框架并不是特定于 unit 测试的。它们提供了运行任意代码位并验证其输出的工具。所有这些对于集成和系统测试来说都是必要的,即使还不够。
出于这个原因,我认为将“单元”测试框架用于非单元测试是完全合理的。
优点
- 很容易将非单元测试集成到您的构建过程中(假设您已经进行了单元测试)
- 能够利用单元测试框架生态系统中的工具(GUI 等)
- 开发人员会熟悉测试语言(通常会使用与开发中使用的相同的通用语言)
- 单元测试框架通常具有许多适用于非单元测试的功能,例如超时、类别。
缺点
- 对于非单元测试通常需要的高级任务(例如启动或监视流程、安装或数据库设置)没有帮助。
- 由于它们使用通用编程语言,由于设置测试(尤其是系统测试)的复杂性,测试可能会变得冗长
- 大多数单元测试框架不提供任何高级工具,例如测试计划的记录/回放,或适合验收测试/业务用户的 UI。
- 如果在测试中注册了许多进程/系统,则设置/拆卸可能会很丑陋和复杂。许多单元测试框架不支持协作取消,这会让您清理房屋。