【发布时间】:2026-01-01 00:35:02
【问题描述】:
为了让我们的测试运行得更快,我决定使用并行测试。 https://github.com/grosser/parallel_tests
但是,与往常一样,这并非没有问题。测试在完成之前就被杀死了。
...被杀了。
继续阅读,了解我是如何解决问题的。
【问题讨论】:
标签: ruby-on-rails testing rspec parallel-processing
为了让我们的测试运行得更快,我决定使用并行测试。 https://github.com/grosser/parallel_tests
但是,与往常一样,这并非没有问题。测试在完成之前就被杀死了。
...被杀了。
继续阅读,了解我是如何解决问题的。
【问题讨论】:
标签: ruby-on-rails testing rspec parallel-processing
经过多次故障排除后,我必须准确了解发生了什么,或者至少了解 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 来延迟它(至少在我们找到它杀死进程的原因之前)
希望对某人有所帮助,如果您有任何进一步的信息,请加入!
【讨论】: