2017-02-22 31 views
0

Отказ от ответственности; начинающий вопрос!Отчет о покрытии кода «запуск кода», но не «код покрыт» отдельными тестовыми модулями

Моя структура проекта, весьма упрощен ради вопроса, выглядит следующим образом:

Project/ 
|-- main.py 
|-- test_main.py 

После прочтения Jeff Knupp's blogpost on unit testing и писать ассортимент тестов я хотел бы видеть, сколько мой код в настоящее время было покрыто тестами , Поэтому я установил coverage.py и следующий меня смущает:

$ запустить покрытие main.py (показывает мне отпечатки/входе из сценария)

$ отчет Охват main.py

Имя , Stmts, мисс, Обложка

main.py, 114, 28, 75%

дело в том, я не запускать модульные тесты из главного сценария, и не Я думаю, я должен. Я вручную запускаю все тесты из test_main.py перед фиксацией и знаю, что они не покрывают 75% всех моих утверждений. После прочтения coverage documentation Я сомневаюсь в реализации модульного теста ... нужны ли триггеры main.py, которые запускают тесты?

Так что я попробовал то же самое на моем тестовом скрипте:

$ перспективе охват test_main.py (показывает мне 'OK' пробный запуск для всех тестов)

$ отчет по покрытию test_main.py

Имя, Stmts, мисс, крышка

test_main.py, 8, 0, 100%

Но это просто показывает мне, что я «ударил» 100% моего кода в тестовых заявлениях во время выполнения этого скрипта. Итак, почему тогда покрытие указано в разделе "increase test coverage", если оно просто отображает, какой код был использован.

Мне очень хотелось бы узнать, сколько из моего main.py покрыто test_main.py, и я уверен, что у меня отсутствует базовая концепция. Может кто-нибудь уточнить?


На моей Ubuntu работы машины «выполнение покрытия test_main.py, отчет покрытия» только дает мне отчет о test_main.py. На моей машине Windows, это дает:

Имя, Stmts, мисс, крышка


main.py, 114, 74, 35%

test_main.ру, 8, 0, 100%


TOTAL, 122, 74, 39%

В докладе охват по-прежнему не имеет смысла:

  1. test_main охватывает 9 из из 134 строк кода и 1 из 10 функций в основном покрытии не составляет 35%
  2. Почему он сообщает об охвате test_main, это тесты, и было бы странно, если бы это было не на 100% m запускать все тесты, чтобы увидеть мой cov erage ...
  3. Я делаю что-то неправильно здесь, или этот способ взглянуть на него - это заблуждение, вычисляющее среднее значение «охвата», в то время как суммирование тестов с помощью самого кода не дает понимания, и, по моему мнению, неверно
+0

Трудно ответить, не видя ваш код. Все, что может сделать cover.py, это рассказать вам, какой код вы использовали, и какой код вы могли бы запустить, и показать вам разницу. Вы показали два отчета, оба из которых утверждают, что они касаются main.py, но первый говорит, что есть 114 операторов, а второй говорит, что есть 8 операторов. Это не должно меняться. Вы можете проверить детали? –

+0

@NedBatchelder извините, небольшая ошибка - нижний отчет был релевантен для test_main.py. Я до сих пор не понимаю, насколько охват полезен в контексте * test *, он просто полезен при проверке того, какой код никогда не будет выполняться, или в других целях. Я хочу понять, какие части моего кода * покрыты * (отсюда освещение, которое я думал ...), модульными тестами, но это просто показывает мне, какой код был запущен в двух отдельных отчетах. Таким образом, единственный способ, которым я мог бы выполнить то, что я хочу, с помощью cover.py, - это дублировать весь мой код main.py в test_main.py и протестировать скрипт? – MarcelTon

+0

Вы используете cover.py для измерения исполнения вашего набора тестов. Затем он расскажет вам, какие строки в вашем коде продукта были запущены, а какие нет. Сделайте это: «Запуск покрытия test_main.py, отчет о покрытии». Не помещайте имя файла в отчет о покрытии, если вы не хотите ограничивать отчет только одним файлом. –

ответ

0

Чтобы ответить и закрыть мой собственный вопрос - хотя я до сих пор не согласен с довольно определенной логикой покрытия, 35% точны и спасибо @Ned за указание линий подсчитываются, когда они просто импортируются. Он также включает описание файла верхнего уровня, argparser и основную ссылку на функцию, ведущую к этому проценту. Это составляет до 40 из 114 строк кода, даже если сама функция, которую я импортирую, является только строк кода.

Мне не нравится этот способ отчетности, так как я не использую все импортные данные в тестовом выражении, argparser нетронутый, и все же он говорит, что они «покрыты», что в основном приводит к семантическому обсуждению. говорят, что они «видны» или «пройдены», но фактически не «покрыты испытаниями».

Я также сделал другой ход покрытия тест с только другое имя файла test_main_2.py тестирования ту же функцию в точно таким же образом ... в результате в (35 + 100 + 100)/3 = 78% в среднем покрытия вместо (35 + 100)/2 = 68% охвата.

Но Я действительно понимаю, как оно подсчитывает покрытие (среднее), что позволяет мне интерпретировать цифры более правильным образом. Возможно, это может помочь раннему новичку интерпретировать его собственные первые результаты.