如何继续播种RSpec运行?

How to continue a seeded RSpec run?

有没有办法从特定点而不是从头开始重新启动种子 RSpec 运行?

当进行可能影响大型代码库中所有文件(例如 removing Bundler.require)的更改时,我想 运行 一整套 RSpec 测试,修复第一个错误,然后用相同的种子重新运行测试。

$ cd myproj
$ rspec --seed=0 --fail-fast

...

Finished in 9 minutes 59 seconds (files took 12.09 seconds to load)
9999 examples, 1 failure, 0 pending

Failed examples:

rspec ./spec/my_class_spec.rb:22 # MyClass #my_method

Randomized with seed 0

此时我意识到 my_class.rb 少了一个 require。我修复了它,但我不想再次 运行 前面的 9998 个通过示例。

我希望能够指定一个起点,像这样:

$ rspec --seed=0 --from='./spec/my_class_spec.rb:22' --fail-fast

或者,如果rspec能够判断最后一次失败,这样就更好了:

$ rspec --seed=0 --continue --fail-fast

显然 运行 种子通常不是好的做法,因为测试不应该依赖于顺序,但它确实允许可重复性,这正是我现在正在寻找的。

RSpec 不支持 --continue 标志。它必须在 运行 秒之间保持一些状态,关于最后一个 运行 在整个套件中到达了多远。它不会这样做(而且我们也没有这样做的计划)但是有人可以很容易地编写一个扩展来做到这一点。

也就是说,即将发布的 RSpec 3.3 包含一项支持类似但略有不同的工作流程的新功能:--next-failure:

https://relishapp.com/rspec-staging/rspec-core/docs/command-line/only-failures

使用 --next-failure,您可以按照以下方式实现与您所要求的类似的工作流程:

  1. 运行 rspec 到 运行 整个套件。它会记录所有已执行示例的 last_run_status,以便它知道哪个失败了。
  2. 重复 运行 rspec --next-failure(或者 rspec --next-failure --seed 0 如果你想强制一个特定的 运行dom 排序而不是使用定义的顺序)。 RSpec 将过滤掉 运行 上次 运行 失败的例子,一旦失败就会中止。

通过使用 --next-failure 重复 运行ning rspec,您可以单独解决每个故障,而无需支付 运行ning 整个套件的费用。

请注意,要使用此新功能,您首先必须配置 example_status_persistence_file_path,以便 RSpec 知道在哪里保留每个示例的最后 运行 状态。