2013-04-16 18 views
9

Mój projekt zawiera pliki C. A w niektórych plikach mam funkcje zdefiniowane jako statyczne.Testowanie funkcji statycznych za pomocą CppUnit

Używam CppUnit w moich testach jednostkowych i chcę przetestować te funkcje statyczne. Wiem, że wywoływanie funkcji spoza pliku (gdzie jest to zdefiniowane) nie jest dozwolone. Czy istnieje rozwiązanie, aby uniknąć tego problemu, aby wywołać te funkcje statyczne z mojego pliku testowego C++?

+0

Możliwy duplikat [Jak przetestować klasę, która ma prywatne metody, pola lub klasy wewnętrzne?] (Https://stackoverflow.com/questions/34571/how-do-i-test-a-class-that -has-private-methods-fields-or-inner-classes) – Raedwald

Odpowiedz

6

Zakładając, że mówimy o statycznych funkcjach C, najłatwiejszym rozwiązaniem jest sprawienie, by funkcje były niestatyczne podczas kompilowania wersji debugowania. Oznacza to, że symbole będą dostępne do użycia w testach jednostkowych. Działa to tylko wtedy, gdy nie ma aliasingu symboli.

Jeśli zdefiniować symbol DEBUG na wszystkich debugowania buduje wtedy coś takiego:

#ifdef DEBUG 
#define debug_export 
#else 
#define debug_export static 
#endif 

a następnie zdefiniować funkcje statyczne jak to

debug_export void foo(void) 
{ 
... 
} 

i albo zawierają deklaracje warunkowo w pliku nagłówka lub ręcznie zaimportuj je do pliku testu urządzenia:

extern void foo(void); 

Inne sposoby obejścia tego problemu to włączenie testów jednostkowych do pliku źródłowego (odrobina bałaganu, jeśli wymknie się spod kontroli), nie przeszkadza to jednostce testującej funkcję (odrobina wyładowania) lub oznaczenie Funkcja ta nie jest statyczna i zapewnia, że ​​testy jednostek są częścią tego dynamicznego obiektu.

+0

Dziękuję Zainspirowałem rozwiązanie oparte na Twojej odpowiedzi. zobacz moją odpowiedź po więcej szczegółów – MOHAMED

4

Mam wspólny plik nagłówkowy, który dołączam do wszystkich plików źródłowych moich projektów. Dodałem te linie i problem został rozwiązany:

#ifdef TEST 
#define static 
#endif 

Mogę nawet uniknąć dodawania powyższego kodu w moim kod C pochodzenia. Mogę dodać flagę -Dstatic= w poleceniu gcc i uważam, że to działa również.

Ale trzeba być ostrożnym podczas korzystania z tego rozwiązania, ponieważ:

  • Możemy mieć taką samą nazwę zmiennej/funkcja zdefiniowana jako statyczne w 2 oddzielnych plikach.
  • Możemy mieć funkcję zawierającą zmienną zdefiniowaną jako statyczną.
1

Czy istnieje sposób na zreorganizowanie kodu, aby usunąć potrzebę stosowania metod statycznych? Z punktu widzenia projektowania OO, statyką są globale w owczej skórze.

Wiem, że niekoniecznie jest to praktyczna lub najszybsza odpowiedź, ale poprawisz swój projekt, eliminując go.

Powiązane problemy