Ho un sacco di file/pacchetti Python di primo livello e trovo fastidioso elencarli tutti manualmente usando --cover-package, quindi ho creato due alias per me. Alias nosetests_cover
eseguirà la copertura con tutti i file/pacchetti Python di livello superiore elencati in --cover-package. Alias nosetests_cover_sort
farà lo stesso e inoltre ordinerà i risultati per percentuale di copertura.
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"
Note:
- Questo è dal mio file .bashrc. Modificare in modo appropriato se non si usa bash.
- Questi devono essere eseguiti dalla directory di primo livello. In caso contrario, i nomi dei pacchetti non saranno corretti e la copertura fallirà silenziosamente nell'elaborarli (ad es.invece di dirti che il tuo pacchetto -cover non è corretto, agirà come se tu non avessi fornito l'opzione).
- Attualmente sto usando Python 2.7.6 su Ubuntu 13.10, con la versione 1.3.0 del naso e la copertura 3.7.1. Questa è l'unica configurazione in cui ho testato questi comandi.
- Durante l'utilizzo, rimuovere --cover-erase e --cover-inclusive se non corrispondono alle proprie esigenze.
- Se si desidera ordinare in ordine normale anziché in ordine inverso, sostituire
-nr
con -n
nel comando di ordinamento.
- Questi comandi presuppongono che tutti i file/pacchetti Python di livello superiore siano denominati senza un punto (diverso dal punto in ".py"). Se ciò non è vero per te, leggi la sezione Dettagli sotto per capire le parti del comando, quindi modifica i comandi come appropriato.
Dettagli:
Non ho la pretesa che questi sono i comandi più efficaci per raggiungere i risultati che voglio. Sono solo i comandi che mi è capitato di escogitare. = P
La cosa principale da spiegare sarebbe l'argomento di --cover-package. Si crea l'elenco separato da virgole di alto livello i nomi di file Python/pacchetto (con ".py" spogliato dai nomi dei file) come segue:
\$
- sfugge il carattere $
in una stringa con virgolette doppie.
$()
- Inserisce il risultato del comando contenuto all'interno.
ls
- Elenca tutti i nomi nella directory corrente (deve essere la directory Python di primo livello).
| sed -r 's/[.]py$//'
- Nell'elenco, sostituisce "foo_bar.py" con "foo_bar".
| fgrep -v '.'
- Nell'elenco, rimuove tutti i nomi senza un punto (ad esempio rimuove foo_bar.pyc e notes.txt).
| paste -s -d ','
- Cambia l'elenco da separato da riga a comma.
Devo anche spiegare l'ordinamento.
2>&1
- Unioni di stderr e stdout.
| fgrep '%'
- Rimuove tutte le righe di output senza un carattere %
.
| sort -nr -k 4
- Ordina le righe rimanenti in ordine numerico inverso per la quarta colonna (che è la colonna per percentuale di copertura). Se si desidera un ordine normale anziché un ordine inverso, sostituire -nr
con -n
.
Spero che questo aiuti qualcuno! =)
Con le ultime versioni di naso e di copertura, il codice nei file di prova viene ignorata sotto il naso, quindi non dovrebbe essere necessario specificare il pacchetto a tutti. – dbn