使用集成和单元测试的整个测试套件的 FactoryGirl 和 DatabaseCleaner 最佳实践

FactoryGirl and DatabaseCleaner best practices for entire test suite using integration and unit tests

我有一个 Rails 测试套件,它使用 DatabaseCleanerFactoryGirlCapybara-Webkit。当 运行 连接套件时,我的所有测试都在我的机器上通过,包括 运行 并行连接它们时 (parallel_rspec)。

当我推送到 CI (circleci) 时,我的集成测试总是失败。我怀疑这是因为我在单元测试(控制器、服务、视图等)中使用了 transaction 策略。也许这是一种不好的做法,但如果我需要在我的控制器中使用一个模型(例如),我一直在做 FactoryGirl.create(:my_model)。但我怀疑我使用 FactoryGirl 创建模型的每个地方我也应该让该测试在 DatabaseCleaner 中使用 truncation 策略。

我刚刚将我的整个套件标记为使用 truncation 并推送到 CI,它是绿色的,这很棒,但现在套件需要 50% 的时间才能达到 运行。

因此,当使用 FactoryGirl 实例化 ActiveRecord 模型时,我是否应该 ALWAYS 将这些测试标记为使用 truncation

感谢您的所有反馈。

需要标记为使用t运行cation(或删除)的测试是通过多连接访问数据库的测试。当使用 Capybara 进行功能测试时,通常是使用 rack-test 以外的驱动程序进行的任何测试,因为它们 运行 应用程序在一个单独的线程中,该线程获得它自己的数据库连接,并由推荐的 [=20] 处理=] config - https://github.com/DatabaseCleaner/database_cleaner#rspec-with-capybara-example(使用append_after用于开始清理的块非常重要)

其他类型的测试通常不会创建多个线程或连接,因此通常不需要 t运行cation(并且这些测试中所需的数据通常使用 FactoryGirl build_stubbed 方法 find 模拟到 return 存根对象并完全绕过数据库)。

此外,如果测试在您的机器上通过,它们应该在 CI 上通过,因为我假设您在您的机器上使用与 CI 相同的数据库清理方法,所以我猜它是更多的是时间问题。

此外,对于 DatabaseCleaner,一旦您在 CI 容器中设置了该方法,整个 运行 都会以这种方式设置,因此最好 运行 您的单元测试在与您的 features/system 测试不同的容器。