2016-04-09 19 views
9

Ho appena iniziato a utilizzare il modulo Coverage.py e così ho deciso di fare un semplice test per verificare come funziona.Come utilizzare correttamente coverage.py in Python?

Sample.py

def sum(num1, num2): 
    return num1 + num2 


def sum_only_positive(num1, num2): 
    if num1 > 0 and num2 > 0: 
     return num1 + num2 
    else: 
     return None 

test.py

from sample import sum, sum_only_positive 

def test_sum(): 
    assert sum(5, 5) == 10 

def test_sum_positive_ok(): 
    assert sum_only_positive(2, 2) == 4 

def test_sum_positive_fail(): 
    assert sum_only_positive(-1, 2) is None 

Come si vede, tutto il mio codice è coperto di test e py.test dice tutti loro passano. Mi aspetto che Coverage.py mostri una copertura del 100%. Beh no.

Coverage.py results

Beh, Coverage.py potrebbe non vedere test.py di file, così ho copiato funzioni di test per sample.py di file e corse di nuovo Copertura:
enter image description here

poi ho aggiunto questo blocco di codice:

if __name__ == "__main__": 
    print(sum(2, 4)) 
    print(sum_only_positive(2, 4)) 
    print(sum_only_positive(-1, 3)) 

e rimosso tutte le funzioni di test. Dopo di che, Coverage.py mostra 100%:

enter image description here

Perché è così? Coverage.py non dovrebbe coprire la copertura del test del codice, non solo la copertura dell'esecuzione? Ho letto un F.A.Q. ufficiale per Coverage.py, ma non riesco a trovare la soluzione.
Dal momento che molti utenti SO hanno familiarità con il test del codice e la copertura del codice, spero che tu possa dirmi, dove mi sbaglio.

Ho un solo pensiero qui: Coverage.py può semplicemente osservare quali righe di codice non sono state eseguite, quindi dovrei scrivere test per quelle linee. Ma ci sono linee che sono già state eseguite, ma non sono coperte da test, quindi Coverage.py fallirà qui.

+0

Come si richiama copertura/pytest? –

+0

@Rogalski pytest: 'python -m py.test test.py' e copertura:' python -m coverage esegue sample.py' (su Windows) – Groosha

risposta

7

copertura cerca un file .coverage a leggere e generare quel rapporto per voi. Py.test da solo non ne crea uno. Avete bisogno di plug-in per la copertura py.test:

pip install pytest-cov 

Se già avete, allora è possibile eseguire entrambi contemporaneamente come questo:

py.test test.py --cov=sample.py 

Il che significa modulo di test eseguito test.py e registrare la copertura/display rapporto su sample.py.

Se hai bisogno di avere più corse di prova ed accumulare la loro copertura registrata e quindi visualizzare una relazione finale, è possibile eseguire in questo modo:

py.test test.py --cov=sample.py --cov-report= 
py.test test.py --cov=sample2.py --cov-report= 
py.test test.py --cov=sample3.py --cov-report= 

Il che significa correre modulo di prova test.py e registrare (solo) di copertura su sample.py - non visualizzare un report.

Ora è possibile eseguire il comando di copertura separatamente per un rapporto completo:

coverage report -m 

Il comando precedente semplicemente visualizza un rapporto di copertura formattata in base al file di dati .coverage accumulati dalle precedenti test. -m significa mostra linee mancati linee cioè non coperti dalle prove:

Name  Stmts Miss Cover Missing 
----------------------------------------- 
sample.py  6  0 100% 

Copertura supporta più interruttori come --include e --omit per includere/escludere file utilizzando modelli di percorso. Per maggiori informazioni consulta i loro documenti: http://coverage.readthedocs.org/en/coverage-4.0.3/cmd.html#reporting

+0

Ha funzionato Grazie – Groosha

+0

Non funziona se il file da esaminare è un sottomodulo in un pacchetto che viene importato nel test. -cov = <> '- solo il nome del file, relativ e o percorso assoluto - Viene visualizzato "ERRORE: impossibile generare report: nessun dato da segnalare". –

+0

Specificare il nome del modulo completo lavorato. –

6

È un po 'difficile analizzare i tuoi esperimenti e non hai incluso le righe di comando che hai utilizzato con ciascun esperimento. Ma: se si esegue il test con:

python -m py.test test.py 

allora si può girare sotto coverage.py con:

coverage run -m py.test test.py 
+0

A proposito, ho incluso comandi usati per eseguire test e copertura solo sotto il mio post in secondo commento: pytest: 'python -m py.test test.py' e copertura:' python -m coverage esegue sample.py' (su Windows). Vedo che il tuo secondo comando è diverso dal mio, controllerà questo, grazie! – Groosha

+1

Forse il problema qui è un malinteso di base: non si dovrebbe eseguire i test e quindi la copertura. Si suppone che si utilizzi la copertura per eseguire i test (nel modo che raccomando) o abilitare la copertura durante l'esecuzione dei test (ad esempio con un plug-in di copertura del test runner). –

+0

Non funziona per me :('coverage -m' ->' Non esiste questa opzione -m'. 'Copertura esegue py.test test.py' ->' comando sconosciuto py.test' (py.test è installato) – Groosha