【问题标题】:tests getting killed in the middle of a run using parallel_tests使用 parallel_tests 在运行过程中被杀死的测试
【发布时间】:2026-01-01 00:35:02
【问题描述】:

为了让我们的测试运行得更快,我决定使用并行测试。 https://github.com/grosser/parallel_tests

但是,与往常一样,这并非没有问题。测试在完成之前就被杀死了。

...被杀了。

继续阅读,了解我是如何解决问题的。

【问题讨论】:

    标签: ruby-on-rails testing rspec parallel-processing


    【解决方案1】:

    经过多次故障排除后,我必须准确了解发生了什么,或者至少了解 parallel_tests 是如何尝试运行我的测试的。

    Parallel_tests 为每个内核创建一个数据库。因此,如果我有 4 个可用内核,它将创建 4 个测试数据库。然后所有测试均匀分布在内核之间,并使用自己的数据库执行。

    首先,我没有使用正确的命令来设置必要的数据库。以下是对我有用的顺序。

    鉴于您的 database.yml 看起来像这样

    发展: 适配器:mysql2 编码:utf8 数据库:homestars_dev 用户名:root 密码: 测试一下 适配器:mysql2 编码:utf8 数据库:homestars_test 用户名:root 密码:

    在 database.yml 中创建 dbs 并在 dev db 中加载架构/结构

    rake db:setup 
    

    根据可用内核数创建测试数据库

    rake parallel:create
    

    将模式从开发数据库复制到每个新创建的测试数据库

    rake parallel:prepare
    

    为每个测试数据库播种

    rake parallel:seed
    

    运行测试

    rake parallel:rspec
    

    有了这个,parallel_test 开始正确地做它的事情!但是,仍然存在导致测试失败的问题。

    我使用类似于http://ariejan.net/2011/09/24/rspec-speed-up-by-tweaking-ruby-garbage-collection/的方法实现了GC延迟

    我将它调整为每 10 秒运行一次。

    出于某种原因,10 秒大约是每个核心杀死测试所需的时间!所以我去删除了启用 GC hack 的行。 (通过这样做,GC 应该在每次测试后仍然运行)

    出于某种原因,它做到了!虽然我仍然无法理解为什么会这样,但我很高兴找到了解决方案并更好地理解了问题/解决方案。

    经验教训:在运行测试之前确保您的数据库设置正确,不要使用 GC hack 来延迟它(至少在我们找到它杀死进程的原因之前)

    希望对某人有所帮助,如果您有任何进一步的信息,请加入!

    【讨论】: