2016-04-09 3 views
9

Я только что начал использовать модуль Coverage.py и решил сделать простой тест, чтобы проверить, как он работает.Как правильно использовать cover.py в Python?

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 results

Ну, Coverage.py может не увидеть test.py файл, поэтому я скопировал тестовые функции sample.py файл и снова побежал Покрытие:
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 показывать покрытие кода, а не только покрытие выполнения? Я прочитал официальный номер F.A.Q. для Coverage.py, но не могу найти решение.
Поскольку многие пользователи SO знакомы с тестированием кода и охватом кода, я надеюсь, вы можете мне сказать, где я ошибаюсь.

У меня есть только одна мысль здесь: Coverage.py может просто наблюдать, какие строки кода не выполняются, поэтому я должен написать тесты для этих строк. Но есть строки, которые уже выполняются, но не покрываются тестами, поэтому Coverage.py не работает.

+0

Как вы ссылаетесь на покрытие/pytest? –

+0

@Rogalski pytest: 'python -m py.test test.py' и покрытие:' python -m cover run sample.py' (в Windows) – Groosha

ответ

7

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

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 

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

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

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

+0

Это сработало Спасибо! – Groosha

+0

Не работает, если файл для проверки является подмодулем в пакете, который импортируется в тесте. Что бы я ни указывал в '- -cov = <> '- просто имя файла, релятив e или абсолютный путь - я получаю «ОШИБКА: не удалось создать отчет: нет данных для отчета». –

+0

Задание полнофункционального имени модуля. –

6

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

python -m py.test test.py 

, то вы можете запустить их под coverage.py с:

coverage run -m py.test test.py 
+0

Кстати, я включил команды, используемые для запуска тестов и охвата только под моим сообщением во втором комментарии: pytest: 'python -m py.test test.py' и покрытие:' python -m cover run sample.py' (в Windows). Я вижу, что ваша вторая команда отличается от моей, проверит это, спасибо! – Groosha

+1

Возможно, проблема заключается в основном недоразумении: вы не должны запускать тесты, а затем охватить. Вы должны использовать покрытие для запуска своих тестов (как я рекомендую) или включить покрытие во время тестирования (например, с плагином для охвата тестового бегуна). –

+0

Не работает для меня :('coverage -m' ->' Нет такой опции -m'. 'Span run py.test test.py' ->' Неизвестная команда py.test' (установлен py.test) – Groosha