Sprawdzone metody testowania jednostek dla początkujących testujących jednostki

29

W ostatnich latach pisałem tylko małe komponenty dla ludzi w większych projektach lub małych narzędziach. Nigdy nie napisałem testu jednostkowego i zawsze wydaje mi się, że nauka pisania go i zrobienie go zajmuje dużo więcej czasu niż zwykłe uruchomienie programu i przetestowanie go naprawdę.

Właśnie zaczynam projekt na dość dużą skalę, który może potrwać kilka miesięcy i chociaż spróbuję testować elementy podczas ich pisania (jak zawsze), zastanawiam się, czy testy jednostkowe mogłyby zaoszczędzić mi czasu.

Zastanawiałem się tylko, czy ktoś mógłby udzielić dobrej rady:

  1. Czy powinienem patrzeć na testy jednostkowe na początku projektu i być może przyjąć podejście TDD.
  2. Czy powinienem po prostu pisać testy, kiedy idę, po zakończeniu każdego rozdziału.
  3. Czy powinienem ukończyć projekt, a następnie napisać testy jednostkowe na końcu.
wilhil
źródło

Odpowiedzi:

29

Niektórzy powiedzą inaczej, ale sugerowałbym oddzielenie TDD i testów jednostkowych. TDD jest dość mentalną zmianą i początkowo wydaje się, że testy jednostkowe wymagają czasu. Jeśli uznasz je za jeden przedmiot, istnieje ryzyko, że nie zobaczysz wystarczającej ilości korzyści od razu i pojawi się pokusa, aby po prostu porzucić TDD i testowanie jednostek.

Pierwszą rzeczą jest napisanie testów jednostkowych. Na początku nie muszą być idealne. Po prostu naucz się, jak testować małe jednostki kodu i jak używać kpiny do izolowania komponentów.

Jest to największy czasochłonny, ale jak dotąd największy zwrot. Gdy zauważysz, że nie musisz już przeglądać 14 stron internetowych, aby przejść do strony, którą chcesz przetestować, będziesz wiedział, o czym mówię.

Dla mnie najważniejszym momentem Eureki była aplikacja dla systemu Windows, w której próbowałem przetestować wyrażenie regularne, które wymagało wypełnienia dwóch formularzy, zanim do niego dotarłem. Zainstalowałem NUnit i napisałem test dotyczący tej metody i zobaczyłem, jak szybko zaoszczędziłem godziny testowania. Następnie dodałem więcej testów, aby poradzić sobie z przypadkowymi przypadkami. I tak dalej.

Następnie naucz się dobrze pisać testy jednostkowe. Naucz się równowagi między kruchymi testami, które są szybkie do napisania i pisania wielu wielu testów indywidualnych. To jest dość łatwe. Lekcja polega na tym, że idealnie każdy test testuje tylko jedną rzecz, ale szybko dowiadujesz się, jak długo to trwa, więc zaczynasz pochylać się trochę nad regułą, dopóki nie napiszesz testu, który psuje się przy każdej zmianie kodu, a następnie wracasz do właściwej równowagi (który jest bliższy temu pierwszemu niż drugiemu).

TDD jest, jak powiedziałem, główną zmianą mentalną w sposobie pracy. Jednak i tak nie poświęci dużo czasu na proces programowania, gdy już piszesz testy. I obiecuję, że zobaczysz, że Twój styl kodowania poprawia się na twoich oczach. A raczej, jeśli tego nie upuścisz, to nie jest dla ciebie.

Ostatnią rzeczą do zapamiętania jest to, że TDD nie ogranicza się do testów jednostkowych. Projekt oparty na testach akceptacyjnych jest w każdym razie częścią TDD. Kolejny dobry powód, aby nie mieszać ich w myślach.

pdr
źródło
+1 Dzięki - Pozostawiając na chwilę otwarte w przypadku innych odpowiedzi, ale myślę, że ten projekt będzie dla mnie punktem zwrotnym z tych samych powodów - wiele stron internetowych i ręczne testowanie zajmie znacznie więcej czasu.
wilhil
@pdr Czy masz jakieś referencje, które mogę studiować na temat „dobrego pisania testów jednostkowych”?
Gaston
9

Zgadzam się z innymi (zdecydowanie nie pisz na koniec testów, TDD wymaga czasu na naukę, zacznij od testowania, jak tylko możesz, ostatecznie dąż do pełnej TDD). Ale chciałem dodać jedną rzecz w odpowiedzi na twój komentarz: „Zastanawiam się, czy testy jednostkowe mogłyby zaoszczędzić mi czasu”.

