TDD: Co dzieje się przed pierwszym testem jednostkowym?

17

W większości rozumiem teorię TDD, ale nie mogę wymyślić, jak zacząć. Siadam, aby napisać test jednostkowy dla osobistego projektu i zdaję sobie sprawę. . . Nie mam pojęcia, co testuję. Jakie obiekty, jaka funkcjonalność itp.

Powiedzmy, że chcę napisać aplikację, która pomoże naszej rodzinie zarządzać zadaniami. Oto kilka pytań: Jak przejść od tego pomysłu do pierwszego testu? O ile należy zdecydować, zanim zacznę, a ile mam ustalić po rozpoczęciu pisania testów? Kiedy podejmuję decyzje, np. Czy przechowywać dane w pliku tekstowym czy w bazie danych? Czy powinienem przejść testy akceptacyjne użytkownika, zanim zacznę? Czy powinienem zaprojektować interfejs użytkownika? Czy powinienem mieć specyfikację? (Zdaję sobie sprawę, że przynajmniej niektóre z tych przykładowych pytań są prawdopodobnie w „szarej strefie”).

Czy oprócz pytania tytułowego dotyczącego przejścia do pierwszego testu jednostkowego mógłbyś podać przykład, jak mógłby wyglądać pierwszy test jednostkowy dla projektu takiego jak przykładowy projekt?

Ethel Evans
źródło
5
Całkowicie polecam przeczytanie książki GOOS autorstwa Nat Pryce'a i Steve'a Freemana ... jest kilka świetnych informacji na temat przejścia testu kompleksowego z „cienkim plasterkiem” funkcjonalności.
puste

Odpowiedzi:

6

Chciałbym zacząć od listy Funkcji i dla każdej Funkcji napisz historie użytkownika, a następnie dla każdego opisu opisz testy.

Pomyśl chwilę o projekcie, a następnie wybierz opis testu i zacznij kodować: refaktor czerwony-zielony-zielony.

Powtarzaj, aż wszystkie testy zakończą się pomyślnie.

Tak, testy akceptacyjne należy uznać za część tego, dołączoną do odpowiedniej historii.

Steven A. Lowe
źródło
Lubię to. Jest to bardzo przejrzysty proces, który mogę śledzić: Lista funkcji, tworzenie podlisty historii użytkowników dla każdej funkcji, tworzenie podlisty testów dla każdej historii użytkownika. Spróbuję tego procesu.
Ethel Evans,
Akceptuję to, ponieważ odnosi się do tego, co osobiście chciałem wiedzieć, ale polecam innym osobom przeczytanie (bardziej pozytywnej) odpowiedzi Carla.
Ethel Evans
18

Od samego początku odkryłeś, jak TDD dotyczy projektowania . Zanim napiszesz swój pierwszy test, musisz pomyśleć o tym, jaki będzie twój pierwszy element funkcjonalności i jak wyglądałby Twój program, gdyby ta funkcja działała.

Programiści, którzy nie używają TDD, również muszą o tym pomyśleć - ale mogą „po prostu zanurzyć się” i zacząć pisać coś, cokolwiek. Ale „coś, cokolwiek” nie zawsze jest na drodze do dostarczenia programu, o którym myślałeś, że zamierzasz pisać. Co jest? Jak wyglądałby twój program, gdyby działał? Jakie testy to przejdzie?

Chcę napisać aplikację, która pomoże naszej rodzinie zarządzać zadaniami.

Chłodny. Gdyby ta aplikacja działała, co by to zrobiło? Cóż, Chore można prawdopodobnie przypisać Osobie, prawda?

Person fred = new Person("fred")
Chore mow = new Chore("mow the lawn");
mow.assignTo(fred);
assertEquals(fred, mow.whoIsAssigned());

Jest początek. Nie jest to miejsce, od którego musisz zacząć, niekoniecznie najlepsze miejsce na rozpoczęcie - ale to miejsce. To jest coś, co chcesz, aby Twój kod obsługiwał (chociaż jestem pewien, że możesz wymyślić lepsze nazwy). Zacznij tam, patrz, jak się nie udaje. Niech to minie. Posprzątaj to. Spienić, spłukać, powtórz.

Carl Manaster
źródło
Nie podoba mi się ten przykład, ale zgadzam się z założeniem; metodologie badań pierwszego sens tylko wtedy, gdy jesteś w stanie i chce zrobić przynajmniej jakiś projekt z góry. W rzeczywistości naprawdę potrzebujesz szkieletowego modelu domeny lub przynajmniej sporego fragmentu.
Aaronaught
5
Nie ma tutaj żadnego projektu z góry. Żadna z klas w teście nie musi jeszcze istnieć. Projekt odbywa się w teście, a następnie są tworzone, aby pomyślnie przejść test.
Torbjørn
Czy mógłbyś rozwinąć temat „Zanim napiszesz swój pierwszy test, musisz pomyśleć o tym, jaka będzie Twoja pierwsza funkcjonalność i jak wyglądałby Twój program, gdyby ta funkcjonalność działała”. Ile powinienem ćwiczyć przed rozpoczęciem? W którym momencie nadmiernie projektuję i tracę korzyści płynące z tego, że moje testy jednostkowe napędzają mój projekt? Zakładam, że nie chcę diagramów klas, które powinny być napędzane przez refaktoryzację, prawda? Ale ten przykład brzmi: „Pomyśl, zainwestuj 15 sekund w myśl, a następnie napisz test”. Czy to naprawdę wszystko, co chcę zrobić?
Ethel Evans
2
@Ethel Tak, to tyle samo przemyślenia, co zaleciłbym włożenie w to (zarówno w tym przykładzie, jak i ogólnie). Wymyśl coś, co da się przetestować, co prowadzi cię do pożądanego produktu, a następnie napisz test.
Carl Manaster,
1
Jak to działa w zespole, jest większym i innym pytaniem. A samo TDD nie ma wiele do powiedzenia na temat koordynowania pracy w zespole. Programowanie w pary i gra planistyczna mogą w tym pomóc; w kontekście tego, co zaplanowałeś, nadal obowiązuje TDD. jamesshore.com/Agile-Book/the_planning_game.html Również Scrum ma coś do powiedzenia na temat planowania pracy zespołu.
Carl Manaster,
5

