2009-02-10 15 views
24

Esiste un modo per misurare la copertura del codice con DUnit? O ci sono strumenti gratuiti che lo realizzano? Cosa usi per questo? Di che copertura del codice si usa di solito?Copertura del codice di misura in Delphi

Jim McKeeth: Grazie per la risposta dettagliata. Sto parlando di test unitari nel senso di un approccio TDD, non solo sui test unitari dopo un errore. Mi interessa la copertura del codice che posso ottenere con alcuni test di base di unità pre-scritte.

+0

Non ho ancora accettato una delle risposte, perché voglio incoraggiare le persone a scrivere la loro opinione sui test unitari, quali strumenti usano e quale copertura cercano di ottenere. Quindi tutti, sentitevi liberi di commentare;) – jpfollenius

risposta

24

Ho appena creato un nuovo progetto open source su Google Code con uno strumento di copertura di codice di base per Delphi 2010. https://sourceforge.net/projects/delphicodecoverage/

In questo momento è in grado di misurare la copertura linea, ma ho intenzione di aggiungere una copertura di classe e metodo di troppo .

Genera report html con un riepilogo e una fonte contrassegnata che mostra quali righe sono coperte (verde), che non erano (rosso) e il resto delle righe per le quali non è stato generato alcun codice.

Aggiornamento: A partire dalla versione 0.3 di Delphi Code Coverage è possibile generare report XML compatibile con il plugin Hudson EMMA per visualizzare le tendenze di copertura del codice all'interno di Hudson.

Aggiornamento: Versione 0.5 porta correzioni di bug, una maggiore configurabilità e ripulito rapporti

Aggiornamento: versione 1.0 porta il supporto per l'output Emma, ​​la copertura di classi e metodi e la copertura di DLL e bPLS

+0

Strumento molto semplice ed efficiente. Thx per la condivisione! – TridenT

+0

Solo una parola o due di supporto per Christer, questo strumento è già utile e diventa DAVVERO utile. – Mmarquee

+3

Ho creato un piccolo wizard per aiutare con la linea di comando delphi-code-coverage. Vedi http://code.google.com/p/delphi-code-coverage-wizard/ – TridenT

7

Ti riferisci alla copertura del codice da test di unità o codice stantio? Generalmente penso che solo il codice verificabile che ha un fallimento dovrebbe essere coperto con un test unitario (sì, mi rendo conto che potrebbe essere l'inizio di una guerra santa, ma è qui che mi trovo). Quindi sarebbe una percentuale piuttosto bassa.

Ora il codice stantio d'altra parte è una storia diversa. Il codice obsoleto è un codice che non viene utilizzato. Molto probabilmente non hai bisogno di uno strumento per dirti questo per molto del tuo codice, basta cercare i piccoli punti blu dopo la compilazione in Delphi. Qualcosa senza un punto blu è stantio. Generalmente, se il codice non viene utilizzato, dovrebbe essere rimosso. Quindi sarebbe la copertura del codice al 100%.

Ci sono altri scenari per il codice stantio, come se si avesse un codice speciale da gestire se la data dovesse mai arrivare il 31 di febbraio. Il compilatore non sa che non può accadere, quindi lo compila e gli dà un punto blu. Ora puoi scrivere un test unitario per questo, e testarlo e potrebbe funzionare, ma poi hai appena sprecato il tuo tempo una seconda volta (prima scrivendo il codice, secondo per testarlo).

Esistono strumenti per tenere traccia di quali percorsi di codice vengono utilizzati durante l'esecuzione del programma, ma questo è solo simi-affidabile poiché non tutti i percorsi di codice verranno utilizzati ogni volta. Come quel codice speciale che devi gestire bisestile, verrà eseguito solo ogni quattro anni. Quindi, se lo togli, il tuo programma verrà interrotto ogni quattro anni.

Immagino di non aver risposto alla tua domanda su DUnit e la copertura del codice, ma penso che avrei potuto lasciarti altre domande con cui hai iniziato. Che tipo di copertura del codice stai cercando?

AGGIORNAMENTO: Se si sta adottando un approccio TDD, non viene scritto alcun codice fino a quando non si scrive un test per esso, quindi per sua natura sono disponibili 100 test di copertura. Ovviamente solo perché ogni metodo è esercitato da un test non significa che viene esercitata tutta la sua gamma di comportamenti. SmartInspect fornisce un metodo davvero semplice per misurare quali metodi vengono chiamati insieme al tempo, ecc. È un po 'meno di AQTime, ma non è gratuito. Con un po 'più di lavoro da parte tua puoi aggiungere strumenti per misurare ogni percorso di codice (rami di istruzioni "if", ecc.) Naturalmente puoi anche aggiungere la tua registrazione ai tuoi metodi per ottenere un rapporto di copertura, e questo è gratuito (beh, aspettati il ​​tuo tempo, che probabilmente vale più degli strumenti). Se usi JEDI Debug, puoi anche ottenere uno stack di chiamate.

TDD non può essere applicato facilmente retroattivamente al codice esistente senza un sacco di refactoring. Sebbene i più recenti IDE Delphi abbiano la possibilità di generare stub di test unitari per ogni metodo pubblico, che fornisce quindi una copertura del 100% dei metodi pubblici. Quello che metti in quei tronchi determina quanto sia efficace quella copertura.

+0

Grazie. Ho modificato la domanda per rendere più chiaro cosa intendo. – jpfollenius

+0

Ho aggiunto altro per coprire TDD. –

+0

"... ma questo è solo simi-affidabile ... il tuo programma verrà interrotto ogni quattro anni." Vale a dire che i test unitari sul codice che (attualmente) non hanno fallimenti potrebbero aiutare a prevenire la cancellazione del codice quando la copertura del codice viene eseguita solo negli anni non bisestili? :) Personalmente penso che tutte le funzioni che trattano le date dovrebbero essere esercitate in test unitari con tutti i tipi di date di ivvy passate in loro. Lo stesso vale per qualsiasi funzione "di base" che si occupa di "fattori ambientali". Non si desidera dipendere dalla configurazione/data corrente della macchina per i risultati di test/copertura. –

11

Non so di strumenti gratuiti. AQTime è quasi lo standard defacto per la profilazione di Delphi. Non l'ho usato, ma una ricerca veloce ha trovato Discover for Delphi, che ora è open source, ma fa solo la copertura del codice.

Uno di questi strumenti dovrebbe darti un'idea di quanta copertura di codice i test dell'unità stanno ottenendo.

+0

Discover for Delphi è ora open source https://sourceforge.net/projects/discoverd/ –

5

Io uso Discover for Delphi e fa il lavoro, per il collaudo dell'unità con DUnit e Test funzionale con TestComplete.

Discover può essere configurato per essere eseguito dalla riga di comando per l'automazione. Come in:

Discover.exe Project.dpr -s -c -m 
+2

Discover è qui http://sourceforge.net/projects/discoverd/ now. – philnext

2

Discover funziona perfettamente per me. Raramente rallenta la tua applicazione, diversamente da AQTime. Questo potrebbe non essere un problema per te comunque, ovviamente. Penso che le recenti versioni di AQTime abbiano prestazioni migliori sotto questo aspetto.

1

Utilizzo "Scopri" da anni, ha funzionato in modo eccellente fino al BDS2006 incluso (che era l'ultima versione pre-XE * di Delphi che ho usato e ancora in uso), ma il suo attuale stato opensource, non è chiaro come fare funziona con le versioni XE * di Delphi. A sh ame davvero, perché ho amato questo strumento, veloce e conveniente in quasi tutti i modi. Quindi ora mi sto spostando verso la copertura delphi-code ...