很多时候,人们编写的测试在弄乱状态时不会自行清理。通常这无关紧要,因为对于大多数测试而言,对象往往会被拆除并重新创建,但在某些不幸的情况下,对象的全局状态会在整个测试运行期间持续存在,并且当您运行测试时,这取决于和修改那个全局状态,按照某种顺序,他们失败了。
这些测试和可能的实现显然需要修复,但是当相互影响的测试可能不是完整测试套件中唯一的东西时,试图找出导致失败的原因是一件痛苦的事情。当最初不清楚故障是否与顺序相关,并且可能间歇性地或在一台机器上而不是另一台机器上失败时,这尤其困难。例如:
rspec test1_spec.rb test2_spec.rb # failures in test2
rspec test2_spec.rb test1_spec.rb # no failures
在 RSpec 1 中有 some options (--reverse, --loadby)用于订购测试运行,但这些已在 RSpec 2 中消失无论如何,对调试这些问题的帮助微乎其微。
我不确定 RSpec 1 或 RSpec 2 默认使用的顺序,但我过去使用的一个定制设计的测试套件在每次运行时随机排序测试,以便更快地发现这些故障。在测试输出中,用于确定排序的种子与结果一起打印,因此即使您必须做一些工作来缩小套件中导致失败的个别测试的范围,也很容易重现失败。然后有一些选项允许您按顺序在任何给定的测试文件处开始和停止,这使您可以轻松地进行二进制搜索以找到有问题的测试。
我没有在 RSpec 中找到任何这样的实用程序,所以我在这里问:人们找到了哪些调试这些类型的顺序相关测试失败的好方法?
最佳答案
现在有一个 --bisect
标志,它将找到要运行的最小测试集以重现故障。尝试:
$ rspec --bisect=verbose
与它一起使用 --fail-fast
标志可能也很有用。
关于ruby - 是否有调试 RSpec (RSpec2) 中顺序相关测试失败的好方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5946042/