Как правильно использовать 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 results

Ну, Coverage.py может не увидеть test.py файл, так Я скопировал тестовые функции в sample.py file и снова запустил покрытие:
enter image description here

затем я добавил этот блок кода:

if __name__ == "__main__":
    print(sum(2, 4))
    print(sum_only_positive(2, 4))
    print(sum_only_positive(-1, 3))

и удалены все тестовые функции. После этого, Coverage.py показывает 100%:

enter image description here

Почему это так? Не должен 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