mmr*_*ins 15 ruby testing unit-testing rspec rspec2
很多时候,人们会编写那些在状态混乱时不会自行清理的测试.通常这并不重要,因为对象往往被拆除并为大多数测试重新创建,但是有一些不幸的情况是对象的全局状态持续整个测试运行,并且当您运行测试时,依赖于并修改那个全球国家,按照一定的顺序,就会失败.
显然需要修复这些测试和可能的实现,但是当相互影响的测试可能不是完整测试套件中的唯一内容时,尝试找出导致失败的原因是很痛苦的.当最初没有清楚故障是依赖于顺序的,并且可能间歇性地或在一台机器而不是另一台机器上失败时,这是特别困难的.例如:
rspec test1_spec.rb test2_spec.rb # failures in test2
rspec test2_spec.rb test1_spec.rb # no failures
Run Code Online (Sandbox Code Playgroud)
在RSpec 1中,有一些选项( - 反向, - loadby)用于订购测试运行,但是这些选项在RSpec 2中已经消失,并且在调试这些问题方面只是极少有用.
我不确定RSpec 1或RSpec 2默认使用的顺序,但我过去使用的一个定制设计的测试套件在每次运行时随机排序测试,以便更快地发现这些故障.在测试输出中,用于确定排序的种子打印了结果,因此即使您必须做一些工作来缩小导致它们的套件中的单个测试,也很容易重现故障.然后有选项允许您按顺序启动和停止任何给定的测试文件,这使您可以轻松地进行二进制搜索以查找问题测试.
我没有在RSpec中找到任何这样的实用程序,所以我在这里问:人们发现调试这些类型的依赖于顺序的测试失败有什么好方法?
Jos*_*eek 10
现在有一个--bisect标志,它将找到运行以重现故障的最小测试集.尝试:
$ rspec --bisect=verbose
Run Code Online (Sandbox Code Playgroud)
使用--fail-fast标志也可能有用.
我不会说我有一个好的答案,我想在这里找到一些比我更好的解决方案.那说......
我调试这些问题的唯一真正技巧是在每次测试之前和之后添加一个全局(通过spec_helper)钩子来打印数据库状态的某些方面(我常见的罪魁祸首)(条件是检查我是否关心).最近的一个例子是在我的spec_helper.rb中添加这样的东西.
Spec::Runner.configure do |config|
config.before(:each) do
$label_count = Label.count
end
config.after(:each) do
label_diff = Label.count - $label_count
$label_count = Label.count
puts "#{self.class.description} #{description} altered label count by #{label_diff}" if label_diff != 0
end
end
Run Code Online (Sandbox Code Playgroud)
4 年后发现了我自己的问题,现在 rspec 有一个--order标志,可以让您设置随机顺序,如果您遇到顺序相关的失败,则可以--seed 123在每次规范运行时打印种子的顺序来重现顺序。
https://www.relishapp.com/rspec/rspec-core/v/2-13/docs/command-line/order-new-in-rspec-core-2-8
| 归档时间: |
|
| 查看次数: |
2557 次 |
| 最近记录: |