Tak, TDD ma ten problem. Dlatego teraz polecam Behavior Driven Development.

Zacznij ręcznie. Zapisz coś podobnego do historii użytkownika:

  • Jako użytkownik
  • Po wybraniu opcji Dodaj do koszyka chcę, aby produkt był dodawany w tle w sposób przezroczysty
  • Aby móc nieprzerwanie kontynuować zakupy

Jakie funkcje obsługują ten cel (część „Więc to”)?

  • Gdy element zostanie dodany do koszyka
    • Koszyk dla użytkownika będzie zawierał nowy przedmiot
    • Całkowita liczba pozycji w koszyku wzrośnie o jeden
    • Użytkownik nie powinien być przekierowywany
    • Opcja sprawdzenia teraz będzie dostępna
  • Gdy w koszyku znajdują się dwa przedmioty, a użytkownik decyduje się na wypłatę
    • Użytkownik zostanie przekierowany na stronę kasy
    • Oba elementy będą widoczne

To wszystko, co możesz i powinieneś sprawdzić ręcznie.

Zrób to przez chwilę. Następnie, jak dobry programista, zacznij szukać sposobów automatyzacji zbędnych części. Różni się to w zależności od platformy, ale większość ma przyzwoite ramy.

.Net ma WatiN do automatyzacji strony internetowej lub, jeśli chcesz przetestować API, poleciłbym dodatek Subspec do xUnit lub MSpec (możesz to również zrobić z dowolnym środowiskiem testowym, tylko te ułatwiają nazywanie testów w pewien sposób który wspiera ten styl myślenia).

Ruby ma ogórek do testowania automatyzacji i rspec do testowania API niższego poziomu

JavaScript ma jaśmin i qUnit.

kropka kropka kropka

George Mauer
źródło
Istnieją również klony ogórków / alternatywy dla platformy .NET: patrz to pytanie StackOverflow
Carson63000,
@ Carson63000 Tak, są, ale osobiście nie widzę większego sensu. Ruby jest językiem .Net w IronRuby. Wystarczy utworzyć projekt IronRuby i użyć rzeczywistego ogórka.
George Mauer,
Uwielbiam BDD i używam StoryQ. Nie zapomnij wspomnieć, że historię można rozszerzyć na senarios za pomocą Given / When / Then. Biorąc pod uwagę, że coś się wydarzyło Kiedy to robię I to Potem oczekuję tego i tego. Sprawdź przemówienie Davida Starra na ten temat na TechEd channel9.msdn.com/Events/TechEd/NorthAmerica/2010/DPR302, a także zajrzyj na StoryQ, jeśli używasz .net storyq.codeplex.com
Bronumski
3

Jak przejść od tego pomysłu do pierwszego testu? O ile należy zdecydować, zanim zacznę, a ile mam ustalić po rozpoczęciu pisania testów?

Podziel swoją aplikację na małe historie. („Jako użytkownik chcę dwukrotnie kliknąć ikonę i uruchomić program.” Lub „Jako użytkownik chcę otworzyć przeglądarkę i przejść do programu.” Cokolwiek.)

Następnie podziel historię na kilka zadań. (np. Utwórz projekt w Eclipse, skonfiguruj repozytorium kodu) Kiedy przejdziesz do zadania kodowania, napisz swój pierwszy test.

Kiedy podejmuję decyzje, np. Czy przechowywać dane w pliku tekstowym czy w bazie danych?

Jeśli nie masz pewności, wybierz któryś z nich wydaje się prostszy i zrób to. (prawdopodobnie plik tekstowy) Jeśli zauważysz, że popełniłeś błąd, dokonaj refaktoryzacji. Jeśli twoje testy są dobrze skonstruowane, powinieneś być w stanie dokonać zmiany zaplecza i wychwycić niezamierzone skutki uboczne, które się pojawiają.

Christopher Bibbs
źródło
3

Dziwię się, że żadna z odpowiedzi nie zawierają wzmianki o rzeczywistej rzeczy , które zrobić tuż przed napisaniem swój pierwszy test, który ma utworzyć listę testową . Lista testów jest oparta na fazach pisania historii i projektowania, o których mowa w innych odpowiedziach, i jest bezpośrednim prekursorem do napisania testu, którego szukasz.

Aby uzyskać więcej informacji na temat TDD, poleciłbym Test Driven Development By Example autorstwa Kent Beck. Ma także screencast TDD, który śledzi rozwój niebanalnej biblioteki w czystym stylu TDD z wyjaśnieniami Kenta na każdym etapie procesu. Myślę, że jest to świetny przykład TDD w praktyce, nawet jeśli (z konieczności) jest wykonywany w zaprojektowanym środowisku.

Rein Henrichs
źródło
0

Przed pierwszym testem jednostkowym zastanawiasz się, co chcesz się wydarzyć, a następnie zastanawiasz się, jak to sprawdzić. Następnie napisz ten test, zobacz, jak się nie powiedzie i zaimplementuj trochę kodu, aby go przejść

Spłucz, powtórz itp.

Dla mnie ważne jest myślenie o tym, jak przetestować to trochę, i to może napędzać Twój projekt.

pusty
źródło