Регрессионное тестирование, когда "тестовый оракул" является неформальным сравнением результатов
Я поддерживаю программу Python, которая дает советы по определенным темам. Это делается путем применения сложного алгоритма к входным данным.
Программный код регулярно изменяется, как для устранения вновь найденных ошибок, так и для изменения базового алгоритма.
Я хочу использовать регрессионные тесты. Проблема в том, что нет способа определить, что является "правильным" выводом для определенного ввода - кроме как при запуске программы (и даже тогда, только если в ней нет ошибок).
Я опишу ниже мой текущий процесс тестирования. У меня вопрос, есть ли инструменты, помогающие автоматизировать этот процесс (и, конечно же, если есть какие-либо другие отзывы о том, что я делаю).
В первый раз, когда программа, казалось, работала правильно для всех моих входных данных, я сохранил их результаты в папке, которую я обозначил для "проверенных" выходов. "Подтверждено" означает, что, насколько мне известно, вывод является правильным для данной версии моей программы.
Если я найду ошибку, я внесу любые изменения, которые, я думаю, исправят ее. Затем я повторно запускаю программу на всех входных наборах и вручную сравниваю выходные данные. Всякий раз, когда выходные данные меняются, я делаю все возможное, чтобы неофициально рассмотреть эти изменения и выяснить:
- изменения произошли исключительно из-за исправления ошибки, или
- изменения произошли, по крайней мере частично, из-за новой ошибки, которую я представил
В случае 1 я увеличиваю внутренний счетчик версий. Я помечаю выходной файл суффиксом, равным счетчику версий, и перемещаю его в "проверенную" папку. Затем я фиксирую изменения в репозитории Mercurial.
Если в будущем, когда эта версия перестанет быть текущей, я решу ее разветвить, мне понадобятся эти проверенные выходные данные как "правильные" для этой конкретной версии.
В случае 2 я, конечно же, пытаюсь найти недавно внесенную ошибку и исправить ее. Этот процесс продолжается до тех пор, пока я не поверю, что единственные изменения по сравнению с предыдущей проверенной версией связаны с исправлением предполагаемых ошибок.
Когда я изменяю код для изменения алгоритма, я следую аналогичному процессу.
1 ответ
Вот подход, который я, вероятно, буду использовать.
- Пусть Mercurial управляет кодом, входными файлами и результатами регрессионного теста.
- Начните с определенной родительской ревизии.
- Сделайте и задокументируйте (желательно как можно меньше) изменений.
- Запустите регрессионные тесты.
- Просмотрите различия с результатами родительского регрессионного теста.
- Если эти различия не соответствуют ожиданиям, попробуйте посмотреть, была ли введена новая ошибка или ожидания были неверными. Либо исправьте новую ошибку и перейдите к 3, либо обновите ожидания и перейдите к 4.
- Скопируйте результаты регрессионных тестов в папку, предназначенную для проверенных результатов.
- Зафиксируйте изменения в Mercurial (включая код, входные файлы и выходные файлы).