2009-06-16 11 views
5

Czy ktoś wie o rozszerzeniach CppUnit, które mogą być używane do generowania asercji na podstawie testu w odniesieniu do wycieków pamięci.Używanie CppUnit do wykrywania nieszczelności pamięci

tj. CPPUNIT_ASSERT_NO_LEAKS()?

Zasadniczo chcę mieć możliwość niepowodzenia określonych testów, gdy wykonanie testu spowoduje wyciek pamięci.

Odpowiedz

0

Nie mam pojęcia o tym, ale można użyć czegoś takiego jak kod Menedżera pamięci Fluid Studios i podłączyć go do siebie z odrobiną szyku. Albo to albo skompiluj go do aplikacji testowej, a następnie uruchom skrypt, który uruchamia aplikację raz dla każdego testu i zestawiaj wyniki śledzenia pamięci.

4

Jeśli używasz systemu Linux, możesz uruchomić testy pod numerem memcheck.

Sekcja Client Requests podręcznika opisuje szereg przydatnych makra, z których jeden jest oznaczonych jako użyteczne dla badania:

VALGRIND_COUNT_LEAKS: wypełnia cztery argumenty z liczbą bajtów pamięci, znaleziona przez poprzedni kontrola szczelności wyciekła, wątpliwa, osiągalna i tłumiona. Ponownie przydatne w kodzie paskowym testowym, po wywołaniu VALGRIND_DO_LEAK_CHECK.

Makro jest zdefiniowana w memcheck.h (prawdopodobnie w /usr/include/valgrind), a sekwencja chcesz będzie przypominać

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. 

Powtarzanie, że dla każdego testu byłby ból, więc można napisać makra własnego lub, jeszcze lepiej, wyspecjalizowany TestRunner.

+0

To nie zawiedzie konkretnego testu opartego na wyciekach pamięci ... –

+0

Dzięki, powinienem był jaśniejsze. Ulepszony! –

3

CPPUNIT domyślnie nie obsługuje sprawdzania przecieków pamięci.

Projekt został przerobiony teraz (został zatrzymany na długi czas) i może to być funkcja CPPUNIT2, możesz zaproponować (lub napisać) do autorów.

Jeśli szukasz platformy testów jednostkowych z obsługą wykrywania wycieków pamięci, spróbuj spojrzeć na CppUTest. Jest to projekt wykorzystywany przez Martina Fowlera i Boba Martina na niektórych kursach TDD. Jest całkiem niezły.

+0

CppUTest to coś, czego nie widziałem wcześniej ... dzięki! Wygląda na to, że istnieje pewne podstawowe wsparcie dla testowania pamięci. Zajrzyj teraz do dokumentów CppUnit 2 ... –

0

Przeprowadź testy jednostki, używając valgrind. Platforma testów jednostkowych, z której korzystam, pozwala uruchomić jeden lub więcej indywidualnych testów jednostkowych, dzięki czemu można wykryć, który z nich powoduje wyciek.

2

W Windows byłoby to dość prosta sprawa korzystania z niektórych połączeń do sterty debugowania, aby uzyskać CppUnit działać na tej informacji za pomocą _CrtMemCheckpoint() i _CrtMemDifference():

Istnieją wady :

  • musisz umieścić coś ręcznie na początku testu, aby uzyskać punkt kontrolny (Być może istnieje sposób, aby zintegrować że do CppUnit jakoś)
  • to tylko Windows (tam chyba coś podobnego na wielu innych platformach)
  • będzie działać tylko dla buduje z Debug CRT
0

I wiem, że to nie CppUnit, ale boost :: test może wykryć wyciek pamięci.

Od 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

Ten fragment z linkuowanej strony powinien zostać odnotowany: "Niestety, ta funkcja jest obecnie zaimplementowana tylko dla rodziny kompilatorów Microsoft (i Intel, jeśli używa Microsoft C Runtime Library), a także nie można go dostroić na jedną instancję monitora i jest wywoływana globalnie i zgłaszana po zakończeniu wykonywania całego programu. W przyszłości powinno to zostać poprawione. " – DevSolar

1

gdzie pracuję budujemy nasze testy jednostkowe z purify. Następnie nasza platforma ciągłej integracji ściąga zarówno liczbę testów, które zakończyły się sukcesem/nie, jak i liczbę wyciekłych bajtów (+ wyniki lint i pokrycia) i pokazuje je na stronie internetowej. Mogę bardzo polecić zrobienie tego w ten sposób.

Przepraszamy za niedostarczenie pożądanego rozwiązania.