Mojej bolączki z testami ciąg dalszy. Ale teraz obawiam się, że mogę być naprawdę w kropce.
Nie przeczę - emocjonalnie nie cierpię testów. Pewnie wynika to z małego doświadczenia - zamiast ze znajdowaniem problemów zanim pójdą na produkcję i z ułatwianiem sobie pracy kojarzą mi się obecnie z upierdliwym i żmudnym zajęciem, które trzeba odfajkować.
Gdy piszę kod sam dla siebie to nie daję testów; nie odczułem jak dotąd ich braku, mimo iż tym zajmuję się z przerwami już od jakiegoś półtora roku. (prawdopodobnie bierze się to stąd, że znam i rozumiem własny kod; a jeśli nie rozumiem i nie mogę łatwo wprowadzać zmian, to zgrzytam zębami na to, jak mogłem to dawniej tak pokomplikować niepotrzebnie i przepisuję - tzn źródła problemu upatruję gdzie indziej, niż w braku testów).
Gdy piszę kod w pracy... Tam ode mnie żądają testów. Oto więc, co robię: 1. Piszę kod bez testów; 2. Gdy skończę moduł, piszę testy ale dla całego modułu, a nie każdej pojedynczej metody. Przy czym: Lubię punkt 1, zgrzytam zębami przy 2.
Dlaczego testuję całe moduły, a nie każdą pojedynczą funkcję? Moje rozumowanie: Testy mają w założeniu umożliwić refaktoryzację kodu; ale jeśli testy są powiązane z każdą metodą, to do (...) nie da się refaktoryzować kodu bez ponownego babrania się w testach! (W zasadzie: Bez pisania na nowo testów do tych fragmentów kodu, które się refaktoryzuje). Nawet Uncle Bob krytykuje pomysł, by testować każdą metodę; choć chce on pełnego pokrycia testami, jednak testy mają wg niego nie mieć odpowiedniości 1-1 z kodem
Mimo to: i tak testy nie są na zasadzie napisz - zapomnij. Za każdym razem, gdy zmieniają się wymogi (trzeba dodać funkcjonalność do kodu) testy trzeba przeglądać i się z nimi pier(...). Nie tylko pisać nowe - także poprawiać stare. Dlatego mi się kojarzą na razie ze stałą uciążliwością, nie z pomocą.
Jak dotąd, kiedy stare testy się waliły, to za niemal każdym razem oznaczało to, że należy dostosować stare testy do zmian w kodzie, nie zaś, że kod ma bug. Niemal zawsze: bowiem muszę uczciciwie przyznać, że pokrycie kodu testami wykryło jak dotąd 1 (słownie: jeden
) bug. W kontraście do wielu innych bugów, które wykryłem w swoim kodzie w inny sposób.
W przeciwieństwie do siebie sprzed półtora roku uznaję jednak, że moja powyższa mentalność wynika z mojego braku umiejętności i wiedzy, a nie z tego, że testy są do d... Zaś mój brak umiejętności i wiedzy wynika z tego właśnie, że przez długi czas (czyli czas studiów) niczym zbuntowany nastolatek odrzucałem dobre praktyki pisania kodu i za punkt honoru postawiłem sobie pisanie kodu tak, jak ja chcę i nie przyjmowanie żadnych "dobrych praktyk", reguł, etc, dopóki na własnym kodzie i własnym doświadczeniu nie odczuję braku stosowania tych praktyk. Wskutek czego kiedy nadszedł czas na pracę, gdzie tych dobrych praktyk się wymaga, to.... no właśnie.
Dobra, koniec wstępu, problem właściwy.
Dlaczego w pracy żądają ode mnie testów? Bo twierdzą, że na braku testów już się przejechali. Obecnie pozornie niewinna zmiana w kodzie wywołuje bugi w zupełnie innych elementach aplikacji, dalekich od tego, co było zmieniane. Żądają więc obecnie testów do każdego nowego kodu i... chcą pokryć testami kod stary.
Właśnie otrzymałem zadanie pokrycia testami kodu starego.
I nie wiem, jak się za to zabrać!
Mało! Kiedy przeszukuję SoftwareEngineering.stackexchange.com w poszukiwaniu wiedzy na ten temat, natrafiłem na taki artykuł: Writing tests for existing code - gdzie doradzają wręcz, by nie pokrywać testami legacy code'u dla samego pokrycia bo to się mija z celem, tylko pokrywać testami w miarę wprowadzania zmian i nowego kodu! Gdzie indziej piszą odmiennie: 1 2
Ale tak czy siak, z tego co czytam tego rodzaju zadanie jest b. trudne... biorąc pod uwagę, że dopiero zaczynam się uczyć, jak poprawnie pisać kod... (poprawnie w sensie: zgodnie z prawidłami a nie bez bugów)... czuję się troche wrzucony na zbyt głęboką wodę na razie. (tak wiem, wina jest moja, pisałem o tym wyżej).
Co więcej: Firma chyba oczekuje ode mnie "systemu testowania aplikacji" - a zgodnie z tym, co dotąd wyczytałem, to chyba ze starym kodem postępuje się odmiennie? Tj. wybiera się z niego żmudnie małe kawałki, testuje je, łączy z resztą kodu. A nie od razu testuje całość!
Odnoszę wrażenie, że być może szef sam nie umie ocenić tego zadania, skoro oczekuje ode mnie panaceum na ich bolączki w tej materii i to w stosunkowo krótkim czasie! (z tego co czytałem to jest to zadanie żmudne i czasochłonne)
Poważnie: nie wiem, co z tym teraz zrobić. Rady?