running Nose --with-coverage для получения всех файлов пакета, но не других зависимостей и библиотек

Папка моего проекта (да, я знаю, что это лучшая практика) выглядит примерно так:

.
├── app.py
├── otherscript.py
├── tests/
└── tools/
    ├── __init__.py
    └── toolfile.py

Мне нужно nose --with-coverage, чтобы протестировать .py скрипты в основной папке, tools и исключить папку tests (хотя я не особо забочусь об этом исключении)

Когда я запускаю базовый

nose --with-coverage

Я получаю покрытие для всех установленных зависимостей и библиотек (фласк, запросы и т. д.)

когда я бегу

nose --with-coverage --cover-package=folder name (or . or ./)

Я получаю покрытие для папки с тестами. файл tools/__init__.py и app.py, но не для остальных скриптов:

> (opentaba-server) D:\username\pathto\opentaba-server>nosetests --with-coverage -- cover-package=./ ... Name                                      

> Stmts   Miss  Cover   Missing
> ----------------------------------------------------------------------- Tests\functional_tests\test_return_json      26      0   100%
> Tests\unit_test\test_createdb                 0      0   100%
> Tests\unit_test\test_scrape                   0      0   100% app     
> 63     15    76%   22, 24, 72-81, 8 8-106, 133 tools\__init__         
> 0      0   100%
> ----------------------------------------------------------------------- TOTAL                                        89     15    83%
> ---------------------------------------------------------------------- Ran 3 tests in 5.182s OK

Когда я бегу с --cover-inclusive flag . Это просто терпит неудачу с:

nosetests-scripts.py: error: no such option: --with-coverage

Буду рад любой помощи в этом


person alonisser    schedule 06.09.2013    source источник
comment
Итак, он говорит, что --with-coverage не является допустимой опцией, но только тогда, когда вы ТАКЖЕ используете опцию --cover-inclusive ?   -  person samstav    schedule 07.09.2013
comment
@smlstvnh как ни странно.   -  person alonisser    schedule 07.09.2013
comment
на самом деле это относится и к --with-xunit. Я потратил около 1 часа, пытаясь заставить работать опцию --xunit-file без указания опции --with-xunit. Довольно большая трата времени...   -  person Greg    schedule 09.09.2013
comment
Версия покрытия Nose предполагает игнорировать модули в каталоге библиотеки Python.   -  person dbn    schedule 07.01.2014
comment
Может быть, уже слишком поздно, но последнее сообщение об ошибке выглядит так, как будто вы используете устаревшую версию носа. Большинство вариантов покрытия появились совсем недавно.   -  person languitar    schedule 18.06.2014


Ответы (3)


У меня была очень похожая проблема с сгенерированным кодом. Решение состояло в том, чтобы исключить сгенерированный код или код инструментов в вашем случае только из отчетов.

Итак, теперь мы используем носовые тесты для запуска наших тестов, таких как

nosetests --with-coverage --cover-inclusive --cover-package=$(PACKAGE)

а затем мы создаем отчеты вручную, поэтому

coverage combine
coverage report --omit 'tools/*'

Таким образом,coverage.py покроет ваш пакет инструментов, но они не будут отображаться в отчетах.

person Georg    schedule 08.12.2014

мой файл tests/nose_setup_coverage.cfg:

[nosetests]
verbosity=1
detailed-errors=1

with-coverage=1
cover-html=1
cover-html-dir=../../out/cover

#this is the line that fixed my equivalent of your issue
#by "climbing up" from tests/ but skipping python's **site-packages**
cover-package=..   

where=/Users/jluc/kds2/py/tests

добавление cover-package=.. (в файл cfg) и выполнение из каталога тестов заставило меня охватить все мои каталоги python, но не django и другие сторонние вещи.

Это моя структура каталогов (за исключением некоторых вещей, не связанных с Python):

.
├── lib
├── non_app
├── ps_catalog
├── pssecurity
├── pssystem
├── static
├── static_src
├── staticfiles
├── templates
├── tests
└── websec

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

В этом файле раздел опустить позволяет более точно указать, какие каталоги исключать:

omit=/Users/jluc/kds2/env/lib/python2.7/*
     */batch/*
     /Users/jluc/kds2/py/non_app/*
     */migrations/*

выполнение тестов в bash:

nosetests -c nose_setup_coverage.cfg

p.s. добавление --cover-erase к вышеуказанному сбрасывает покрытие

изменить, FWIW:

Обычно я заменял nose/nose2 на pytest в качестве средства запуска тестов. Если вы не используете расширенные функции pytest, он будет отлично работать со старыми простыми модульными тестами и имеет гораздо больше плагинов, поддержки и активной разработки. Это не для того, чтобы диссировать нос или продвигать pytest, а просто для того, чтобы сказать, что это альтернатива, которую следует учитывать, если вы постоянно сталкиваетесь с крайними случаями с носом.

person JL Peyret    schedule 13.06.2017

По умолчанию тесты не будут включены в отчет о покрытии. Вы можете сделать так, чтобы они отображались (на самом деле это очень хорошая идея, чтобы убедиться, что ваши тесты выполняются правильно, и никакие тесты с повторяющимися именами не игнорируются) с помощью --cover-tests

В любом случае, nosetests --help твой друг. Скорее всего флаг --cover-inclusive убивает плагин покрытия и другие опции (для плагина) становятся недоступными. Можно попробовать отладить, запустив нос через pdb.

В качестве альтернативы вы можете запустить покрытие как отдельный модуль, запускающий носовые тесты.

person Oleksiy    schedule 16.09.2013