Я управляю тестированием очень крупной финансовой системы ценообразования. Недавно наш штаб настаивал на том, чтобы мы убедились, что каждая часть нашего проекта имеет значимый тест на месте. По крайней мере, им нужна система, которая гарантирует, что когда мы что-то изменяем, мы можем обнаружить непреднамеренные изменения в других подсистемах. Предпочтительно они хотят что-то, что подтверждает правильность каждого компонента в нашей системе.
Очевидно, что это будет довольно много работы! Это может занять годы, но для такого проекта это того стоит.
Мне нужно выяснить, какие части нашего кода не охвачены ни одним из наших модульных тестов. Если бы я знал, какие части моей системы не тестировались, я мог бы приступить к разработке новых тестов, которые в конечном итоге приблизились бы к моей цели полного охвата тестированием.
Так, как я могу провести такой анализ. Какие инструменты мне доступны?
Я использую Python 2.4 на Windows 32bit XP
UPDATE0:
Просто чтобы уточнить: у нас есть очень полный набор модульных тестов (плюс отдельный и очень полный набор тестов, который выходит за рамки этого упражнения). У нас также есть очень стабильная платформа непрерывной интеграции (построенная на базе Hudson), которая предназначена для разделения и выполнения стандартных юнит-тестов python на нашем испытательном стенде: около 20 ПК, созданных по спецификации компании.
Цель этого упражнения - заполнить все пробелы в нашем наборе (только) для пакета юнитов python, чтобы каждый компонент имел некоторую степень покрытия юнит-тестами. Другие разработчики будут нести ответственность за компоненты проекта, не относящиеся к Python (которые также находятся вне области видимости).
" Component " намеренно расплывчато: иногда это будет класс, а иногда - целый модуль или сборка модулей. Это может даже относиться к единой финансовой концепции (например, к одному типу финансового опциона или финансовой модели, используемой многими типами опционов). Этот торт можно разрезать разными способами.
" Значимые " тесты (для меня) - это те, которые подтверждают, что функция выполняет то, что изначально задумал разработчик. Мы не хотим просто воспроизводить регестии на чистом питоне. Зачастую намерение разработчика не сразу очевидно, поэтому возникает необходимость исследовать и прояснять все, что выглядит неопределенно, а затем закрепить это знание в модульном тесте, который делает первоначальное намерение довольно явным.