Система поддержки регрессионного тестирования
Структура системы поддержки регрессионного тестирования представлена на рис. 14.1. Исходный код обеих версий тестируемой программы хранится под управлением системы контроля версий. Для отбора тестов по методу покрытия точек использования неисполняемых определений средствами системы контроля версий создается файл различий, на основании которого вычисляется список добавленных, измененных и удаленных строк исходного кода, который является удобной формой представления множества ?P. Затем производится перебор этого списка. Если какая-либо строка списка представляет собой макроопределение, осуществляется поиск строк кода, содержащих использование этого макроопределения по всему тексту тестируемой программы; найденные строки присоединяются к множеству ?P. Расширенное множество ?P сопоставляется с результатами прогона тестов из множества T на предыдущей версии программы. Если в ходе выполнения какого-либо теста ti получала управление хотя бы одна строка, входящая в множество ?P, тест ti отбирается для повторного запуска.
При создании новых тестов по методу "подозрительных" состояний функция тестируемой программы, содержащая цикл обработки событий, дополняется операторами вывода значений глобальных и видимых локальных переменных. Запуск тестов из множества T' на профилированной версии программы позволяет получить список ее состояний. Этот список анализируется, и для каждого ранее не наблюдавшегося состояния вычисляется список переменных, изменившихся по сравнению с каким-либо известным состоянием. Множество ?P дополняется строками кода, где используются переменные из этого списка. Для каждого состояния указываются тесты, запуск которых необходим. Наконец, создается список рекомендованных новых тестов в форме, удобной для восприятия человеком.
Выходные данные каждой программы-обработчика доступны пользователю, что позволяет контролировать промежуточные результаты работы системы. К примеру, можно исключить из рассмотрения переменные, которые, хотя и изменяются в ходе выполнения программы, на ее состояние не влияют. Архитектура системы позволяет легко расширять функциональность; например, для поддержания какой-либо новой системы контроля версий достаточно создать один новый модуль объемом около 100 строк кода. Остальные модули можно использовать без изменений.
Типовой сценарий проведения регрессионного тестирования программ, написанных на языке C, с применением описанной выше системы состоит из следующих этапов:
- Вычисляется множество ?P строк исходного кода, добавленных, удаленных или измененных по сравнению с предыдущей версией.
- Множество ?P дополняется строками, непосредственно не изменявшимися, но содержащими ссылки на измененные макроопределения
- Вычисляется упорядоченное множество регрессионных тестов T', для которых ?iT' Ti, j - 1??P, где Ti, j-1 - множество строк исходного кода продукта, получающих управление в ходе выполнения теста i на версии системы j-1. Тесты упорядочиваются по убыванию количества измененных строк в пути их исполнения.
- Вычисляется список глобальных и локальных переменных, определяющих состояние программы s. Исходный код тестируемой программы модифицируется так, что информация о состоянии s (значения глобальных, статических и локальных переменных) выводится во внешний файл перед запуском теста и после его окончания.
- Новые тесты и тесты из множества T' (регрессионные тесты) исполняются на текущей версии продукта j.
- Тесты, проверяющие нештатные режимы работы продукта, т.е. создающие состояния, в которых дальнейшая работа продукта невозможна в соответствии со спецификацией требований, исключаются из рассмотрения. Если известно, что ни один тест не приводит к возникновению нештатных состояний, данный этап может быть опущен
- Для каждого теста i вычисляется множество Tij.
- Обрабатываются результаты выполнения тестов, и создается множество Sj, состоящее из начального состояния s0 и всех наблюдавшихся конечных состояний. Вычисляется множество Nj= Sj\Sj-1 всех новых по сравнению с предыдущими версиями состояний, которое является "подозрительным" с точки зрения наличия ошибок, и вектора их отличий от исходного состояния s0, т.е. переменные, измененные по сравнению с s0.
- Множество измененных строк исходного кода ?P дополняется номерами строк, где используются заданные переменные
- Если Nj =, цикл работы завершается. Если Nj , следует перейти к шагу 4 или, если счетчик количества итераций работы системы превышает некоторое заданное предельное значение, известить об этом пользователя. Пользователь может принять решение о прекращении тестирования или пропуске некоторого числа циклов.
Рис. 14.1. Структура системы поддержки регрессионного тестирования.
Если этап 6 выполняется автоматически, а этап 7 можно опустить, возможна полная автоматизация регрессионного тестирования.