2009-05-12 9 views
16

mio SUT assomiglia:Posso limitare l'output della copertura del naso alla directory (anziché al pacchetto)?

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 eseguo nosetests --with-coverage, ottengo dettagli per tutti i tipi di moduli che io preferirei ignorare. Ma non posso usare l'opzione --cover-package=PACKAGE perché foo.py & bar.py non sono in un pacchetto . (Vedere il filo dopo http://lists.idyll.org/pipermail/testing-in-python/2008-November/001091.html per i miei motivi per non metterli in un pacchetto.)

Posso limitare l'uscita di una copertura a foo.py solo & bar.py?

Aggiornamento - Supponendo che non c'è una risposta migliore di Nadia 's sotto, ho chiesto un follow-up domanda: "How do I write some (bash) shell script to convert all matching filenames in directory to command-line options?"

+0

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

risposta

21

è possibile utilizzarlo in questo modo:

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

ho avuto una rapida occhiata al codice sorgente del naso per confermare: This is the line

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

Sono impressionato dal fatto che tu abbia guardato la fonte. (Avrei dovuto pensarci.) Ma mostra che ho bisogno di usare "--cover-package = foo --cover-package = bar". Se modifichi la risposta, la accetterò (e la voterò). –

+1

Grazie per la nota. Ho risolto la risposta. Non ho mai usato il naso prima. Ma ho pensato di dare una risposta alla domanda dato che nessun altro ha risposto. –

+0

Grazie Nadia. Devi ancora rimuovere le estensioni ".py", poiché gli argomenti sono i nomi dei pacchetti, non i nomi dei file. –

3

Se si utilizza coverage:py 3.0, quindi il codice nella directory Python viene ignorato per impostazione predefinita, inclusa la libreria standard e tutti i pacchetti installati.

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

Sarà utile aggiungere alcuni dettagli alla risposta. – akjoshi

12

È possibile utilizzare:

--cover-package=. 

o anche impostare variabile di ambiente

NOSE_COVER_PACKAGE=. 

testato con il naso 1.1.2

+0

Questo funziona. Grazie. – cnu

+0

Come si può ottenere lo stesso risultato con le opzioni in setup.cfg? –

+9

Ricevo la copertura segnalata dai pacchetti del sito usando questo:/ –

2

farei questo:

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

Preferisco questa soluzione agli altri suggeriti; è semplice, ma sei esplicito su quali pacchetti desideri avere copertura. La risposta di Nadia comporta una digitazione molto più ridondante, la risposta di Stuart usa sed e crea ancora un pacchetto invocando touch __init__.py e --cover-package=. non funziona per me.

4

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

2

Per chiunque cerchi di eseguire questa operazione con setup.cfg, il seguente funziona. Ho avuto qualche problema a capire come specificare più pacchetti.

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

si può migliorare la risposta accettata in questo modo --cover-package=foo,bar

Problemi correlati