Как правильно использовать coverage.py в Python?
Я только начал использовать Coverage.py модуль и поэтому решил сделать простой тест, чтобы проверить, как он работает.
Sample.py
def sum(num1, num2):
return num1 + num2
def sum_only_positive(num1, num2):
if num1 > 0 and num2 > 0:
return num1 + num2
else:
return None
test.py
from sample import sum, sum_only_positive
def test_sum():
assert sum(5, 5) == 10
def test_sum_positive_ok():
assert sum_only_positive(2, 2) == 4
def test_sum_positive_fail():
assert sum_only_positive(-1, 2) is None
как вы видите, весь мой код покрыт тестами и py.тест говорит, что все они проходят. Я ожидаю Coverage.py чтобы показать 100% покрытие. Ну, нет.
Ну, Coverage.py может не увидеть test.py файл, так Я скопировал тестовые функции в sample.py
file и снова запустил покрытие:
затем я добавил этот блок кода:
if __name__ == "__main__":
print(sum(2, 4))
print(sum_only_positive(2, 4))
print(sum_only_positive(-1, 3))
и удалены все тестовые функции. После этого, Coverage.py показывает 100%:
Почему это так? Не должен Coverage.py показать покрытие тестирования кода, а не только покрытие выполнения? Я читал официальное Ф. А. В. для Coverage.py, но не могу найти решение.
Поскольку многие пользователи SO знакомы с тестированием кода и охватом кода, я надеюсь, вы можете сказать мне, где я ошибаюсь.
у меня есть только одна мысль: Coverage.py может просто посмотреть, какие строки кода не выполняются, поэтому я должен написать тесты для этих строк. Но есть строки, которые уже выполнены, но не покрыты тестами, поэтому Coverage.py потерпит неудачу здесь.
2 ответов
покрытие ищет .файл покрытия для чтения и создания этого отчета. Пай.тест сам по себе его не создает. Тебе нужен пай.тестовый плагин для покрытия:
pip install pytest-cov
если у вас уже есть, то вы можете запустить оба сразу так:
py.test test.py --cov=sample.py
что означает запустить тестовый модуль test.py
и запись / отображение отчета о покрытии на sample.py
.
Если вам нужно иметь несколько тестовых запусков и накапливать их записанное покрытие, а затем отображать окончательный отчет, вы можете запустить его следующим образом:
py.test test.py --cov=sample.py --cov-report=
py.test test.py --cov=sample2.py --cov-report=
py.test test.py --cov=sample3.py --cov-report=
что означает запустить тестовый модуль test.py
и запись (только) покрытия на sample.py
- не отображать отчет.
теперь вы можете запустить команду покрытия отдельно для полного отчета:
coverage report -m
команда выше просто отображает отформатированный отчет покрытия на основе накопленного .файл данных покрытия из предыдущих тестовых запусков. -m
означает показать пропущенные строки, т. е. строки, не покрытые тесты:
Name Stmts Miss Cover Missing
-----------------------------------------
sample.py 6 0 100%
покрытие поддерживает больше переключателей, таких как --include
и --omit
для включения / исключения файлов с помощью шаблонов пути. Для получения дополнительной информации ознакомьтесь с их документами:https://coverage.readthedocs.io/en/coverage-4.5.1/cmd.html#reporting
немного сложно проанализировать ваши эксперименты, и вы не включили командные строки, которые вы использовали в каждом эксперименте. Но: если вы запустите тесты с:
python -m py.test test.py
затем вы можете запустить их под coverage.py с:
coverage run -m py.test test.py