2017-09-30 24 views
2

我们使用Travis CI在git上维护我们的项目。这里的问题是特拉维斯我们有2个进程运行规范的随机选择,各有不同的种子数,现在时有故障,我尝试运行:Rspec无法重现失败,即使使用最小的对分命令

  1. 与种子数
  2. 确切规格没有种子数的确切规格
  3. 与种子数
  4. 与种子数的规范文件和规范文件--bisect
  5. 规范文件,而无需一个种子数但--bisect

在上面的5个场景中,无论是本地的,还是在调试travis版本时,甚至在ssh上,我发现没有失败,平分总是失败。

同样在一个完全不同的场景中,如果我使用默认的8个进程运行并行:spec,我确实遇到了故障,但是如果我用'rspec'cmd单独运行,则不会失败。

我也试过在本地运行parallel:spec,而在我们应用程序的根目录下的.parallel-spec文件中有--bisect选项。我得到的最低限度的复制命令仍然没有失败。

我在这里错过了什么?这个问题是否与运行多个进程有关,并且必须使用rspec运行最少的重现行?因为目前看来,如果规格在超过1个过程中运行,我永远无法重现失败的规格。另一方面,如果本地我运行rspec --bisect 8小时后,我发现它还没有开始1过程,即使我在macbook pro(但是我们有4k左右的规格)

p.s.我们在轨道上4.2.7.1,红宝石2.3.3和RSpec 3.4.4

感谢

更新:跑平行规范详细,以获得规范秩序,然后跑在一个规范的失败过程中的命令种子编号然后再与种子编号和 - 等分。仍然没有失败。

回答

0

在这些5件事你试试我不能看到Try to run all the specs from the process with the seed

这可能是你的规格互相干扰,如果规格A为规范B之前运行,这将导致B到失败... 或者即使A在B之前运行,也会导致C失败。

所以如果你用种子从一个进程运行所有的规格 - 也许你会重现失败 - 只有你运行--bisect的同样的东西来找到给你失败的最小集合。

如果您不能以这种方式复制它 - 我可以看到另一个选项:您的并行规格使用共享资源(DB,文件?),失败是由竞争条件引起的。这些很难找到 - 特别是在规格之间。确保每个进程实际上都使用一个单独的数据库(简单的错误,比如忘记更改database.yml会导致这种错误)。

如果这没有帮助 - 请检查您的代码是否有其他可能的共享资源。 你没有提到有多少规格通常会失败。如果这个数字很小 - 你可以专注于这些。

+0

谢谢。实际上,我昨天只是试着从种子的过程中运行规格,还有另一次种子和二等分,但仍然没有失败,我刚才更新了我的问题中的这一部分。 关于失败,他们是随机的不幸的是,每次我并行运行它们,新的失败,我实际上最初解决了大部分这些随机失败,当我运行规范并行时,一切似乎都崩溃了,只能让我得出一个结论这可能是由于spec文件中的干燥。 – Shalaby

+0

我调查了数据库每个进程看到一个单独的数据库预期。我认为就并行流程而言,每个规范都需要用自己的对象隔离,而不是全局声明对象,并且所有规范都使用这些对象。我将不得不重构可能的所有规格,但我从Bakir关于并行执行的文章中得到了这里:https://www.atlantbh.com/blog/parallel-test-execution/ 现在我不完全共享文件规格但我分享对象。我将不得不测试这个理论并开始重构我猜 – Shalaby

+0

你如何在进程之间共享对象? – meta