Я только начал использовать модуль 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.test говорит, что все они проходят. Я ожидаю, что Coverage.py покажет 100% покрытие. Ну нет.
Что ж, Coverage.py может не видеть файл test.py, поэтому я скопировал тестовые функции в sample.py
файл и снова запустил Coverage:
Затем я добавил этот блок кода:
if __name__ == "__main__":
print(sum(2, 4))
print(sum_only_positive(2, 4))
print(sum_only_positive(-1, 3))
и удалили все тестовые функции. После этого Coverage.py показывает 100%:
Почему это так? Разве Coverage.py не должен показывать покрытие тестирования кода, а не только выполнение? Я прочитал официальный FAQ по Coverage.py, но не могу найти решение.
Поскольку многие пользователи SO знакомы с тестированием кода и покрытием кода, я надеюсь, что вы скажете мне, где я ошибаюсь.
У меня есть только одна мысль: Coverage.py может просто наблюдать, какие строки кода не выполняются, поэтому я должен написать тесты для этих строк. Но есть строки, которые уже выполняются, но не покрыты тестами, поэтому Coverage.py здесь не сработает.
python -m py.test test.py
и охват:python -m coverage run sample.py
(в Windows) - person Groosha   schedule 09.04.2016