Jaki jest sens testów automatycznych? Jeśli się nie mylę, przede wszystkim chodzi o walkę z regresjami.
Scenariusz, przed którym się bronimy, wygląda mnie więcej tak:
- Programista A pisze kod i czyni jakieś założenia odnośnie interfejsu, które spełnia kod w innej części aplikacji. Względnie natknął się na nieoczywisty przypadek graniczny i robi coś nieoczywistego w kodzie, by ten przypadek obsłużyć.
- Rok później programista B nie zna założeń poczynionych przez progr. A ani nie jest w stanie przewidzieć tego samego przypadku granicznego, ale musi zmienić coś w tym kodzie. Więc łamie założenia i wpada w ten właśnie przypadek graniczny i o tym nie wie.
- Mamy regresję.
Podczas gdy gdyby kod był dokładnie przetestowany - z naciskiem na to, co nieoczywiste - poleciałyby testy i regresji by nie było.
Jakie to ma zastosowanie dla osobistych projektów?
- Szansa na tego rodzaju sytuację jest mniejsza, bo zakładamy, że programista w miarę ogarnia własny kod i mniej więcej pamięta, co dlaczego robił (a jeśli nie pamięta, to powinien potrafić sobie przypomnieć, gdy patrzy na dziwny kod)
- Pisanie testów zabiera czas. Dwukrotność czasu na pisanie kodu? Strzelam, że coś koło tego. Mnie pewnie jeszcze więcej, bo nie mam w tym prawie żadnego doświadczenia.
- Kiedyś tam próbowałem zrobić własną grę. Nie miała testów. Tak, zdarzało mi się wprowadzać regresje. Ale usuwałem je zazwyczaj szybko. I wykrywałem szybko, gdyż - co może być specyfiką gier - z testami, czy bez testów i tak trzeba ją uruchamiać co chwila.
Ale może ja się mylę? Może nawet w osobistych projektach testy są bardzo ważne, bo bez testów okazuje się, że po tygodniu - najdalej miesiącu - pracuję wolniej, niż z testami, tylko że o tym nie wiem, bo nigdy nie próbowałem? Wszak tyle osób naciska, że testy muszą być i że jest to absolutna podstawa. Zdarzało się, że na forach opensourcowych gierek widziałem ludków, którzy przychodzili tam po to, by pytać "dlaczego kod nie ma testów".
Ciekawa rzecz: pytałem o to na różnych serwerach Discordowych. Gamedevowym, C#-powym. Co bardzo mnie zdziwiło, odpowiedzi były nieco inne. Ktoś z etykietką "Verified Microsoft Employee" twierdził, że testy dla projektów osobistych to strata czasu. Wymaga to rozeznania, bo zależy od rodzaju projektów. Oni w MS mają dużo testów, bo w ich przypadku jest to istotne, i - tu żebym nie skłamał, może pamięć mnie pyli - w ogólności każdy projekt wykorzystywany jako zależność innego projektu powinien mieć testy, ale dla gier jest to już mniej ważne. Także sceptycznie na temat testów wypowiadał się na forum gamedevowym ktoś z etykietką "AA", wg niego testy to jest "no silver bullet".
Więc może jednak nie jest tak, jak by chcieli niektórzy, że testy muszą być zawsze, że są warunkiem wstępnym, by w ogóle chcieć patrzyć na kod? Czym innym jest kod, który w razie błędu zabija ludzi albo kosztuje górę forsy (Therac-25, Ariane 5, ...), taki kod musi być przetestowany bardzo dokładnie, o ile w ogóle jego poprawność nie powinna być dowiedziona matematycznie. Ale nie każdy soft jest taki.
Nie zmienia to faktu, że mój następny projekt osobisty chyba będzie zawierał testy. Nie po to, że są potrzebne, ale po to, bym nauczył się je pisać. Ale czy to nie cargo cult z kolei?