Jak wiemy przy każdym, rozwijającym się produkcie jego skomplikowanie rośnie, a im bardziej skomplikowany tym łatwiej wprowadzić błąd. Dlatego też stosuje się testy m.in. jednostkowe -aby przetestować poprawność jakiejś jednostki kodu, oraz aby w razie modyfikowania jednostek używanych przez inne jednostki zwiększyć prawdopodobieństwo tego, że nic nie popsuliśmy.
W języku C++ najpopularniejszą biblioteką jest gtest, możemy też testować przy jego pomocy programy napisane w języku C.
Gtesta możemy zainstalować z linuxoweo repozytorium pakietów, np. w dystrybucjach debianowych piszemy:
sudo apt-get install libgtest-dev
aczkolwiek polecam pobranie z oficjalnej strony źródeł i samodzielne zbudowanie. Pobierając z oficjalnej strony mamy pewność, że dysponujemy najnowszą wersją.
Budowanie gtesta ze źródeł
Jeśli zdecydujemy się na ten krok możemy zamiast ręcznego pobierania z oficjalnej strony pobrać całe repozytorium, w tym celu wystarczy w terminalu wpisać:
git clone https://github.com/abseil/googletest.git
Po pobraniu należy wejść do katalogu z rozpakowanym gtestem, i możemy to zainstalować.
Instalacja gtesta dla całego systemu (gdy dysponujemy odpowiednimi uprawnieniami)
Jeśli mamy uprawnienia i chęci instalacji gtesta dla całego systemu wystarczy będąc w katalogu z rozpakowaną biblioteką zawołać w terminalu:
cmake . make sudo make install
Instalacja gtesta nie dla całego systemu
Oczywiście jeśli nie będziemy mieli uprawnień do instalacji w systemie musimy zainstalować to w innej lokalizacji, wtedy nasza komenda instalacji będzie się troszeczkę różnić:
cmake -DCMAKE_INSTALL_PREFIX=/katalog/gdzie/mamy/uprawnienia . make make install
Osoby lubiące widzieć co się dzieje mogą dodać do make opcję
VERBOSE=1
aby widzieć jak jest budowany gtest.
Budowanie gtesta bez cmake’a
Jeśli ktoś nie ma cmake’a może sobie zwyczajnie skompilować bibliotekę samodzielnie, w tym celu budujemy wszystkie znalezione tam pliki .cc (poza plikiem gtest_main.cc, chyba, że ktoś chce mieć od razu funkcję main w formie biblioteki).
Aby to zrobić należy będąc w katalogu, gdzie jest rozpakowany gtest zastosować komendy:
g++ -Igoogletest/include -Igoogletest -Wall -Wshadow -Werror -Wno-error=dangling-else -DGTEST_HAS_PTHREAD=1 -fexceptions -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -o gtest-all.cc.o -c googletest/src/gtest-all.cc ar qc libgtest.a gtest-all.cc.o g++ -isystem googletest/include -Igoogletest -Wall -Wshadow -Werror -Wno-error=dangling-else -DGTEST_HAS_PTHREAD=1 -fexceptions -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -o gtest_main.cc.o -c googletest/src/gtest_main.cc ar qc libgtest_main.a gtest_main.cc.o
Teraz ponownie powraca kwestia uprawnień do instalacji w systemie, jeśli samodzielnie budowaliśmy cmake’a i mamy uprawnienia możemy zainstalować go do całego systemu:
– wszystkie includy przenieść do: /usr/local/include/gtest
– skompilowane biblioteki (pliki *.a) do: /usr/local/lib/
– Pliki *.pc do: /usr/local/lib/pkgconfig/
Kompilacja programu używającego gtesta
Po zbudowaniu/zainstalowaniu biblioteki gtest możemy go używać. W tym celu potrzebujemy załączyć:
#include
a podczas linkowania potrzebujemy flag:
-lgtest i -pthread
np. program o nazwie test.cc kompilujemy:
g++ test.cc -lgtest -pthread -o program
Jeśli nie instalowaliśmy biblioteki dla całego systemu również przy każdej kompilacji musimy wskazywać ścieżki do nagłówków gtesta, oraz podczas linkowania podawać ścieżki do skompilowanych bibliotek:
g++ -isystem/sciezka/do/gtest/include test.cc -L/sciezka/do/gtest/lib -lgtest -pthread -o program
To wszystko, można działać.
Budowanie na systemie Windows
- Musimy mieć jak wcześniej CMAKEa oraz polecam Cmake-Gui.
- Pobieramy naszego gTesta (np. stąd), rozpakowywujemy.
- Wchodzimy do głównego katalogu naszego gTesta z poziomu Cmake-Gui, potem poniżej podajemy ścieżkę do zbudowania.
- Mając to klikami Configure, pojawi się nam zestaw narzędzi, ja wybrałem MinGw, ale to zależy dla jakiego środowiska chcemy skompilować biblioteki (musi być ten sam kompilator).
- Po kliknięciu configure mamy wybór, czy chcemy zainstalować bibliotekę w systemie, czy tylko zbudować:
- Jeśli zainstalować warto ustawić CMAKE_INSTALL_PREFIX
- Jeśli tylko zbudować należy odznaczyć: INSTALL_GTEST
- Klikamy Generate.
- Wchodzimy do katalogu, który ustawiliśmy na ścieżkę do zbudowania i w nim musimy dokończyć budowę. Przykładowo jeśli budujemy dla MinGW to wołamy:
mingw32-make -j4
ten drugi argument jest opcjonalny, ale umożliwia zbudowanie przy pomocy wielu wątków. - Gotowe! Teraz tylko wskazać ścieżki do includów, oraz do zbudowanej biblioteki (zależnie czy chcieliśmy instalować nasza bibliotekę, czy nie trzeba będzie wskazać liby ze ścieżki, gdzie zainstalowaliśmy, lub ze ścieżki budowania/libs).