python code-coverage nose nosetests

python - ¿Puedo restringir la salida de cobertura de la nariz al directorio(en lugar del paquete)?



code-coverage nose (8)

Mi SUT se ve como:

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 ejecuto nosetests --with-coverage , obtengo detalles para todo tipo de módulos que prefiero ignorar. Pero no puedo usar la opción foo.py --cover-package=PACKAGE porque foo.py & bar.py no están en un paquete. (Vea el hilo después de http://lists.idyll.org/pipermail/testing-in-python/2008-November/001091.html para conocer mis razones para no incluirlas en un paquete).

¿Puedo restringir la salida de cobertura a solo foo.py & bar.py?

Actualización : asumiendo que no hay una mejor respuesta que la de Nadia continuación, le hice una pregunta de seguimiento: "¿Cómo escribo un script de shell (bash) para convertir todos los nombres de archivo coincidentes en el directorio a las opciones de la línea de comandos? "


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

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


Puedes mejorar la respuesta aceptada como así --cover-package=foo,bar


Puedes usar:

--cover-package=.

o incluso establecer la variable de entorno

NOSE_COVER_PACKAGE=.

Probado con la nariz 1.1.2


Puedes usarlo así:

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

Eché un vistazo rápido al código fuente de la nariz para confirmar: Esta es la línea

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


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


Tengo muchos paquetes / archivos de Python de nivel superior y me molesta enumerarlos todos manualmente con --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 enumerados en --cover-package. Alias nosetests_cover_sort hará lo mismo y además ordenará sus 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. Modifica apropiadamente si no usas bash.
  • Estos 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á (es decir, en lugar de decirle que su paquete -cubierta es incorrecta, actuará como si no hubiera suministrado la opción).
  • Actualmente estoy usando Python 2.7.6 en Ubuntu 13.10, con la versión 1.3.0 y la versión 3.7.1 de nose. 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 ordenar.
  • Estos comandos asumen 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:

No reclamo que estos sean los comandos más eficientes para lograr los resultados que quiero. Son solo las órdenes que se me ocurrieron. = P

Lo principal a explicar sería el argumento de --cover-package. Crea la lista separada por comas de nombres de archivos / paquetes de Python de nivel superior (con ".py" eliminado de los nombres de archivos) de la siguiente manera:

  • /$ - Escapa el carácter $ en una cadena entre comillas dobles.
  • $( ) : Inserta el resultado del comando contenido en.
  • ls : muestra todos los nombres en el directorio actual (debe ser el directorio de Python de nivel superior).
  • | sed -r ''s/[.]py$//'' | sed -r ''s/[.]py$//'' - En la lista, reemplaza "foo_bar.py" por "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 '','' | paste -s -d '','' : cambia la lista de nueva línea separada a separada por comas.

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

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

¡Espero que esto ayude a alguien! =)


Yo haría esto:

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

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


touch __init__.py; nosetests --with-coverage --cover-package=`pwd | sed ''s@.*/@@g''`