当结果是随机的两次时,运行RSPEC测试



我的算法以99%的置信度限制工作。因此,如果我设置这样的测试

let(:valid_input_signal) { randomly_generate_signal_plus_noise }
it { expect(my_detector(valid_input_signal).signal_present?).to be true }

它将失败1%。我可以编写一项测试,该测试在数千个有效的输入信号上运行my_detector,并且检查它的时间仅为1%,但这需要很长的时间来运行,并且测试的目的不是检查算法,而是检查算法,而是要运行。代码中没有破坏算法的变化。

我认为,实现这一目标的一种有效方法是第二次运行上述测试,如果它通过,请通过。如果第二次失败,请给它失败,因为假设基地正确为10,000分之一,则连续两次失败。当然,这意味着合并测试的10,000倍将在有效的代码基础上失败,但这比目前要好得多,其中100倍的测试失败。

因此,RSPEC是否有办法执行此操作,即如果第一次失败,则第二次进行测试,并且仅在第二次失败时输出失败?

测试的目的不是检查算法的作品,而是没有破坏算法的代码上的更改。

您无法在随机生成的输入数据中测试它。假设您有一组100个有效的_input_signals,它在第五个失败了,没关系。有人更改了该算法,它开始以第5次传递,并于17日失败。在1%的情况下,它仍然失败,但仍然正确吗?

如何从这里继续进行并不明显 - 这取决于算法的作用。也许您可以将其中一些零件提取成单个责任组件并孤立地测试它们?

,但也许这是一种旧算法,您需要尽可能多地使用规格介绍它?如果是这样 - 我将交易覆盖范围:

生成1000个信号,并保存 my_detector(valid_input_signal).signal_present? == true,将它们保存在文件或其他物体中,然后针对确定性的输入来运行规格。

valid_inputs.each do |input| 
  expect(my_detector(input).signal_present?).to be true
end

说,生成的10个给出了false,检查并确认它是一个真正的负面(他们应该返回false),将它们保存在其他地方,并为它们制作规格:

invalid_inputs.each do |input| 
  expect(my_detector(input).signal_present?).to be false
end

假设(手动检查之后)只有8个是真正的负面,剩下的2个应该返回true,但返回false-可能是错误。保存以后。

您对1000个样本的覆盖范围感到满意吗?跑去需要多长时间?您可以在这段时间交易并将覆盖范围增加到10000个样品吗?百万?这是你的选择。

在某个时候添加更多样本是没有意义的。现在,您对整个算法进行了粗略的覆盖范围,并且可以启动一些基本的重构方法,例如提取方法或名称魔术常数并提取逻辑组件(在本答案的第2款中提到)。X样品测试是暂时的,它们确保(尽可能多地使用无限样本量)确保整个算法的行为不会改变,而您可以更好地理解它的一部分。

尝试以下:

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

最新更新