и целью теста не является проверка работоспособности алгоритма, но в коде, нарушающем алгоритм, не было никаких изменений.
Вы не можете проверить это в случайно сгенерированных входных данных.Допустим, у вас есть набор из 100 valid_input_signals, и он не работает 5-го числа, и это нормально.Кто-то меняет алгоритм, и он начинает проходить 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
, проверяют и подтверждают, что это истинный минус (они предполагают возвращать ложь), сохраняют их в каком-то другом месте и делают для них спецификации какхорошо:
invalid_inputs.each do |input|
expect(my_detector(input).signal_present?).to be false
end
Допустим, (после ручной проверки) только 8 из них были истинно отрицательными, 2 левых должны возвращать true, но возвращать false - это могут быть ошибки.Сохраните их на потом.
Довольны ли вы охватом 1000 образцов?Сколько времени нужно, чтобы бежать?Можете ли вы обменять часть этого времени и увеличить охват до 10000 образцов?1 миллион?Это твой выбор.
В какой-то момент не имеет смысла добавлять дополнительные образцы.Теперь у вас есть общее представление о всем алгоритме, и вы можете начать базовый рефакторинг, такой как метод извлечения или , назвать магические константы и извлечь логические компоненты (упомянутые в параграфе 2 этого ответа).Тесты с X-образцами являются временными, они гарантируют (насколько это возможно при неограниченном размере выборки), что поведение всего алгоритма не меняется, пока вы высекаете его части, которые вы понимаете лучше.