10秒对于任何单个测试来说都是很长的时间。我的直觉是您的规格目标同时运行单元测试和集成测试。这是项目陷入的典型情况,在某个阶段,如果您想更快地生产更多产品,就需要克服这一技术难题。有很多策略可以帮助您实现这一目标...并且我将推荐一些我过去使用过的策略。
1.将单元与集成测试分开
我要做的第一件事是将单元测试与集成测试分开。您可以通过以下方式进行此操作:
- 移动它们(到spec目录下的单独文件夹中)-并修改rake目标
- 标记它们(rspec允许您标记测试)
我们的理念是,您希望常规构建能够快速进行-否则人们不会太乐于经常运行它们。所以回到那个领域。使常规测试快速运行,并使用连续集成服务器运行更完整的版本。
集成测试是涉及外部依赖项(例如,数据库,WebService,Queue,有些会争辩FileSystem)的测试。单元测试仅测试要检查的特定代码项。它应该运行得很快(可能在45秒内达到9000),即大多数应在内存中运行。
2.将集成测试转换为单元测试
如果单元测试的大部分小于集成测试套件,则您有问题。这意味着不一致将更容易出现。因此,从这里开始创建更多的单元测试以替换集成测试。您可以在此过程中提供帮助的事情是:
- 使用模拟框架而不是实际资源。Rspec具有内置的模拟框架。
- 在单元测试套件上运行rcov。用它来衡量您的单元测试套件的彻底程度。
一旦您有适当的单元测试来替换集成测试,请删除集成测试。重复测试只会使维护工作更糟。
3.不要使用灯具
治具是邪恶的。请改用工厂(机械师或factorybot)。这些系统可以构建更具适应性的数据图,更重要的是,它们可以构建可使用的内存中对象,而不是从外部数据源中加载内容。
4.添加检查以停止单元测试成为集成测试
现在您已经有了更快的测试,是时候进行检查以阻止这种情况再次发生了。
有一些库,它们在尝试访问数据库(UnitRecord)时会猴子修补活动记录以引发错误。
您还可以尝试配对和TDD,这有助于迫使您的团队编写更快的测试,因为:
- 有人在检查-所以没人会偷懒
- 正确的TDD需要快速反馈。缓慢的测试只会使整个过程痛苦不堪。
5.使用其他图书馆来解决问题
有人提到spork(加快在rails3下测试套件的加载时间),hydra / parallel_tests-并行(跨多个内核)运行单元测试。
这可能应该在最后使用。您真正的问题一直在步骤1、2、3中解决。您将可以更好地发挥其他基础设施的作用。