2009-03-24 13 views
18

C'è qualche strumento/libreria che calcola la percentuale di "condition/decision coverage" del codice python. Ho trovato solo coverage.py ma calcola solo la percentuale di "copertura informativa".condition coverage in python

risposta

7

Coverage.py now includes branch coverage.

Per i curiosi: il codice non viene modificato prima dell'esecuzione.La funzione di traccia tiene traccia delle linee che seguono nell'esecuzione e confronta tali informazioni con l'analisi statica del codice byte compilato per trovare le possibilità di percorso non eseguite.

2

Stai cercando cyclomatic complexity (Wikipedia)? Calcola fondamentalmente il numero di percorsi attraverso un pezzo di codice. Ci sono alcuni progetti da calcolare per codice Python, ad esempio PyMetrics o this one. Google sicuramente ne trarrà di più.

Ma non conosco alcuna ulteriore integrazione con i test di unità che mostreranno la copertura.

+0

> Stai cercando complessità ciclomatica (Wikipedia)? No. Grazie per le informazioni interessanti. > Ma non conosco alcuna ulteriore integrazione con i test unitari che ti mostreranno la copertura. Anch'io;) La complessità ciclomatica –

+0

non è sostanzialmente correlata alla copertura delle condizioni. –

2

Non conosco alcuno strumento di copertura delle diramazioni per Python, anche se ho pensato di scriverne uno. Il mio pensiero era di iniziare con l'AST e inserire strumentazione aggiuntiva per ogni punto di diramazione. È fattibile, ma ci sono alcuni casi complicati.

Per esempio,

raise SomeException(x) 

copertura Branch per questo ha bisogno di controllare che SomeException (x) è stato completamente un'istanza e non ha sollevato la sua eccezione.

assert x, "Oh No!: %r" % (x, y) 

Ciò deve verificare che il testo sul lato destro della dichiarazione di asserzione sia stato valutato completamente.

return args.name or os.getenv("NAME") or die("no name present") 

Ciascuno dei primi due termini deve essere controllato per il percorso vero/falso, ma non per ultimo. In effetti, l'ultimo potrebbe anche non tornare.

Ci sono stati molti casi di cui preoccuparsi e non ho avuto bisogno di altro che di curiosità, quindi non sono andato da nessuna parte. Mi stavo anche chiedendo se avrei ricevuto molti falsi positivi in ​​cui avrei avuto bisogno di un modo per reprimere avvertimenti specifici.

Se si desidera provare questo percorso, iniziare con Python 2.6 o 3.0. In quelle versioni il modulo AST è documentato ed è possibile creare i propri nodi AST prima di generare il codice o il file .pyc.

+0

"or die" esempio è abbastanza divertente da leggere, e molto probabilmente è stato divertente scrivere;) – myroslav

+0

Ero un programmatore Perl prima di passare a Python. Quello è un Perl-ismo. Perl non è mai stato conosciuto come una lingua noiosa. –

1

Lo stesso manutentore di coverage.py ha un articolo che parla di un modo per get coverage information at the bytecode level. Il metodo è un po 'cauto: comporta il riassemblaggio di file .pyc con numeri di linea modificati. Tuttavia, fornisce quanta più granularità nella misurazione della copertura che potreste chiedere.

2

Non l'ho usato da solo, ma se si è disposti a sostituire l'analisi di copertura con mutation testing, ho sentito parlare di un tester di mutazione chiamato "pester".

Mentre stavo facendo google, ho anche trovato a list of python testing tools che menziona alcuni possibili strumenti di copertura del codice.