2009-06-22 8 views
7

Non riesco a utilizzare i test di unità per alcune parti del codice, quindi sto tornando ai test di regressione. Vorrei verificare se il mio programma si comporta nello stesso modo dopo alcune modifiche. E per comportamento intendo principalmente uno stato di strutture dati. Finora li stavo serializzando in un formato di testo leggibile e scaricato su alcuni file nella prima esecuzione. Quindi nelle prossime discariche potrei confrontare se lo stato è cambiato o no. E aggiornarlo se la modifica proviene da una nuova funzionalità e non da un bug.Test di regressione in C++

Potrei usare una libreria (C++) per organizzare tutto ciò. Conosci qualche? Insieme ai file di dump fornirebbe un test unitario economico e massiccio.

La cosa più ingombrante sono le procedure di serializzazione. A volte basta scaricare lo stato della memoria, ma quando è diverso è difficile decodificare. Così mi sono trasferito su un altro metodo. Ora, durante la fase di confronto, leggo un dump di memoria in un oggetto "fantasma" ed eseguo un metodo diff specializzato (operatore == con report di errori ricchi), che a volte è più facile da scrivere rispetto alla serializzazione in formato di testo leggibile.

Fondamentalmente ho voglia di reinventare la ruota, quindi le mie domande sono abbastanza generali:
Come si eseguono i test di regressione (se lo si fa)?
Usi qualsiasi libreria/toolkit?
Avete mai implementato uno per le vostre esigenze?

E solo per curiosità:
Hai mai desiderato eseguire test di regressione, ma qualcosa ti ha fermato?

+0

Solo per curiosità ... perché non è possibile utilizzare il test dell'unità? – nathan

+0

Principalmente perché il sistema funziona su enormi quantità di dati ed è difficile scrivere dispositivi per testare le subroutine. –

risposta

2

Si potrebbe dare un'occhiata a the Boost Test Library . Non l'ho mai usato, ma potrebbe soddisfare i tuoi desideri.

Quando lavoro, in genere scrivo semplici casi di test nel nostro track-test per rendere i test di regressione il più semplici possibile (soprattutto per le persone non me- li :).

2

Controlla la libreria boost serialization. Questo ti permetterà di scaricare i tuoi file in xml che potrai poi diffare per ogni versione.

Per creare i casi di test, se non lo si sta già facendo, utilizzare gcov per calcolare la copertura tramite le proprie funzioni. Ciò garantirà almeno che tutte le affermazioni siano coperte nella tua funzione.

test Unità

Quando stiamo testando il codice legacy che manca infissi, a volte usiamo un approccio via di mezzo. Quello che abbiamo è una versione leggermente modificata della nostra applicazione, che svolge le normali attività, ma può anche eseguire test sulle funzioni.

Non è unit testing in senso stretto come si deve supporre che il resto della biblioteca è corretta, tuttavia, non consentono almeno di fare più test di quanto possa essere possibile con i test di regressione/sistema.

1

OK, ci sono tre cose che vengono discusse qui: montaggio di test su codice legacy, test di unità e test di accettazione/regressione, tutto in C++.

In primo luogo, per prendere codice legacy e test di adattamento ad esso, consiglio di acquistare una copia di "Lavorare efficacemente con il codice legacy" di Michael Feathers.È un libro fantastico e ti insegnerà che lo qualsiasi codice legacy può essere testato per unità! Ho usato le tecniche di quel libro per adattare i test a cose che tutti mi dicevano non potevano essere testate da unità, ma l'ho fatto comunque lo :-).

In secondo luogo, per il test dell'unità in C++, ho appena scritto una serie di post in 5 parti che descrivono come eseguire questa operazione in dettaglio con Visual Studio: C++ Unit Testing With Boost.Test.

Infine, per i test di accettazione/regressione ho avuto successo usando Fitnesse. Questo è fondamentalmente un framework di test di accettazione che utilizza un wiki per organizzare e scrivere i test. La pagina wiki viene attraversata e analizzata per trasformarsi in chiamate in un dispositivo di prova che scrivi. Il dispositivo di test quindi media tra il test, come descritto da una pagina wiki, e il tuo codice di produzione. Ho usato questo meccanismo per eseguire test di regressione sull'intera applicazione end-to-end. Combina questo con i test unitari per le classi che stai cambiando e il suo meccanismo di rivelatore di bug molto potente. I test di regressione si comprimono dall'alto e l'unità prova di spremere dal basso e gli insetti sono presi nel mezzo! Ha funzionato alla grande per me.

Ottenere la distribuzione principale fitness da fitnesse.org È possibile ottenere C++ runner per FitNesse da sourceforge. (Sono uno sviluppatore di quel progetto.) Non abbiamo ancora aggiunto il supporto SLIM che è presente nella wiki di fitnesse principale, ma abbiamo un buon supporto per diversi dispositivi. Speriamo di aggiungere presto il supporto SLIM. Ho una implementazione rudimentale che deve essere completata.