我有一个使用DatabaseCleaner
,FactoryGirl
和Capybara-Webkit
的Rails测试套件。运行套件时,我的所有测试都会在我的机器上传递,包括并行运行它们(parallel_rspec
)。
当我推送CI(circleci)时,我的集成测试总是失败。我怀疑是因为我在单元测试中使用transaction
策略(控制器,服务,视图等)。也许这是一个不好的做法,但如果我需要我的控制器中的模型(例如),我一直在做FactoryGirl.create(:my_model)
。但我怀疑我使用FactoryGirl创建模型的每个地方我也应该在DatabaseCleaner中使用truncation
策略进行测试。
我只是将整个套件标记为使用truncation
并推送到CI并且它是绿色的,这很棒,但现在该套件需要花费50%的时间来运行。
因此,在使用ActiveRecord
实例化FactoryGirl
模型时,我是否始终标记要使用truncation
的测试?
感谢您提供任何反馈意见。
答案 0 :(得分:0)
需要标记为使用截断(或删除)的测试是通过多个连接访问数据库的测试。当使用Capybara进行功能测试时,通常使用除了机架测试之外的驱动程序的任何测试,因为它们在一个单独的线程中运行应用程序,该线程获得它自己与数据库的连接,并由推荐的database_cleaner配置处理 - {{3} (对于开始清理的块使用build_stubbed
非常重要)
其他类型的测试通常不会创建多个线程或连接,因此通常不需要截断(这些测试中所需的数据通常使用FactoryGirl find
方法和{{1}}构建。模拟返回存根对象并完全绕过数据库)。
此外,如果测试在你的机器上传递,他们应该传递CI,因为我假设你在你的机器上使用与CI相同的数据库清理方法,所以我猜这更像是一个时间问题。
答案 1 :(得分:0)
同样使用DatabaseCleaner,一旦在CI容器中设置方法,就会为整个运行设置这种方式,因此最好在单独的容器中运行单元测试而不是功能/系统测试。