Регрессионное тестирование, когда тестовый оракул является неформальным сравнением результатов

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

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

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

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

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

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

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

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

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

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

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


person max    schedule 19.02.2012    source источник


Ответы (1)


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

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