Rspec并行测试控制器规范随机失败

4

当运行parallel_rspec spec时,控制器随机失败,有任何解决方案。

在Gemfile中

group :development, :test do 
  gem 'parallel_tests'  
end

我的规格执行如下:
name@root:/project# parallel_rspec spec/controllers/
4 processes for 21 specs, ~ 5 specs per process

Randomized with seed 3503

Randomized with seed 41377
 0/62 |>                                                       |  ETA: ??:??:?? 
Randomized with seed 43603
 0/50 |>                                                       |  ETA: ??:??:?? 
Randomized with seed 61169
 3/62 |==>                                                     |  ETA: 00:08:03 
  1) Admin::ReportingsController when signed-in non-admin GET #instance_reports redirects to root_url
     Failure/Error: expect( response ).to redirect_to root_url

       Expected response to be a redirect to <http://xxx/> but was a redirect to <http://yyyy>.
       Expected "http://xxxx/" to be === "http://xxxx/code".
     # ./spec/support/functions.rb:12:in `expect_root_redirect'
     # ./spec/controllers/admin/reportings_controller_spec.rb:25:in `block (4 levels) in <top (required)>'
     # ./spec/support/factory_bot.rb:18:in `block (3 levels) in <top (required)>'
     # /usr/local/bundle/gems/database_cleaner-1.7.0/lib/database_cleaner/generic/base.rb:16:in `cleaning'
     # /usr/local/bundle/gems/database_cleaner-1.7.0/lib/database_cleaner/base.rb:100:in `cleaning'
     # /usr/local/bundle/gems/database_cleaner-1.7.0/lib/database_cleaner/configuration.rb:86:in `block (2 levels) in cleaning'
     # /usr/local/bundle/gems/database_cleaner-1.7.0/lib/database_cleaner/configuration.rb:87:in `cleaning'
     # ./spec/support/factory_bot.rb:17:in `block (2 levels) in <top (required)>'

类似这样的代码会随机失败。

如果我们使用以下命令运行,则可以正常工作。

rspec spec/controllers

注意:

  • 执行时只连接单个数据库。
  • 除控制器外,一切正常。
  • 大多数与JSON相关的条件均失败。

你使用多个数据库吗?每个线程一个? - spickermann
1
你怎么期望别人回答这个问题呢?我们需要能够重现这个问题(或者至少看到足够的代码来发现潜在的错误),才能给出有意义的回复。 - Tom Lord
请查看以上输入,如果需要更多内容,请告知! - thiyaram
使用一个文件运行时,一切正常,但是当使用多个文件时,会出现像ActiveRecord::DeadlockedJSON错误响应代码不匹配等问题。但是使用parallel_rspec命令(单个文件和文件夹都可以)来测试模型和其他测试用例时,一切正常。如果我们使用以下命令,则可以正常运行:
parallel_rspec -n 1 -t rspec spec/controllers
但是对于控制器,仅使用多个进程无法正常工作。
- thiyaram
1
有可能是你的测试具有副作用,请尝试运行 bundle exec rspec --seed 61169 或将 61169 替换为任何失败的种子编号。Rspec 将尝试找到导致套件失败的最小集合,有可能是一个测试设置了环境变量,而另一个测试意外地使用了它。 - Danilo Cabello
@DaniloCabello 这个在并行测试中不起作用。种子无法控制应用程序首先接受哪个并发请求。 - Greg
1个回答

0

看起来测试假设应用程序处于一种状态,但可能已被某些并发请求更改。(我敢打赌会话是共享的,当测试您的控制器时,您认为登录的人是X,但实际上是Y)。

确保每个并行运行都是分开的,似乎所有测试都连接到同一个数据库

在执行时连接单个数据库。 在单线程应用程序中,这是有意义的,因为它在每个示例之后都会清除。但是在并行运行时,它可能会变得混乱,并且您永远无法确定数据库中的内容。

您是否像这样更改了DB配置:

test:
  database: yourproject_test<%= ENV['TEST_ENV_NUMBER'] %>

如果你错过了那个 - 那就是你的遗憾


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