Подтвердить что ты не робот

Покрытие для Django и покрытие кода

Я успешно установил и настроил django-nose с помощью coverage

Проблема в том, что если я просто запускаю покрытие для ./manage.py shell и выхожу из этой оболочки - это показывает мне 37% охвата кода. Я полностью понимаю, что выполненный код не означает проверенный код. Мой единственный вопрос - что теперь?

То, что я представляю, - это возможность импортировать все модули python и "успокоиться" перед выполнением любых тестов и напрямую обмениваться сообщениями с coverage, говоря "Ok, начать подсчет достигнутого кода здесь".

В идеале это будет сделано с помощью nose, по существу, сброса "затронутых" строк кода перед выполнением каждого набора тестов.

Я не знаю, с чего начать искать/разрабатывать. Я искал в Интернете и не нашел ничего полезного. Любая помощь/рекомендации были бы с благодарностью.

P.S.

Я попытался выполнить что-то вроде этого:

DJANGO_SETTINGS_MODULE=app.settings_dev coverage run app/tests/gme_test.py

И он работал (показал 1% охвата), но я не могу понять, как это сделать для всего приложения

Изменить. Здесь моя конфигурация покрытия:

[run]
source = .
branch = False
timid = True
[report]
show_missing = False
include = *.py
omit =
    tests.py
    *_test.py
    *_tests.py
    */site-packages/*
    */migrations/*
[html]
title = Code Coverage
directory = local_coverage_report
4b9b3361

Ответ 1

поскольку вы используете django-нос, у вас есть два варианта того, как запускать покрытие. Первый уже был отмечен DaveB:

coverage run ./manage.py test myapp

В приведенном выше примере выполняется покрытие, которое затем отслеживает весь код, выполняемый тестовой командой.

Но тогда в пакете django-носа по умолчанию включен плагин для покрытия носа (http://nose.readthedocs.org/en/latest/plugins/cover.html). Вы можете использовать его следующим образом:

./manage.py test myapp --with-coverage

(Есть также некоторые дополнительные параметры, например, какие модули должны быть включены, включать ли html-отчет или нет и т.д. Все они задокументированы в приведенной выше ссылке - вы также можете ввести ./manage.py test --help для некоторой быстрой информации).

Запуск плагина для покрытия носа приведет к тому, что покрытие после выполнится код начальной загрузки django, поэтому соответствующий код не будет отображаться как закрытый.

Большая часть кода, о котором вы сообщаете, рассматривается как охватываемая при запуске покрытия исходным способом, - это операторы импорта, определения классов, члены классов и т.д. По мере того, как python оценивает их во время импорта, покрытие, естественно, будет отмечать их как охватываемые. Тем не менее, запуск плагина носа не будет указывать код начальной загрузки, поскольку он запускается после запуска среды django. Конечно, побочным эффектом этого является то, что вы никогда не сможете достичь 100% -ного охвата (... или закрыть:)), поскольку ваши глобальные заявления о масштабах никогда не будут покрыты.

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

coverage run --source=myapp,anotherapp ---omit=*/migrations/* ./manage.py test

так что a) охват будет выдавать отчеты об операциях импорта, определения членов класса и т.д. (что на самом деле правда - этот код был успешно импортирован и интерпретирован), и b) он будет охватывать только мой код, а не код django или любое другое стороннее приложение, которое я использую; процент покрытия отражает то, насколько хорошо мой проект охвачен. Надеюсь, это поможет!

Ответ 2

У меня была такая же проблема. Я сэкономил некоторое время, создав файл .coveragerc, в котором указаны параметры, аналогичные тем, которые указаны в ответе, отмеченном наградами.

Теперь запустите "run run.py test", а затем "отчет о покрытии -m" покажет мне отчет о покрытии и строки, которые не покрываются.

(Подробнее см. здесь .coveragerc файл: http://nedbatchelder.com/code/coverage/config.html)

Ответ 3

"Хорошо, начните подсчитывать код здесь". может выполняться через API модуля покрытия. Вы можете проверить это через оболочку. Спрятан непосредственно из http://nedbatchelder.com/code/coverage/api.html:

import coverage

cov = coverage.coverage()
cov.start()

# .. call your code ..

cov.stop()
cov.save()

cov.html_report()

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

Ответ 4

Я немного смущен тем, чего вы пытаетесь достичь здесь.

Тестирование в Django очень хорошо описано здесь: https://docs.djangoproject.com/en/dev/topics/testing/overview/

Вы пишете тесты в своем приложении как test.py - я не вижу необходимости в носе, поскольку стандартный способ django довольно прост.

Затем запустите их как coverage run ./manage.py test main - где "main" - ваше приложение

Укажите исходные файлы для вашего кода, как описано здесь: http://nedbatchelder.com/code/coverage/cmd.html, чтобы подсчитывался только ваш код

например. покрытие - исходный = основной. /manage.py test main

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