Temat: Czy jeden test powinien testować jedną rzecz?
Prawdę mówiąc - trochę zajęć mi wynikło i liczyłem, że dyskusja dalej się potoczy... No, może teraz, z nowym rokiem - szkolnym. :)
Testowanie wszystkiego nie ma sensu, brak testów też jest problemem. Moje zastanawianie się wynika z tego, że obserwuję owczy pęd - testować, testować, testować. Brak testów == nic nie da się powiedzieć o działaniu aplikacji. I różne inne podobne tezy. Na tych studiach, na SGH, zobaczyłem jak to wygląda od strony klienta. Z grubsza - w kontekście dyskusji - testy to jedno z całej masy rzeczy, na które można poświęcić zasoby. Poza kodem, który ma robić to co jest do zrobienia - można wydać kasę na clean code, na testowanie, na logowanie, na lepsze przemyślenie architektury. Ostatecznie każdy z elementów sprowadza się do złotówek na fakturze, albo godzinach spędzonych nad projektem. Wiadomo, że trzeba zachować balans, między tymi obszarami. Rafał wspominał, że takie rzeczy zależą od przeznaczenia. Jasne, nawet można mniej więcej określić takie zależności. Mój problem jest taki, że chciałbym więcej jak mniej... Rafał wspominał o długu technicznym. Dla mnie kluczowe jest jego dobre oszacowanie. Sonar używa m.in. pokrycia kodu testami do szacowania tego. Czyli jak mam niskie porycie testami jest spora szansa na problem, co ciekawe wyrażona w dniach pracy. Problem jest taki, że strasznie to rozmyte. W dużej mierze opiera się na tym, że programista wiedział co robił i robił to zgodnie z regułami. Chciałbym, żeby maszyna sprawdzała, czy oszukuję... Albo też jak zrobię testy geterów / seterów - mam jakieś tam pokrycie, które kompletnie nic nie wnosi... wiem ile wiedziałem, czas stracony, a co ciekawe - dług techniczny jest mniejszy. I w to nie wierzę.
Programista widzi swój kawałek i twierdzi, że to jest najważniejsze. Bo ktoś w mądrej książce napisał? Pewnie dziwny jestem, ale lubię wiedzieć dlaczego. Bo jak dostanę projekt bez testów to zobaczę? No - zobaczyłem wiele razy. Wcale nie wiem, czy utrzymywanie testów kosztowałoby mniej niż to co poświęciłem na przejęcie takiego projektu... Nie chodzi mi o spieranie się, albo udowadnianie komuś czegoś. Chciałbym się dowiedzieć jak sobie radzić z szacowaniem kosztów w takich sytuacjach. Kiedy dalsze pisanie testów jednostkowych ma sens, a kiedy nie. No i oczywiście - architektura, testy, logowanie, clean code - wszystko jest potrzebne. Zastanawiam się tylko jak określić ile tych testów ma być, co testować, żeby było efektywnie.
@Adrian. Zgoda, trzeba myśleć jak się coś robi. No, ale jak określić elementy krytyczne? Czy same testy integracyjne nie wystarczą? Śpieszę z odpowiedzią zanim zostanę źle zrozumiany. :)
Jak mam wybór w projekcie stawiam na testy integracyjne. Co do testów jednostkowych - powinna być infrastruktura do ich uruchamia - jenkins, czy coś, ale na początek bez testów jednostkowych. Kod trzeba pisać tak, żeby się potem dało testować, ale nie jestem fanem tdd. Czyli piszę kod z wydzielaniem tego, co zależy od czasu, czy tam jest losowe, ale nie testuję wszystkiego jak leci.
Testy jednostkowe - IMVHO - powinny obejmować kod, który jest używany przez parę miejsc. Zwykle trzeba mieć kontrolę nad kontraktem... Modelu nie testuję, chyba że jest tam coś do testowania - explicite.
Jak coś jest robione inaczej niż przewiduje framework - też trzeba testować, bo takie rzeczy lubią się rozjeżdżać.
Bugi w kodzie warto obskoczyć testem. Raz, bo tak łatwiej debugować, a dwa, bo powtarzające się bugi wpływają na wizerunek zespołu... Z czasem samo wychodzi gdzie są problemy, wtedy można jakoś testy poukładać. No, ale najpierw trzeba mieć co układać.
No, albo jeszcze inaczej. Jim Highsmith kiedyś napisał/powiedział, że agile jest wtedy, kiedy struktur jest dokładnie tyle, że projekt się nie zawala. Więcej struktur i projekt staje się skostniały, mniej i się zapada. Podobnie chciałbym z testami.