Могу ли я ограничить вывод nose coverage каталогом (а не пакетом)?
-
21-08-2019 - |
Вопрос
Мой СУТ выглядит как:
foo.py
bar.py
tests/__init__.py [empty]
tests/foo_tests.py
tests/bar_tests.py
tests/integration/__init__.py [empty]
tests/integration/foo_tests.py
tests/integration/bar_tests.py
Когда я бегу nosetests --with-coverage
, Я получаю подробную информацию для всех видов
модулей, которые я бы предпочел игнорировать.Но я не могу использовать
--cover-package=PACKAGE
вариант, потому что foo.py
& bar.py
не находятся в упаковке
.(Смотрите тему после
http://lists.idyll.org/pipermail/testing-in-python/2008-November/001091.html
по моим причинам не класть их в упаковку.)
Могу ли я ограничить вывод покрытия только foo.py & bar.py?
Обновить - Предполагая, что нет лучшего ответа, чем Надяниже я задал дополнительный вопрос: "Как мне написать какой-нибудь сценарий оболочки (bash), чтобы преобразовать все совпадающие имена файлов в каталоге в параметры командной строки?"
Решение
Вы можете использовать его следующим образом:
--cover-package=foo --cover-package=bar
Я быстро просмотрел исходный код nose, чтобы подтвердить: Это и есть линия
if options.cover_packages:
for pkgs in [tolist(x) for x in options.cover_packages]:
Другие советы
Вы можете использовать:
--cover-package=.
или даже установить переменную окружения
NOSE_COVER_PACKAGE=.
Испытано с носом 1.1.2
У меня много файлов / пакетов Python верхнего уровня, и меня раздражает перечислять их все вручную, используя --cover-package , поэтому я создал для себя два псевдонима.Псевдоним nosetests_cover
будет запущено покрытие со всеми вашими файлами / пакетами Python верхнего уровня, перечисленными в --cover-package.Псевдоним nosetests_cover_sort
сделает то же самое и дополнительно отсортирует ваши результаты по проценту охвата.
nosetests_cover_cmd="nosetests --with-coverage --cover-erase --cover-inclusive --cover-package=\$( ls | sed -r 's/[.]py$//' | fgrep -v '.' | paste -s -d ',' )"
alias nosetests_cover=$nosetests_cover_cmd
alias nosetests_cover_sort="$nosetests_cover_cmd 2>&1 | fgrep '%' | sort -nr -k 4"
Примечания:
- Это из моего файла .bashrc.Измените соответствующим образом, если вы не используете bash.
- Они должны быть запущены из вашего каталога верхнего уровня.В противном случае имена пакетов будут неверными, и coverage не сможет их автоматически обработать (т.е.вместо того, чтобы сообщить вам, что ваш --cover-package неверен, он будет действовать так, как будто вы вообще не указывали эту опцию).
- В настоящее время я использую Python 2.7.6 в Ubuntu 13.10 с версией nose 1.3.0 и версией покрытия 3.7.1.Это единственная настройка, в которой я тестировал эти команды.
- При использовании удалите --cover-erase и --cover-inclusive, если они не соответствуют вашим потребностям.
- Если вы хотите выполнить сортировку в обычном порядке, а не в обратном порядке, замените
-nr
с-n
в команде сортировать. - Эти команды предполагают, что все ваши файлы / пакеты Python верхнего уровня имеют имена без точки (отличные от точки в ".py").Если для вас это не так, прочитайте раздел "Подробности" ниже, чтобы понять части команд, а затем измените команды соответствующим образом.
Подробные сведения:
Я не утверждаю, что это наиболее эффективные команды для достижения желаемых результатов.Это просто команды, которые мне случайно пришли в голову.=P
Главное, что нужно объяснить, - это аргумент для --cover-package .Он создает разделенный запятыми список имен файлов / пакетов Python верхнего уровня (с удалением ".py" из имен файлов) следующим образом:
\$
-- Ускользает от$
символ в строке, заключенной в двойные кавычки.$( )
-- Вставляет результат выполнения команды, содержащейся внутри.ls
-- Перечисляет все имена в текущем каталоге (должен быть каталог Python верхнего уровня).| sed -r 's/[.]py$//'
-- В списке заменяет "foo_bar.py" на "foo_bar".| fgrep -v '.'
-- В списке удаляются все имена без точки (напримерудаляет foo_bar.pyc и notes.txt ).| paste -s -d ','
-- Изменяет список с разделителя новой строки на разделитель-запятую.
Я должен также объяснить сортировку.
2>&1
-- Объединяет stderr и stdout.| fgrep '%'
-- Удаляет все выходные строки без%
характер.| sort -nr -k 4
-- Сортирует оставшиеся строки в обратном числовом порядке по 4-му столбцу (который является столбцом для процента покрытия).Если вы хотите обычный порядок вместо обратного порядка, замените-nr
с-n
.
Надеюсь, это кому-то поможет!=)
Если вы используете покрытие: py 3.0, то код в каталоге Python по умолчанию игнорируется, включая стандартную библиотеку и все установленные пакеты.
Я бы сделал это:
nosetests --with-coverage --cover-package=foo,bar tests/*
Я предпочитаю это решение другим предложенным;это просто, но при этом вы четко указываете, на какие пакеты вы хотите получить покрытие.Ответ Нади включает в себя гораздо больше избыточного ввода, ответ Стюарта использует sed и по-прежнему создает пакет, вызывая touch __init__.py
, и
--cover-package=.
у меня это не работает.
Для всех, кто пытается сделать это с помощью setup.cfg, работает следующее.У меня возникли некоторые проблемы с определением того, как указать несколько пакетов.
[nosetests]
with-coverage=1
cover-html=1
cover-package=module1,module2
touch __init__.py; nosetests --with-coverage --cover-package=`pwd | sed 's@.*/@@g'`
Вы можете улучшить принятый ответ следующим образом --cover-package=foo,bar