Рассмотрим следующий код:
import math
def dumb_sqrt(x):
result = math.sqrt(x) if x >= 0 else math.sqrt(-x)*j
return result
def test_dumb_sqrt():
assert dumb_sqrt(9.) == 3.
Тест можно выполнить так:
$ pip install pytest pytest-cov
$ pytest test_thing.py --cov=test_thing --cov-report=html --cov-branch
В отчете о покрытии будут учтены все линии, покрытые на 100%, даже при включенном покрытии филиалов:
Однако в этом коде есть ошибка, и те из вас, у кого острый глаз, возможно, уже заметили ее. Если он когда-либо попадет в ветку "else", будет исключение:
NameError: global name 'j' is not defined
Ошибку легко исправить: изменить неопределенное имя j
на буквальное 1j
. Также легко добавить еще один тест, который выявит ошибку: assert dumb_sqrt(-9.) == 3j
. Ни то, о чем этот вопрос спрашивает. Я хочу знать, как найти участки кода, которые фактически никогда не выполнялись, несмотря на отчет о 100% покрытии кода.
Использование условных выражений является одним из таких виновников, но везде есть подобные случаи, когда Python может сократить вычисление (другие примеры — x or y
, x and y
).
Предпочтительно, строка 4 выше может быть окрашена в отчете желтым цветом, подобно тому, как отображалась бы строка «если», если бы в ней изначально не использовалось условное выражение:
Поддерживает ли coverage.py
такую функцию? Если да, то как вы можете включить «встроенное покрытие ветвей» в своих отчетах по cov? Если нет, существуют ли какие-либо другие подходы для выявления «скрытого» кода, который никогда не выполнялся вашим набором тестов?
'opcode'
в Python 3.7 самое большое препятствие устранено. - person Martijn Pieters   schedule 28.02.2020