То, что вы хотите, это не «тестовое покрытие», это транзитивное замыкание «можно позвонить» из корня вычисления.(В многопоточных приложениях вы должны включить «can fork»).
Вы хотите назначить небольшой набор (возможно, только 1) функций, которые составляют точки входа вашего приложения, и вы хотите проследить черезвсе возможные абоненты (условные или безусловные) из этого небольшого набора.Это набор функций, которые вы должны иметь.
Python делает это очень сложно в целом (IIRC, я не глубокий эксперт по Python) из-за динамической диспетчеризации и особенно из-за "Eval».Рассуждение о том, какую функцию можно вызвать, может быть довольно сложным для статических анализаторов, применяемых к высокодинамичным языкам.
Можно использовать тестовое покрытие как способ заполнения отношения «можно вызвать» с конкретными фактами «сделал вызов»;это может перехватить много динамических отправлений (в зависимости от вашего набора тестов).Тогда желаемый результат - транзитивное замыкание вызова «можно или сделал».Это все еще может быть ошибочным, но, скорее всего, менее.
Как только вы получите набор «необходимых» функций, следующей проблемой будет удаление ненужных функций из исходных файлов.у тебя есть.Если количество файлов, с которых вы начинаете, велико, ручные усилия по удалению ненужных файлов могут быть довольно высокими.Хуже того, вы, вероятно, пересмотрите свое приложение, а затем ответ, что и как сохранить изменения.Таким образом, для каждого изменения (выпуска) вам необходимо надежно пересчитать этот ответ.
Моя компания создает инструмент, который выполняет этот анализ для пакетов Java (с соответствующими предостережениями относительно динамических нагрузок и отражений): входные данные представляют собой наборфайлов Java и (как указано выше) назначенный набор корневых функций.Инструмент вычисляет граф вызовов, а также находит все мертвые переменные-члены и выдает два вывода: а) список якобы мертвых методов и членов и б) пересмотренный набор файлов со всеми «мертвыми» элементами.Если вы верите а), то вы используете б).Если вы считаете, что а) неверно, то вы добавляете элементы, перечисленные в а), к набору корней и повторяете анализ до тех пор, пока не считаете, что а) верны.Для этого вам необходим инструмент статического анализа, который анализирует Java, вычисляет граф вызовов и , а затем пересматривает модули кода для удаления мертвых записей .Основная идея относится к любому языку.
Возможно, вам понадобится аналогичный инструмент для Python.
Может быть, вы можете просто сбросить файлы, которые полностью не используются, хотя это все еще может потребовать много работы.