2009-05-12 5 views
16

Mi SUT se parece a:¿Puedo restringir la salida de cobertura de la nariz al directorio (en lugar del paquete)?

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 

Cuando corro nosetests --with-coverage, me sale detalles para todo tipo de módulos que prefiero ignorar. Pero no puedo usar la opción --cover-package=PACKAGE porque foo.py & bar.py no están en un paquete . (Ver el hilo después de http://lists.idyll.org/pipermail/testing-in-python/2008-November/001091.html para mis razones para no ponerlos en un paquete.)

¿Puedo restringir la producción cobertura a solo foo.py & bar.py?

actualización - Suponiendo que no hay una respuesta mejor que Nadia 's abajo, le he pedido un seguimiento pregunta: "How do I write some (bash) shell script to convert all matching filenames in directory to command-line options?"

+0

Con las últimas versiones de la nariz y la cobertura, el código en los archivos de prueba se ignora debajo de la nariz, por lo que no es necesario especificar el paquete en todas. – dbn

Respuesta

21

Usted puede utilizar de esta manera:

--cover-package=foo --cover-package=bar 

tenía una mirada rápida al código fuente de la nariz para confirmar: This is the line

if options.cover_packages: 
     for pkgs in [tolist(x) for x in options.cover_packages]: 
+0

Me impresionó que miraras la fuente. (Debería haberlo pensado). Pero muestra que necesito usar "--cover-package = foo --cover-package = bar". Si modificas tu respuesta, la aceptaré (y la votaré). –

+1

Gracias por la nota. Arreglé la respuesta. Nunca he usado la nariz antes. Pero pensé en intentarlo, ya que nadie más respondió. –

+0

Gracias Nadia. Aún debe eliminar las extensiones ".py", ya que los argumentos son los nombres de los paquetes, no los nombres de los archivos. –

3

Si utiliza coverage:py 3.0, el código en el directorio de Python se ignora de manera predeterminada, incluida la biblioteca estándar y todos los paquetes instalados.

1
touch __init__.py; nosetests --with-coverage --cover-package=`pwd | sed '[email protected]*/@@g'` 
+2

Será bueno si puede agregar algunos detalles a su respuesta. – akjoshi

12

Se puede utilizar:

--cover-package=. 

o incluso establecer la variable de entorno

NOSE_COVER_PACKAGE=. 

probado con la nariz 1.1.2

+0

Esto funciona. Gracias. – cnu

+0

¿Cómo se puede lograr lo mismo con las opciones en setup.cfg? –

+9

Obtengo cobertura reportada de los paquetes de sitio usando esto:/ –

2

Me gustaría hacer esto:

nosetests --with-coverage --cover-package=foo,bar tests/* 

Prefiero esta solución a las otras sugeridas; es simple, pero usted es explícito sobre qué paquetes desea tener cobertura. La respuesta de Nadia implica mucho más tipeo redundante, la respuesta de Stuart usa sed y aún crea un paquete invocando touch __init__.py, y --cover-package=. no funciona para mí.

4

Tengo un montón de archivos/paquetes de Python de alto nivel y me resulta molesto enumerarlos todos manualmente usando --cover-package, así que hice dos alias para mí. Alias ​​nosetests_cover ejecutará la cobertura con todos sus archivos/paquetes de Python de nivel superior listados en --cover-package. Alias ​​nosetests_cover_sort hará lo mismo y, además, ordenar los resultados por porcentaje 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:

  • Esto es de mi archivo .bashrc. Modifique apropiadamente si no usa bash.
  • Deben ejecutarse desde su directorio de nivel superior. De lo contrario, los nombres de los paquetes serán incorrectos y la cobertura no los procesará en silencio (es decir,en lugar de decirle que su --cover-package es incorrecto, actuará como si no hubiera suministrado la opción en absoluto).
  • Actualmente estoy usando Python 2.7.6 en Ubuntu 13.10, con la versión de la nariz 1.3.0 y la versión de la cobertura 3.7.1. Esta es la única configuración en la que he probado estos comandos.
  • En su uso, elimine --cover-erase y --cover-inclusive si no coinciden con sus necesidades.
  • Si desea ordenar en orden normal en lugar de en orden inverso, reemplace -nr con -n en el comando de ordenación.
  • Estos comandos suponen que todos sus archivos/paquetes de Python de nivel superior se nombran sin un punto (que no sea el punto en ".py"). Si esto no es cierto para usted, lea la sección Detalles a continuación para comprender las partes del comando, luego modifique los comandos según corresponda.

Detalles:

que no afirman que estos son los comandos más eficientes para lograr los resultados que quiero. Son solo los comandos que se me ocurrieron. = P

Lo principal a explicar sería el argumento para --cover-package. Se construye la lista separada por comas de nombres de archivo de Python/paquete de nivel superior (con ".py" despojado de nombres de archivo) de la siguiente manera:

  • \$ - Escapa el carácter $ en una cadena entre comillas dobles.
  • $() - Inserta el resultado del comando contenido en.
  • ls - Enumera todos los nombres en el directorio actual (debe ser el directorio Python de nivel superior).
  • | sed -r 's/[.]py$//' - En la lista, reemplaza "foo_bar.py" con "foo_bar".
  • | fgrep -v '.' - En la lista, elimina todos los nombres sin un punto (por ejemplo, elimina foo_bar.pyc y notes.txt).
  • | paste -s -d ',' - Cambia la lista de separada por una nueva a una separada por comas.

También debería explicar la clasificación.

  • 2>&1 - Se une a stderr y stdout.
  • | fgrep '%' - Elimina todas las líneas de salida sin un carácter %.
  • | sort -nr -k 4 - Ordena las líneas restantes en orden numérico inverso de la cuarta columna (que es la columna de porcentaje de cobertura). Si desea una orden normal en lugar de una orden inversa, reemplace -nr con -n.

Esperamos que esto ayude a alguien! =)

2

Para cualquiera que intente hacer esto con setup.cfg, funciona lo siguiente. Tuve algunos problemas para averiguar cómo especificar varios paquetes.

[nosetests] 
with-coverage=1 
cover-html=1 
cover-package=module1,module2 
0

se puede mejorar la respuesta aceptada como tal --cover-package=foo,bar

Cuestiones relacionadas