Регрессионное тестирование в C ++ - PullRequest
7 голосов
/ 22 июня 2009

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

Я мог бы использовать библиотеку (C ++) для организации всего этого. Вы знаете кого-нибудь? Вместе с файлами дампа это обеспечило бы дешевый, массивный модульный тест.

Самая громоздкая вещь - это процедуры сериализации. Иногда я просто выкидываю состояние памяти, но когда оно отличается, сложно восстановить его. Поэтому я перешел на другой метод. Теперь, на этапе сравнения, я считываю дамп памяти в «фантомный» объект и запускаю специализированный метод diff (оператор == с расширенным отчетом об ошибках), который иногда проще написать, чем сериализовать в читаемый человеком текстовый формат.

В основном я чувствую, что изобретаю велосипед, поэтому мои вопросы довольно общие:
Как вы проводите регрессионное тестирование (если вы это делаете)?
Вы используете какую-либо библиотеку / инструментарий?
Вы когда-нибудь реализовывали его для своих нужд?

И просто из любопытства:
Вы когда-нибудь хотели провести регрессионное тестирование, но что-то вас остановило?

Ответы [ 3 ]

2 голосов
/ 22 июня 2009

Проверьте расширение Сериализация Библиотека. Это позволит вам вывести свои файлы в формат xml, который затем можно будет различать для каждой версии.

Чтобы создать тестовые наборы, если вы этого еще не сделали, используйте gcov для определения покрытия ваших функций. Это, по крайней мере, гарантирует, что в вашей функции есть все операторы.

Модульное тестирование

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

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

2 голосов
/ 22 июня 2009

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

Когда я работаю, я обычно пишу простые тестовые случаи в нашем тест-трекере, чтобы сделать регрессионные тесты как можно более легкими (особенно для не-меня людей:).

1 голос
/ 18 июля 2009

ОК, здесь обсуждаются три вещи: подгонка тестов к унаследованному коду, модульное тестирование и приемочное / регрессионное тестирование, все на C ++.

Во-первых, для того, чтобы взять унаследованный код и подогнать к нему тесты, я рекомендую приобрести копию «Эффективной работы с унаследованным кодом» Майкла Фезерса. Это потрясающая книга, которая научит вас, что любой унаследованный код может быть протестирован модулем! Я использовал методы из этой книги, чтобы приспособить тесты к вещам, которые, как говорили все, не могли быть модульными, но я все равно сделал это :-).

Во-вторых, для модульного тестирования на C ++ я только что написал серию постов из 5 статей, в которых подробно описывается, как это сделать с помощью Visual Studio: Модульное тестирование на C ++ с Boost.Test .

Наконец, для приемочного / регрессионного тестирования я успешно использовал Fitnesse. Это в основном фреймворк для приемочных испытаний, который использует вики для организации и написания тестов. Страница вики просматривается и анализируется, чтобы превратить вызовы в тестовое устройство, которое вы пишете. Приспособление для тестирования затем становится посредником между тестом, как описано на странице вики, и вашим рабочим кодом. Я использовал этот механизм для выполнения регрессионных тестов во всем приложении сквозным. Объедините это с юнит-тестами для изменяемых вами классов и очень мощным механизмом обнаружения ошибок. Регрессионные тесты сжимают сверху, а модульные тесты сжимают снизу, а ошибки фиксируются в середине! Это отлично сработало для меня.

Получить основной дистрибутив fitnesse от fitnesse.org Вы можете получить C ++ runner для FitNesse от sourceforge . (Я являюсь разработчиком этого проекта.) Мы еще не добавили поддержку SLIM, которая есть в основной вики фитнеса, но у нас есть хорошая поддержка для нескольких приборов. Мы надеемся добавить поддержку SLIM в ближайшее время. У меня есть элементарная реализация, которую нужно завершить.

...