当结果为随机时,运行两次rspec测试

当结果为随机时,运行两次rspec测试,rspec,Rspec,我有一个99%置信限的算法。所以如果我设置一个这样的测试 let(:valid_input_signal) { randomly_generate_signal_plus_noise } it { expect(my_detector(valid_input_signal).signal_present?).to be true } 它将失败1%的时间。我可以编写一个测试,在数千个有效的输入信号上运行我的_检测器,并检查它只失败1%的时间,但这将需要很长时间才能运行,测试的目的不是检查算法是否

我有一个99%置信限的算法。所以如果我设置一个这样的测试

let(:valid_input_signal) { randomly_generate_signal_plus_noise }
it { expect(my_detector(valid_input_signal).signal_present?).to be true }
它将失败1%的时间。我可以编写一个测试,在数千个有效的输入信号上运行我的_检测器,并检查它只失败1%的时间,但这将需要很长时间才能运行,测试的目的不是检查算法是否工作,但代码中没有任何改变破坏了算法

我认为实现这一点的有效方法是再次运行上面的测试,如果它通过了,那么就给它一个通过。如果它第二次失败,那么就给它一个失败,因为假设基数是正确的,它连续失败两次的几率是1/10000。当然,这意味着在有效的代码基础上,组合测试的失败率为10000分之一,但这比目前的情况要好得多,目前100分之一的测试失败

rspec中是否有办法做到这一点,即如果第一次失败,则第二次运行测试,如果第二次失败,则仅输出失败?

尝试以下方法:

describe '#my_decorator' do
  let(:valid_input_signal_1) { randomly_generate_signal_plus_noise }
  let(:valid_input_signal_2) { randomly_generate_signal_plus_noise }

  it 'should not fail twice in a row' do
    fail unless my_detector(valid_input_signal_1).signal_present? || my_detector(valid_input_signal_2).signal_present?
  end
end
测试的目的不是检查算法的工作情况,但是代码中没有改变算法

您不能在随机生成的输入数据中测试这一点。假设你有一组100个有效的输入信号,它在第5个信号上失败了,一切正常。有人改变了算法,它在5号开始通过,17号失败。它在1%的情况下仍然失败,但它仍然正确吗

如何从这里继续下去并不明显——这取决于算法的功能。也许您可以将一些部件提取到单个责任组件中,并单独测试它们

但也许这是一个遗留算法,你需要尽可能多地使用规范来覆盖它?如果是这样的话,我会用速度换取覆盖率:

生成1000个信号,并保存
my_检测器的信号(有效的输入信号)。信号存在?==true
,将其保存在文件或其他文件中,并针对这些确定性输入运行规范

valid_inputs.each do |input| 
  expect(my_detector(input).signal_present?).to be true
end
假设有10个生成的结果为假,检查并确认为真阴性(假设返回假),将它们保存在其他位置,并为它们制作规格:

invalid_inputs.each do |input| 
  expect(my_detector(input).signal_present?).to be false
end
比如说(手动检查后),其中只有8个是真阴性,剩下的2个应该返回真,但返回假-这些可能是错误。留着以后用

你对1000个样品的覆盖范围满意吗?磨合需要多长时间?你能在这段时间内交易一部分,并将覆盖范围扩大到10000个样品吗?一百万?这是你的选择


在某些情况下,添加更多样本是没有意义的。现在,你对整个算法有了粗略的覆盖,你可以开始一些基本的重构,比如,或者提取逻辑组件(在这个答案的第2条中提到)。X样本测试是临时性的,它们确保(在非无限样本大小的情况下尽可能多地)整个算法的行为不会改变,而您可以凿去您更了解的部分

我在某个地方读到过这种方法,它不是我的发明,但我现在找不到。我想我读到的那篇文章的作者称之为
骨架测试
,但没有有意义的搜索结果。如果我想到了更多细节,我会发布链接。根据我的经验,像我正在使用的这样的测试可能有助于检测破坏算法的多种类型的更改。它不能证明所有的改变都是正确的,但这不是它的目的。不过,你的讨论可能会引起兴趣,所以我把它投了赞成票。是的,你是对的。但随机性带来了片状,这是一个问题。它打破了你和其他团队的流程,许多不稳定(假阴性)的规格可能会导致人们开始忽略不合格的规格等。这是一种权衡,总是这样:)