Pyt. odnośnie testów jednostkowych i sprawdzanie logicznej poprawności programu

0

Piszę od jakiegoś czasu pewien projekt w c++, chciałbym zaznaczyć, że jest to mój pierwszy "poważniejszy" projekt w c++. Pracuje nad nim już dość długo (ponad rok - ale na to składa się wiele czynników, nie tylko programowanie), a sam nie mam doświadczenia w programowaniu. (oprócz tego którego zdobyłem podczas pisania tego projektu... no i samej nauki C++... ale to drugie to w znacznej cześci wiedza).

Czytałem już o wzorcach projektowych, refaktoryzacji i tym podobnych rzeczach. W projekcie mam już ponad 14 tysięcy linii kodu, ale już zaczęło mnie już trochę irytować to, że czasami do naprawienia pewnej rzeczy muszę debugować moją aplikacje by sprawdzić co nawaliło. W projekcie pełno kodu, pełno różnych pliczków. Debugowanie czasami zajmuje mi kilka minut... czasami trochę dłużej. Ale jednak zaczyna mnie to irytować. Uwielbiam GDB, ale czuje, że czasami spędzam w nim całe życie. Aktualnie sprawdzam różnego rodzaju logiczne WTF-y za pomocą wyjątków, i czasami pozwala mi to wyłapywać różnego rodzaju błędy i wiem od razu w którym miejscu. Tzn sprawdzam jakiś warunek, który jeżeli jest prawdziwy (nastąpiło WTF), to wyrzucam wyjątek

coś w stylu

    if (wtf) {
       throw std::logic_error("Funkcja abcd nawalila z tym i tamtym");
    }

}

Natomiast nie sprawdzam wszystkiego. Nie tworzę wyjątków do wszystkiego, jest nadal wiele miejsc które chciałbym objąć wyjątkami, ale nie chce ich wszędzie wykorzystywać. Nie chcę też nadużywać wykorzystania poszczególnych wyjątków. Nie przechwytuję ich za pomocą bloków try, catch by je jakoś specjalnie obsłużyć... std::logic_error wyrzutam tylko w skrajnych sytuacjach. W sytuacjach, gdy coś nie ma prawa mieć miejsca z punktu widzenia logiki.

Chciałbym napisać testy i objąć jakieś przypadki. Chciałbym napisać je ładnie. Tak, by to było jak najprzejrzystsze. Najlepiej, żeby były od razu oddzielone od kodu, bym nie miał potem ogromnych plików (co prawda u mnie największy plik ma tylko 1000 linii, ale to dlatego że z pedanterii dzielę sobie wszystko na małe pliki) Czy ktoś mógłby nakierować mnie jak mogę te testy fajnie napisać, czy mógłbym umieścić wszystkie od razu w jednym pliku (lub w pakiecie plików), i czy podejście które zaprezentowałem wyżej (z logicznymi wyjątkami) jest dobre, czy jednak złe. Ewentualnie oświecić mnie, jak powinienem zabrać się za to.

Ja jestem oczywiście świadom, że każdy programuje inaczej, i dla jednego programisty to co ktoś napisał to ogólnie jako całość to jedno wielkie WTF. Chciałbym poznać wasze (zaiste) krytyczne opinie.

PS. Odnośnie testów - od razu zastrzegam, że nie pytam o to jak może wyglądać najprostszy test (tak wiem funkcja testblablabla() {assert(warunek); }), tylko jak do właściwie podejść, ewentualnie jak je uporządkować, ułożyć w kodzie... książeczki, linki, linki do tematów (szukaj na google baranie - jeżeli to duplikat, i jeżeli już to było)... nie obraże się.

0

Pewnie chodzi Ci o testy jednostkowe...
Zobacz sobie pakiet googletest (https://code.google.com/p/googletest/)
Testy jednostkowe służą do testowania pojedynczych klas lub szeregu klas (np. jakiejś funkcjonalnej części Twojego programu) a nie całego programu. Testy te pisze się je jako oddzielny program.

0

Napisz sobie exception handler to łatwiej namierzysz co jest źle niekoniecznie bawiąc się z debuggerem. A jak jeszcze dołożysz generowanie info z windbg to już to będzie w ogóle łatwe (oczywiście jeśli w windowsie się bawisz).
Same testy jednostkowe są spoko, i mogą w wielu sytuacjach uratować dupę, aczkolwiek często się o nich zapomina, lub zakłada się, że zawsze coś będzie poprawne, a w rzeczywistości nie zawsze jest.

1 użytkowników online, w tym zalogowanych: 0, gości: 1