如何加速RSpec和Factory Girl模型测试?

3

我目前在使用FactoryGirl和Rspec测试我的模型,这很好,但是非常慢。每个模型都有数百个测试,每个测试需要大约30秒才能运行。

核心问题在于,当我创建一个用于测试的对象时,我使用的是FactoryGirl.create()方法。这会访问数据库,肯定比使用buildbuild_stubbed慢。但是如果我只使用build,那么我就永远不会知道是否遇到了数据库错误(例如尝试将空值写入我指定为非空的列)?

有没有办法兼顾两者?或者我应该在模型/单元测试之外的某个地方显式地测试数据库集成部分?

3个回答

3

不知道这是否适用于你的情况,但你是否考虑过调整你的 spec_helper.rb 文件以使测试套件运行更快?

我在这个StackOverflow答案中记录了我的spec_helper.rb文件的演变(特别是查看编辑4部分),那里列出的其他SO答案和博客的链接对我帮助很大,有助于减少套件运行时间。


1
阅读了那个链接和一些交叉帖子后,我发现了这个:http://37signals.com/svn/posts/2742-the-road-to-faster-tests它对我帮助很大,所以感谢你间接地帮我找到了它。 - Bryce

1

在模型规范中,我倾向于使用FactoryGirl.build或者只是.new来创建实例,然后仅在测试需要检查需要持久化实例的某些行为时才保存它们。

当使用关联或连接时,必须存在行ID,这可能会有问题。这是一种权衡——快速测试与易于编写的测试之间的权衡。


0

大多数情况下,您应该使用构建(build)方法。如果您想确保某个值不会保存为 null,请专门为此编写一些规范,而不是总是在数据库上创建对象。

如果您测试工厂一次创建有效对象,则可以信任工厂始终创建有效对象。

此外,对于不能为 null/nil 的字段,始终使用存在性验证。如果您的字段不为 nil,则可以确保数据库不会有 null 值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接