Posso restringir a saída de cobertura de nariz para o diretório (em vez de pacotes)?
-
21-08-2019 - |
Pergunta
As minhas SUT parece com:
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
Quando eu executo nosetests --with-coverage
, fico com detalhes de todos os tipos de
módulos que eu prefiro ignorar. Mas eu não posso usar o
opção --cover-package=PACKAGE
porque foo.py
& bar.py
não estão em
pacote. (Veja o fio depois
http://lists.idyll.org/pipermail/ testando-in-python / 2008 a novembro / 001091.html
para as minhas razões para não colocá-los em um pacote.)
Posso restringir a saída de cobertura para apenas foo.py & bar.py?
Atualizar - Supondo que não há uma resposta melhor do que Nadia 's abaixo , eu pedi um acompanhamento pergunta: " Como posso escrever algum (bash) script shell para converter todos os nomes de arquivos correspondentes no diretório de opções de linha de comando? "
Solução
Você pode usá-lo como este:
--cover-package=foo --cover-package=bar
Eu tinha um rápido olhar para o código-fonte nariz para confirmar: Esta é a linha
if options.cover_packages:
for pkgs in [tolist(x) for x in options.cover_packages]:
Outras dicas
Você pode usar:
--cover-package=.
ou até mesmo definir variável de ambiente
NOSE_COVER_PACKAGE=.
Testado com nariz 1.1.2
Eu tenho um monte de alto nível Python arquivos / pacotes e achar que é irritante para enumerá-los todos manualmente usando --cover-package, por isso fiz dois aliases para mim. Alias ??nosetests_cover
será executado cobertura com todo o seu alto nível Python arquivos / pacotes listados em --cover-package. Alias ??nosetests_cover_sort
vai fazer o mesmo e, adicionalmente, classificar os resultados por percentual de cobertura.
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"
Notas:
- Esta é do meu arquivo .bashrc. Modificar de forma apropriada se você não usar bash.
- Estes devem ser executados a partir de seu diretório de nível superior. Caso contrário, os nomes dos pacotes será incorreto e cobertura falhará silenciosamente para processá-los (ou seja, em vez de dizer-lhe o seu --cover-package é incorreto, ele vai agir como se você não fornecer a opção em tudo).
- Atualmente estou usando o Python 2.7.6 no Ubuntu 13.10, com a versão 1.3.0 nariz e cobertura versão 3.7.1. Esta é a única configuração em que eu testei estes comandos.
- Na sua utilização, retire --cover-apagar e --cover-inclusive se não corresponder às suas necessidades.
- Se você quiser classificar em ordem normal em vez de ordem inversa, substitua
-nr
com-n
no comando tipo. - Estes comandos assumem que todos os seus arquivos Python de nível superior / pacotes são nomeados sem um ponto (que não seja o ponto no ".py"). Se isso não é verdade para você, leia a seção Detalhes abaixo para entender as partes de comando, em seguida, modificar os comandos conforme o caso.
Detalhes:
Eu não tenho a pretensão de que estes são os comandos mais eficiente para alcançar os resultados que eu quero. Eles são apenas os comandos aconteceu de eu vir para cima com. = P
A principal coisa a explicar seria o argumento para --cover-package. Ele cria a lista separada por vírgulas de alto nível nomes Python arquivo / pacote (com ".py" despojado de nomes de arquivos) como segue:
-
\$
-. Escapes o personagem$
em uma string entre aspas -
$( )
-. Insere o resultado do comando contido dentro -
ls
-. Lista todos os nomes no diretório atual (deve ser de nível superior diretório Python) -
| sed -r 's/[.]py$//'
-. Na lista, substitui "foo_bar.py" com "foo_bar" -
| fgrep -v '.'
-. Na lista, remove todos os nomes sem um ponto (por exemplo remove foo_bar.pyc e notes.txt) -
| paste -s -d ','
- Altera a lista da separados por vírgula separados por nova linha.
Eu também deve explicar a classificação.
-
2>&1
-. Junta-se stderr e stdout -
| fgrep '%'
-. Remove todas as linhas de saída, sem um personagem%
-
| sort -nr -k 4
- Classifica as linhas restantes em ordem numérica inversa pela quarta coluna (que é a coluna para a percentagem de cobertura). Se você quiser ordem normal em vez de ordem inversa, substitua-nr
com-n
.
Espero que isso ajude alguém! =)
Se você usar cobertura: py 3.0 , em seguida, o código no diretório do Python é ignorados por padrão, incluindo a biblioteca padrão e todos os pacotes instalados.
Eu faria isso:
nosetests --with-coverage --cover-package=foo,bar tests/*
Eu prefiro esta solução para os outros sugeridas; é simples, mas você é explícito sobre quais pacotes você deseja ter cobertura para. A resposta de Nadia envolve muito mais digitação redundante, usos resposta de Stuart sed e ainda cria um pacote invocando touch __init__.py
, e
--cover-package=.
não funciona para mim.
Para qualquer um que tenta fazer isso com setup.cfg, os seguintes trabalhos. Eu tive alguma dificuldade para descobrir como especificar vários pacotes.
[nosetests]
with-coverage=1
cover-html=1
cover-package=module1,module2
touch __init__.py; nosetests --with-coverage --cover-package=`pwd | sed 's@.*/@@g'`
Você pode melhorar a resposta aceita como assim --cover-package=foo,bar