23 marca 2011

Testy jednostkowe

Ot zainteresowałem się ostatnio testami jednostkowymi. W moim przypadku wybór padł na CppUnit. Moja obecna platforma to Windows+Eclipse+cygwin więc, instalacji dokonałem właśnie za pośrednictwem cygwin-a
      
Devel | cppunit: C++ unit testing framework (1.12.1-1)
      
Aby dołączyć bibliotekę do środowiska Eclipse skorzystałem z tego artykułu
* http://beans.seartipy.com/2007/11/26/unit-testing-c-programs-using-cppunit-in-eclipse-ide-on-windows/
      
Znalazłem tylko dwa oficjalne artykuły traktujące o tym jak to trzeba ugryźć, ale przykład był dla mnie za mały, żebym czuł, że wszystko do mnie trafiło.
* http://cppunit.sourceforge.net/doc/1.11.6/cppunit_cookbook.html
* http://cppunit.sourceforge.net/doc/1.11.6/money_example.html
      
Mniej więcej, tworzymy klasy dziedziczące po TestFixture, do których zadań należy przetestowania pojedynczej klasy lub jakiejś funkcjonalności. W środku TextFixture tworzymy obiekt TestSuite, w którym zbieramy wskaźniki do metod, które to z kolei, służą do właściwego testowania.
      
Składać (TestSuite) możemy klepiąc kod, albo korzystając z makr (szybsze i bezpieczniejsze rozwiązanie):
      
CPPUNIT_TEST_SUITE( FluTest );
CPPUNIT_TEST( testTemerature );
CPPUNIT_TEST( testNose );
CPPUNIT_TEST_SUITE_END();


A w owych metodach testujących korzystamy z makr np.
CPPUNIT_ASSERT(warunek)
CPPUNIT_ASSERT_EQUAL(expected, actual)

Więcej tutaj:
* http://cppunit.sourceforge.net/doc/1.11.6/group___assertions.html
      
Są jeszcze inne fajne rzeczy jak, np. drukowanie raportów o testach do xml-a, ale ...
      
Wtyczka do CppUnit (ECUT) dla Eclipse.
      
Przy okazji znalazłem na googlu coś takiego jak ECUT
* http://sourceforge.net/projects/ecut/
czyli coś go generowania "szablonów kodu testującego" na podstawie kodu właściwego.
Ładnie też pokazuje jak się testy wykonały.
Wtyczkę (ECUT_1.0_M3-RC3a) zainstalowałem, posiłkując się opisem z:
* http://xrigher.co.cc/cpp/set-up-cppunit-eclipse-plugin-ecut-for-c-on-ubuntu/
     
Podczas konfiguracji wybrałem libcppunit.a, a miałem jeszcze do wyboru libcppunit.dll.a, ale poszło. Nie znalazłem żadnej "papierowej" dokumentacji, bo też jej bardzo nie szukałem. Za to po ściągnięciu EcutDemo_M3.zip ze strony projektu, znalazłem w środku przykład wraz z wideo tutorialem :D
     
Podsumowanie.
ECUT ciekawy, choć niby testy powinny być pisane, przed napisaniem właściwego kodu. Unit testy/CppUnit, hmm dobre, ale trzeba pamiętać o przetestowaniu każdej małej jednostki (metody/funkcji/klasy ?). Jak zabierzemy się tylko za te większe, to błędów możemy szukać jak zwykle ...
     
A mi się śni w szybkim tworzenia kod, WYBIÓRCZE składowanie w UnitTestach danych przykładowych (wykorzystywanych przy debugowaniu), dla niektórych metod, wtedy po naprawach mógłbym sprawdzić czy czegoś nie popsułem. Hmm, czasem przy debugu złożonych metod, musiałem wewnątrz ciała dużej metody coś za hard-kodować, ciekawe czy jakby mój sen nie był wybiórczy, to bym się przed tym ustrzegł?