Pojawiły się pewne problemy przy testowaniu plików *.cpp. Dotychczas wszystkie pliki aplikacji objęte testami były zdefiniowane w plikach nagłówkowych *.h, więc problem się nie ujawniał, bo nie był potrzebny żaden kod z plików *.cpp. Dzisiaj postanowiłem napisać test do dość rozbudowanej klasy, której konstruktor został zdefiniowany w pliku *.cpp i niestety pojawił się błąd „unresolved external symbol”. Trochę czasu zajęło mi znalezienie przyczyny, którą był brak dołączonych plików *.cpp zawierających definicje konstruktorów i metod. Rozwiązaniem problemu było dołączenie plików *.cpp aplikacji do projektu test.pro.
QT += core gui TARGET = NonogramsTests TEMPLATE = app CONFIG += console SOURCES += TestMain.cpp \ LineOfPixelsTest.cpp \ AddressOnDrawingAreaTest.cpp \ ArrayOfPixelsTest.cpp \ AllLinesDescriptionTest.cpp SOURCES += ../app/field/AddressOnDrawingArea.cpp \ ../app/field/AddressOnBlocksDescription.cpp \ ../app/field/AllLinesDescription.cpp \ INCLUDEPATH += \ ../app \ ../lib HEADERS +=
Niestety konieczne jest tutaj ręczne zarządzanie tymi plikami, ponieważ przy tworzeniu nowej klasy lub pliku źródłowego kreator może dodać go tylko do jednego projektu (app.pro lub test.pro), a nie do dwóch jednocześnie. Częściowym rozwiązaniem tej niedogodności mógłby być podział projektu na trzy części: app.pro zawierający tylko plik main, test.pro z testami oraz lib.pro zawierający wszystkie pliki źródłowe klas. Projekt lib.pro byłby dołączany (linkowany) do projektów app.pro i test.pro. Nie testowałem jednak tego rozwiązania w praktyce. Przykład takiej struktury projektu.
Przy okazji napiszę, że warto pisać testy. Ułatwiają one pisanie bardziej skomplikowanych funkcji bądź takich gdzie można pomylić się „o jeden”. Funkcję void insertDescriptionBefore(BlockDescription blockDescription) w klasie AllLinesDescription implementowałem zaczynając od napisania testów sprawdzających czy metoda działa prawidłowo i otrzymujemy właściwe dane, a dopiero później dopasowywałem kod tej metody tak, aby przechodziła pozytywnie wszystkie testy. Myślę, że bez testów jednostkowych napisanie tej funkcji zajęłoby o wiele więcej czasu i nerwów.