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! =)
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