2009-06-16 9 views
5

Qualcuno è a conoscenza di estensioni a CppUnit che possono essere utilizzate per fare asserzioni su un test per test di verifica delle perdite di memoria.Utilizzo di CppUnit per il rilevamento perdite di memoria

, ad esempio CPPUNIT_ASSERT_NO_LEAKS()?

In sostanza, voglio essere in grado di fallire test specifici quando l'esecuzione del test risulta in una perdita di memoria.

risposta

0

Non ho idea di quello, ma potresti usare qualcosa come il codice di gestione della memoria di Fluid Studios e collegarlo a te stesso con qualche ritocco. In alternativa, compilarlo nell'applicazione di test e quindi disporre di uno script che esegue l'applicazione una volta per ciascun test e raggruppa i risultati del tracciamento della memoria.

4

Se si utilizza Linux, è possibile eseguire i test con memcheck.

la sezione Client Requests del manuale descrive diverse macro utili, di cui una è notato come utili per il test:

VALGRIND_COUNT_LEAKS: inserisce i quattro argomenti con il numero di byte di memoria trovato dalla precedente controllo delle perdite per essere trapelato, dubbio, raggiungibile e soppresso. Ancora una volta, utile nel codice del cablaggio di prova, dopo aver chiamato VALGRIND_DO_LEAK_CHECK.

La macro viene definita in memcheck.h (probabilmente nel /usr/include/valgrind), e la sequenza che si desidera assomiglierà

unsigned long base_definite, base_dubious, base_reachable, base_suppressed; 
VALGRIND_DO_LEAK_CHECK; 
VALGRIND_COUNT_LEAKS(base_definite, base_dubious, base_reachable, base_suppressed); 
// maybe assert that they're zero! 

// call test 

unsigned long leaked, dubious, reachable, suppressed; 
VALGRIND_DO_LEAK_CHECK; 
VALGRIND_COUNT_LEAKS(leaked, dubious, reachable, suppressed); 
CPPUNIT_ASSERT_EQUAL(base_leaked, leaked); 
// etc. 

Ripetendo che per ogni prova sarebbe un dolore, per cui si potrebbe scrivere macro della propria o, ancora meglio, uno specialista TestRunner.

+0

Questo non fallisce un test specifico in base a perdite di memoria ... –

+0

Grazie, mi avrebbe dovuto essere più chiaro. Revised! –

3

CPPUNIT non dispone di supporto per il controllo delle perdite di memoria per impostazione predefinita.

Il progetto è stato ripristinato ora (è stato interrotto per un lungo periodo) e questa potrebbe essere una funzionalità di CPPUNIT2, è possibile proporre (o scrivere) agli autori.

Se stai cercando un framework di test unitario con supporto per il rilevamento perdite di memoria, prova a guardare CppUTest. È il progetto utilizzato da Martin Fowler e Bob Martin in alcuni corsi TDD. È abbastanza buono

+0

CppUTest è qualcosa che non ho visto prima ... grazie! Sembra che ci sia un supporto rudimentale per il test della memoria lì. Guardando in CppUnit 2 documenti ora ... –

0

Esegui i test dell'unità con valgrind. Il framework di test unitario che utilizzo consente di eseguire uno o più test di unità individuali in modo da poter rilevare quale sta causando la perdita.

2

In Windows sarebbe piuttosto semplice questione di usare alcune chiamate al mucchio di debug per arrivare CppUnit di agire su queste informazioni utilizzando _CrtMemCheckpoint() e _CrtMemDifference():

ci sono svantaggi :

  • si dovrebbe mettere qualcosa manualmente all'inizio del test per ottenere il checkpoint (Forse c'è un modo per integrare quello nel CppUnit in qualche modo)
  • è solo per Windows (c'è probabilmente qualcosa di simile sulle diverse altre piattaforme)
  • funzionerà solo per costruisce con il debug CRT
0

I sappi che non è CppUnit, ma boost :: test può fare il rilevamento delle perdite di memoria.

Da http://www.boost.org/doc/libs/1_39_0/libs/test/doc/html/execution-monitor/user-guide.html:

void detect_memory_leaks(bool on_off);

void break_memory_alloc(long mem_alloc_order_num);

+2

Questo pezzo dalla pagina collegata deve essere annotato: "Sfortunatamente questa funzione è, al momento, implementata solo per la famiglia di compilatori Microsoft (e Intel, se utilizza Microsoft C Runtime Libreria), inoltre non può essere regolato per istanza del monitor e viene attivato solo a livello globale e riportato dopo l'esecuzione dell'intero programma. In un futuro questo dovrebbe essere migliorato. " – DevSolar

1

Dove lavoro che costruiamo i nostri test di unità con purificare. Quindi la nostra piattaforma di integrazione continua estrae sia il numero di test che ha avuto esito positivo/fallito sia il numero di byte trapelati (+ risultati di lint e coverity) e lo mostra su una pagina web. Consiglio vivamente di farlo in questo modo.

Ci scusiamo per non aver fornito la soluzione che volevi.