Как правильно использовать cover.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.test говорит, что все они проходят. Я ожидаю, что Coverage.py покажет 100% -ный охват. Ну нет.

Результаты Coverage.py

Ну, 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 не работает.

Coverage ищет файл .coverage для чтения и создания этого отчета для вас. Py.test сам по себе не создает. Вам нужен плагин py.test для покрытия:

 pip install pytest-cov 

Если у вас уже есть это, вы можете запустить оба сразу:

 py.test test.py --cov=sample.py 

Это означает, что тестовый модуль test.py и отчет о sample.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 

Вышеприведенная команда просто отображает отформатированный отчет о покрытии на основе накопленного файла данных .coverage из предыдущих тестовых прогонов. -m означает пропущенные линии шоу, т.е. строки, не охватываемые тестами:

 Name Stmts Miss Cover Missing ----------------------------------------- sample.py 6 0 100% 

Coverage поддерживает больше таких переключателей, как --omit и --omit для включения / исключения файлов с использованием шаблонов путей. Для получения дополнительной информации ознакомьтесь со своими документами: http://coverage.readthedocs.org/en/coverage-4.0.3/cmd.html#reporting

Трудно разобрать ваши эксперименты, и вы не включили командные строки, которые вы использовали в каждом эксперименте. Но: если вы запускаете тесты с помощью:

 python -m py.test test.py 

то вы можете запустить их с помощью функции cover.py с помощью:

 coverage run -m py.test test.py