2014-07-10 3 views
12

В настоящее время есть проект, выполненный с возможностью выполнения покрытия с помощью команды Джанго управлять следующим образом:Как проверить покрытие правильно с Django + Носом

Это приводит в отчете, как следующее:

Name      Stmts Miss Branch BrMiss Cover Missing 
-------------------------------------------------------------------------- 
notify.decorators    4  1  0  0 75% 4 
notify.handlers     6  1  2  0 88% 11 
notify.notification_types  46  39  2  0 19% 8-55, 59, 62, 66 
notify.notifications   51  51  0  0  0% 11-141 
-------------------------------------------------------------------------- 
TOTAL       107  92  4  0 17% 

Однако проблема с этим отчетом. Это не правильно. Охват означает отсутствие пропусков линий, несмотря на то, что они действительно покрываются испытаниями. Например, если я запускать тесты через nosetests вместо Джанго управлять командой, я получаю следующий правильный отчет:

Name      Stmts Miss Branch BrMiss Cover Missing 
----------------------------------------------------------------------------- 
notify.decorators    4  0  0  0 100% 
notify.handlers     6  0  2  0 100% 
notify.notification_types  46  0  2  0 100% 
notify.notifications   51  25  0  0 51% 13, 18, 23, 28, 33, 38, 43, 48, 53, 65, 70, 75, 80, 85, 90, 95, 100, 105, 110, 116, 121, 126, 131, 136, 141 
----------------------------------------------------------------------------- 
TOTAL       107  25  4  0 77% 

Google привел меня в FAQ на покрытие веб-сайта в, http://nedbatchelder.com/code/coverage/faq.html

Q: Почему тела функций (или классов) показываются как выполненные, но линии def нет?

Это происходит потому, что покрытие запускается после того, как функции определены. Строки определения выполняются без измерения покрытия, затем начинается освещение, затем вызывается функция. Это означает, что тело измеряется, но определение самой функции не является.

Чтобы исправить это, начните покрытие раньше. Если вы используете командную строку для запуска вашей программы с охватом, ваша программа будет контролироваться. Если вы используете API, перед импортом модулей, которые определяют ваши функции, вы должны вызвать функцию coverage.start().

Вопрос в том, могу ли я правильно управлять отчетами о покрытии с помощью команды управления Django? Или мне нужно обойти управление, чтобы избежать ситуации, когда покрытие начинается после того, как выполняются «пропущенные» строки?

ответ

12

На данный момент невозможно точно выполнить покрытие рядом с джанго-носом (из-за того, что модели Django 1.7 загружают модели). Таким образом, чтобы получить статистику покрытия, вам нужно использовать coverage.py непосредственно из командной строки, например:

$ coverage run --branch --source=app1,app2 ./manage.py test 
$ coverage report 
$ coverage html -d coverage-report 

Вы можете поместить coverage.py настройки в .coveragerc файл в корневом каталоге проекта (тот же директории, как управлять. ру).

Эта проблема сообщается на странице Dzhango-носа GitHub: https://github.com/django-nose/django-nose/issues/180, чтобы сопровождающие знали о проблеме, вы можете сообщить им, что вы также испытываете эту проблему.

UPDATE

eliangcs указал (Джанго нос вопросы по GiHub), что woraround это изменить ваш manage.py:

import os 
import sys 

if __name__ == "__main__": 
    # ... 
    from django.core.management import execute_from_command_line 

    is_testing = 'test' in sys.argv 

    if is_testing: 
     import coverage 
     cov = coverage.coverage(source=['package1', 'package2'], omit=['*/tests/*']) 
     cov.erase() 
     cov.start() 

    execute_from_command_line(sys.argv) 

    if is_testing: 
     cov.stop() 
     cov.save() 
     cov.report() 

Это работает, но это скорее "Hacky" подход.

UPDATE 2

Я рекомендую всем, что использует нос, чтобы взглянуть на py.test (http://pytest.org/), который является действительно хорошим инструментом для тестирования Python, он хорошо интегрируется с Django, имеет много плагин и многое другое. Я использовал django-нос, но попробовал py.test и никогда не оглядывался назад.

+1

Это самое удобное решение (хотя и взломанное) и прекрасно и прозрачно работает с django-носом – danigosa

5

Как документы говорят, «использовать командную строку для запуска программы с охватом»:

coverage run --branch --source=notify ./manage.py test 
+0

Спасибо Ned. Мой вопрос был конкретно о том, можно ли запустить управление и получить правильные результаты. Правильно ли я буду считать, что нет, нет пути? – kaptainlange

+0

Я не знаю, почему -with-покрытие работает для некоторых людей, а не для других. –

0

мне удалось получить эту работу, включая

import coverage 

на вершине моего Файл manage.py (вместо этого я использую Flask, но имею ту же самую проблему)

Моя проблема заключается в том, что она работает с консоли, но Дженкинс не знает об этом и продолжает говорить о том, что эти импортные товары sts ...

Любая идея?

0

У меня была такая же проблема с использованием удаленного интерпретатора в виртуальной машине через конфигурацию ssh. Решение состояло в том, чтобы установить каталог моих тестов и указать его родительские каталоги в «Отображениях пути» раздела «Окружающая среда» в разделе «Выполнить»> «Редактировать конфигурации ...».

Смежные вопросы