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? "

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top