Регрессионное тестирование, когда «тестовый оракул» является неформальным сравнением результатов - PullRequest
1 голос
/ 19 февраля 2012

Я поддерживаю программу на Python, которая дает советы по определенным темам. Это делается путем применения сложного алгоритма к входным данным.

Код программы регулярно изменяется, как для устранения вновь найденных ошибок, так и для изменения базового алгоритма.

Я хочу использовать регрессионные тесты. Проблема в том, что невозможно определить, какой «правильный» вывод для определенного ввода - кроме как запустить программу (и даже тогда, только если в ней нет ошибок).

Я опишу ниже мой текущий процесс тестирования. У меня вопрос , есть ли инструменты, помогающие автоматизировать этот процесс (и, конечно, если есть какие-либо другие отзывы о том, что я делаю).

В первый раз, когда программа, казалось, работала правильно для всех моих входных данных, я сохранил их выходные данные в папке, которую я назначил для «проверенных» выходных данных. «Подтверждено» означает, что, насколько мне известно, вывод является правильным для данной версии моей программы.

Если я найду ошибку, я внесу любые изменения, которые, я думаю, исправят ее. Затем я снова запускаю программу на всех входных наборах и вручную сравниваю выходные данные. Всякий раз, когда выходные данные меняются, я делаю все возможное, чтобы неофициально проанализировать эти изменения и выяснить:

  1. изменения произошли исключительно из-за исправления ошибки, или
  2. изменения произошли, по крайней мере частично, из-за новой ошибки, которую я внес

В случае 1 я увеличиваю внутренний счетчик версий. Я помечаю выходной файл суффиксом, равным счетчику версий, и перемещаю его в «проверенную» папку. Затем я фиксирую изменения в репозитории Mercurial.

Если в будущем, когда эта версия перестанет быть текущей, я решу ее разветвить, мне понадобятся эти проверенные выходные данные как «правильные» для этой конкретной версии.

В случае 2 я, конечно, пытаюсь найти недавно представленную ошибку и исправить ее. Этот процесс продолжается до тех пор, пока я не поверю, что единственные изменения по сравнению с предыдущей проверенной версией связаны с предполагаемыми исправлениями ошибок.

Когда я изменяю код для изменения алгоритма, я следую аналогичному процессу.

1 Ответ

0 голосов
/ 20 февраля 2012

Вот подход, который я, вероятно, буду использовать.

  1. Пусть Mercurial будет управлять кодом, входными файлами и результатами регрессионного теста.
  2. Начать с определенной родительской ревизии.
  3. Создание и документирование (желательно как можно меньше) модификаций.
  4. Выполнение регрессионных тестов.
  5. Просмотр различий с выходными данными родительского регрессионного теста.
  6. Если эти различия не соответствуют ожиданиям, попробуйте посмотреть, была ли введена новая ошибка или ожидания были неверными.Либо исправьте новую ошибку и перейдите к 3, либо обновите ожидания и перейдите к 4.
  7. Скопируйте выходные данные регрессионных тестов в папку, предназначенную для проверенных выходных данных.
  8. Передайте изменения в Mercurial(включая код, входные файлы и выходные файлы).
...