Нед Батчелдер: Трансляция, ориентированная на звонка
Автор желает измерять покрытие кода для функции на основе вызывающего объекта. Это вызвано рефакторингом кода проверки ошибок в его интерпретаторе BASIC, Acidica. Изначально каждая встроенная функция имела свою собственную проверку аргументов, что позволяло осуществлять специфическое покрытие условий ошибок. После рефакторинга это детальное покрытие было утеряно, поскольку проверка была перенесена в общую вспомогательную функцию.Предлагаемое решение включает декоратор, который использует динамические контексты coverage.py. Этот декоратор создает новый контекст покрытия, названный в честь места вызова (файл и номер строки), перед выполнением декорируемой функции. После завершения функции исходный контекст восстанавливается.Концептуальный декоратор, использующий coverage.Coverage.current() и cov.switch_context(), демонстрирует эту функциональность. Это требует небольшого, невыпущенного изменения в coverage.py для поддержки вложенных контекстов. Автор обнаружил, что его HTML-отчеты о покрытии теперь показывают отдельные контексты для каждого вызывающего объекта функции expects, раскрывая, какие ветви были выполнены кем.Будущие улучшения включают постобработку этих контекстов для выявления отсутствующего покрытия для конкретных вызывающих объектов и включение иерархических или множественных контекстов для одновременного отслеживания как вызывающего объекта, так и деталей выполнения. Автор также стремится интегрировать эту функциональность через конфигурацию coverage, а не путем модификации исходного кода с помощью декораторов. Потенциальные применения включают использование аргументов функции, таких как func_name, в качестве идентификаторов контекста.
coverage.Coverage.current()иcov.switch_context(), демонстрирует эту функциональность. Это требует небольшого, невыпущенного изменения в coverage.py для поддержки вложенных контекстов. Автор обнаружил, что его HTML-отчеты о покрытии теперь показывают отдельные контексты для каждого вызывающего объекта функцииexpects, раскрывая, какие ветви были выполнены кем.Будущие улучшения включают постобработку этих контекстов для выявления отсутствующего покрытия для конкретных вызывающих объектов и включение иерархических или множественных контекстов для одновременного отслеживания как вызывающего объекта, так и деталей выполнения. Автор также стремится интегрировать эту функциональность через конфигурацию coverage, а не путем модификации исходного кода с помощью декораторов. Потенциальные применения включают использование аргументов функции, таких какfunc_name, в качестве идентификаторов контекста.