Moja odpowiedź jest jednoznaczna: tak. Nauczyłem się podejścia TDD około 10 lat temu, po podobnym czasie kodowania bez testów. W dzisiejszych czasach, jeśli robię coś krótkiego (<250 loc) i prostego lub coś wyrzuconego, to nie będę tego TDD. W przeciwnym razie robię to i właśnie dlatego, że oszczędza czas.

Oszczędność czasu występuje na trzy sposoby: mniej WTF, mniej debugowania i mniej strachu. Pierwszy jest oczywisty: spędzasz o wiele mniej czasu zastanawiając się, do diabła, co zbudowałaś. Kiedy masz problem, debugowanie jest znacznie łatwiejsze, ponieważ a) natychmiast łapiesz przetestowane błędy, i b) niesprawdzone błędy mają mniej miejsc do ukrycia.

Im mniej strach, tym bardziej subtelny. Dopóki nie spędzisz trochę czasu w bazie kodu TDD, nie zdajesz sobie nawet sprawy, ile czasu spędzasz martwiąc się o wprowadzane zmiany. Czy X działa? Czy to złamie Y? Czy może to mieć wpływ na Z? Dzięki TDD to odchodzi, ponieważ zamieniasz swoje obawy w testy, a następnie komputer automatyzuje zmartwienie. Odważniejszy programista jest szybszym programistą.

William Pietri
źródło
1
+1 za mniej strachu. W tym tygodniu refaktoryzowałem bazę testową bez testów. . .
Wyatt Barnett
2
Świetny cytat: „zamieniasz swoje obawy w testy, a następnie komputer automatyzuje martwienie się”!
RichVel,
5
  1. Czy powinienem patrzeć na jednostkę na początku i przyjąć podejście TDD.

  2. Czy powinienem po prostu pisać testy po zakończeniu każdej sekcji.

Obie z nich, ale nie trzecia opcja .

Jak zauważył @pdr, nauka prawidłowego testowania jednostek wymaga czasu. Zdecydowanie chcesz poświęcić czas na naukę na początku cyklu życia projektu, a nie pod koniec, gdy nadciąga termin. W ten sposób jesteś już na czasie i możesz zacząć czerpać korzyści, zanim zbliża się termin, z powodu wykrycia większości błędów na wcześniejszym etapie cyklu życia projektu.

Zauważ, że pierwszy test jednostkowy jest zawsze najtrudniejszy, szczególnie jeśli testujesz już napisany kod. Taki kod może nie być przyjazny dla testów jednostkowych, więc możesz mieć trudności z okablowaniem wszystkich obiektów w odpowiednim stanie do testu. Wybierz więc łatwy, dość izolowany test niskiego poziomu dla pierwszych prób testowania jednostkowego, a następnie stopniowo możesz zwiększyć poziom wyzwania. Po przygotowaniu pierwszego urządzenia testowego, następny przypadek testowy jest znacznie łatwiejszy, a zanim przejdziesz do czwartego, będziesz produkować przypadki testowe jak na przenośniku taśmowym. Wtedy zaczniesz odczuwać dobroć powtarzalności, udowodnionego udowodnienia, że Twój kod działa ...

Osobiście wolę podejście TDD i nie sądzę, że jest to trudne - wymaga wytrwałości, ale wierzę, że im szybciej zaczniesz od TDD, tym szybciej zaczniesz widzieć korzyści z testów jednostkowych. Może się jednak zdarzyć, że kilka pierwszych testów jednostkowych lepiej jest napisać dla kodu, który już masz. Następnie, gdy się zorientujesz, możesz zacząć eksperymentować z TDD.

Péter Török
źródło
Myślę, że wybiorę drugą opcję opartą na twoich i radach PDR - dla opcji trzeciej naprawdę miałem na myśli, że będę robił testy ręczne i po prostu napisałem test na końcu, aby upewnić się, że wszystko jest kompletne tak, jak powinno i przetestuj, czy w przyszłości będą jakieś modyfikacje.
wilhil
2

Myślę, że najlepszą rzeczą dla początkującego jest zmierzenie się z niektórymi katami kodu, które nadają się do testowania jednostkowego. Na przykład; sprawdzanie poprawności adresu e-mail. TDD staje się naturalnym przepływem, gdy rozwiążesz kilka z tych Code Kata. Sprawdź następujące kata kodu dla walidatora adresu e-mail, o którym wspomniałem: E-mail Validator

Aby dowiedzieć się, czym są Code Katas dla tych, którzy nie wiedzą, sprawdź następujący link: Code Katas

Anish Patel
źródło