Рассмотрим следующий код:
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%, даже с включенным покрытием ветвлений :
Однако, в этом коде есть ошибка , и те из вас, у кого есть острый глаз, возможно, уже видели это. Если он когда-нибудь go попадет в ветку "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? Если нет, есть ли другие подходы для определения «скрытого» кода, который фактически никогда не выполнялся вашим набором тестов?