W TDD, jaka jest zaleta uruchamiania testów przed napisaniem pustej metody?

Widzę wielu praktykujących TDD po tym cyklu:

1) Napisz swój test tak, jakby cel obiekty i API już istnieją.

2) Skompiluj rozwiązanie i zobacz przerwa.

3) Napisz wystarczająco dużo kodu, aby dostać go do / align = "left" /

4) Uruchom test i sprawdź, czy nie.

5) napisz wystarczająco dużo kodu, aby dostać go do pasuję.

6) Uruchom test i zobacz, jak przejdzie

7) Refaktor

Co to jest zalety kroków 1 i 2? Z Idami takimi jak Visual Studio jest to naprawdę irytujące, ponieważ intellisense skacze po całym miejscu, próbując odgadnąć metody i atrybuty, których nie ma.

Zwykle zaczynam od kroku 3, mając wszystkie moje metody rzucania NotImplementedException, i to wydaje mi się całkowicie w porządku, ale może czegoś mi brakuje.

Edit dla wyjaśnienia: to nie jest pytanie, dlaczego powinienem zobaczyć, że test się nie powiedzie, zanim przejdzie; to jest pokryte na kroku 3 i to ma sens. Moje pytanie brzmi, dlaczego jeszcze wcześniej ludzie będą wywoływać metodę na teście jednostkowym, która nie istnieje w API (dlatego VS pokaże czerwony squiggle, lub pomalować całą nazwę metody red etc) i spróbować skompilować mimo wszystko. Dla mnie to, że VS mówi mi, że metoda nie istnieje, jest wystarczająco dobre.

Author: rodbv, 2009-01-06

14 answers

Spróbuj najpierw wpisać nazwę metody. Stwierdzam, że pisząc test pierwszy i metody, zmusza mnie to do naprawdę myślenia o API, i jestem wolny, aby łatwo zmienić nazwy bez konieczności martwienia się o kod, który został już napisany. Sugerowałbym, aby spróbować nie przestrzegać zasad i monitorować, co się dzieje. Jeśli okaże się, że powoduje problemy, przełącz się z powrotem. A jeśli nie, masz teraz nowy sposób pracy.

Pamiętaj również, że gdy uczysz się po raz pierwszy ogólnie rzecz biorąc, potrzebujesz jasnego zestawu zasad, aby dać ci kontekst. Gdy zaczniesz przechodzić od początkującego do bardziej zaawansowanego, zyskasz więcej kontekstu i będziesz mógł wprowadzać poprawki. Dla mnie to brzmi, jakbyś tam był.

 18
Author: Cory Foy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-06 19:14:32

Jestem praktykującym TDD i myślę, że twój sposób na to jest w porządku. Widząc niepowodzenie testu jest ważną częścią, nie widząc niepowodzenia kompilacji kodu.

Spróbuj jako poprawioną sekwencję:

1) Napisz swój test w ciągu komentarz jakby obiekty docelowe i API już istnieje.

2) Napisz tyle kodu API, aby / align = "left" /

3) odkomentuj swój kod testowy.

4) Uruchom test i zobacz, że się nie powiedzie.

5) napisz wystarczy kod, aby go zdobyć żeby przejść.

6) Uruchom test i zobacz, jak przejdzie

7) przepłukać i powtórzyć...

W ten sposób nadal możesz korzystać z myślenia najpierw przetestuj, a nie najpierw zaimplementuj.

 12
Author: Justin Standard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-06 19:28:29

Przepływ pracy w Eclipse z JUnit (w przeciwieństwie do Visual Studio z MSTest) to miejsce, w którym kroki 1-3 mają największy sens. Krok 3 to po prostu użycie funkcji Quick Fix Eclipse (Ctrl-1) do wygenerowania kodu stub na podstawie testu jednostkowego, który właśnie napisałeś.

Dosntexistyet someObject = new dosntexistyet ();
int result = someObject.newMethod("123");
assertEquals( 123, wynik);

Szybka poprawka dla pierwszej linii automatycznie utworzy Klasa DoesntExistYet (pozwalająca najpierw przejść przez kreatora, aby ją dostosować), a następna szybka poprawka utworzy dla ciebie newMethod, odpowiednio ustalając podpis na podstawie tego, jak go używałeś.

Więc z całą tą automatyzacją, która ułatwia sprawę, przechodzisz do innych zalet, o których ludzie wspominali, że możesz określić swoje API przez to, w jaki sposób go używasz.

 10
Author: Brian Deacon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-06 19:42:48

Myślę, że każdemu brakuje punktu krytycznego. skąd wiesz, że pożądana metoda jeszcze nie istnieje? Napisanie testu jednostkowego, który wywołuje metodę, która nie powinna jeszcze istnieć, a następnie oglądanie jej niepowodzenia, weryfikuje, że twoje założenie jest prawdziwe. W języku skompilowanym nie powinno się go kompilować. W języku nieskompilowanym nieudane wykonanie może być znacznie szybsze niż sprawdzenie API. W większości języków dziedziczenie i polimorfizm może skutkować obecnością metody, która nie została zarejestrowana w Twoim mentalny model API.

W rzadkich przypadkach może okazać się, że metoda rzeczywiście istnieje (i IntelliSense może pomóc wykryć, że również), i może zdawać sobie sprawę, że trzeba zmienić pożądaną sygnaturę metody. A może nawet okaże się, że w ogóle nie musisz pisać tej metody (może napisałeś ją w zeszłym tygodniu, ale zapomniałeś).

Z pewnością możesz pominąć te dwa pierwsze kroki lub nawet całkowicie zrezygnować z TDD, ale te kroki miały swój cel. Niemniej Jednak, Ja zgadzam się z ogólnym przekonaniem, że zawsze możemy skorzystać z dokładniejszego opisu przesłanek stojących za takimi krokami w każdej "najlepszej praktyce".

EDIT: z Justina Standard...

Lub jeśli pracujesz w zespole programistów i nie piszesz kodu osobiście polegasz na tym. Myślę, że jest to dość powszechny scenariusz dla większości deweloperów.

EDIT: z senfo...

Jeśli masz problemy z kontrolowaniem, które metody zostały zaimplementowane w bazie klasy, wygląda na to, że Twoja hierarchia dziedziczenia jest zbyt złożona. I still voted się, bo zgadzam się, że poświęcam więcej czasu na sprawdzenie, czy metoda już nie istnieje, jeśli zacznę od testu jednostkowego.

@ senfo: zbyt duża złożoność hierarchii dziedziczenia może z pewnością wystąpić, ale to inny problem z oczywistym rozwiązaniem. Nawet jeśli istniejący kod jest doskonały, nadal warto zacząć od testu jednostkowego, który próbuje wywołać prawdopodobnie nieistniejąca metoda, aby szybko udowodnić sobie, że nie istnieje. Oczywiście pominięcie tego kroku jest zrozumiałe-mogę do niego wrócić w konkretnej sytuacji, w której mój test jest niewłaściwy (aby sprawdzić w tej konkretnej sytuacji, że nie powołuję się na coś innego niż to, co właśnie napisałem).

 10
Author: Rob Williams,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-11 23:05:11

Pisanie testów najpierw zmusza do decydowania o interfejsach

To wszystko.

Ale to wystarczy! interfejsy to pole, w którym musisz kodować; ignoruj je i po prostu zacznij kodować, a często musisz przerobić swoją pracę, zanim będziesz mógł jej użyć

EDIT: naprawdę powinienem przeczytać pytanie dokładniej, OP szukał bardziej konkretnej odpowiedzi. Oto ona: pomiń krok 2 w visual studio, stub metody/klasy zamiast tego. Nie ma powodu do pedantyzmu o przestrzeganie tej rozszerzonej receptury, gdy wyraźnie nie jest to konieczne przy użyciu narzędzi.

 3
Author: Steven A. Lowe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-06 19:22:52

Widzę, że wiele osób odpowiadających na to pytanie ma tło w Visual Studio. Używałem VS siebie i zmagałem się z tymi samymi problemami, które wskazujesz w pierwszych dwóch krokach TDD.

Jeśli używasz bardziej zaawansowanych IDE edycji kodu, jak to, co masz w Javie (Eclipse, Netbeans, IntelliJ), pierwsze dwa kroki mają więcej sensu. Dostępne tam szybkie poprawki i funkcje generowania kodu sprawiają, że pisanie testu przeciwko nieistniejącej klasie lub metodzie jest najszybszym sposobem na stworzenie tego specific class lub declare that specific method; możesz po prostu nacisnąć przycisk, a brakująca klasa lub metoda zostanie wygenerowana za Ciebie. Pisanie wywołania metody lub instancji obiektu jest szybsze niż tworzenie klasy lub metody, a następnie ich używanie. Po wywołaniu metody, na przykład, jest podane przez nazwę Metody i typy parametrów, jaki powinien być podpis metody, więc jest łatwe dla IDE, aby je utworzyć. To naprawdę wspaniały proces i nie zaprogramowałbym żadnego w drugą stronę. Połącz to z zaletami rzeczywistej pracy z api, zanim ono istnieje, opisany sposób wykonywania TDD ma wiele sensu.

To, co tu twierdzę, jest również prawdą w językach dynamicznych, gdzie tradycyjnie nie dostaniesz żadnych błędów kompilacji w IDE dla brakujących klas lub metod. Test się nie powiedzie, dając Ci czerwony pasek.

Dla użytkowników Visual Studio, jeśli chcesz podzielić się tym doświadczeniem, zainstaluj wtyczkę Resharper dla Visual Studio. To będzie podaj wiele z tych samych funkcji, które są dostępne w Java IDEs.

 3
Author: Bent André Solheim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-06 20:54:01

Widząc, że się zepsuł, upewnisz się, że nie pomyliłeś się w kodzie testowym i od samego początku zbudowałeś test roboczy.

Również próba "użycia" API sprawia, że myślisz o tym z innej perspektywy (użytkownika API ), co jest prawie zawsze korzystne. Ważne jest, aby to zrobić zanim spróbujesz napisać API (które będzie zawsze z perspektywy API designer ). Trudno jest wyjaśnić wartość korzystania z własnych interfejsów API, ale termin branżowy to karma dla psów .

 3
Author: Lawrence Dol,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-30 02:02:14

Pamiętaj najpierw, że cykl podstawowy to red-green-refactor. Tak więc niepowodzenie kompilacji kodu nie jest częścią podstawowego cyklu TDD. Powiedziawszy, że, jak zauważyło kilka osób, warto rozważyć API pod kątem konstruowanego testu, i to jest miejsce, w którym Twoje pierwsze dwa kroki zwykle wchodzą w swoje własne. Jeśli piszesz API tak, jak chcesz, aby działało tak, aby twój test był prosty, o wiele bardziej prawdopodobne jest, że będziesz szczęśliwym konsumentem testowanej klasy.

 2
Author: Mike Burton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-06 19:32:32

Jeśli chodzi o wsparcie Visual Studio dla TDD, zgadzam się, że intellisense czasami będzie przeszkadzało, ale w rzeczywistości można użyć VS dla TDD, choć nadal jest nieco ograniczone. Jeśli metoda testowa odnosi się do nieistniejącej metody na testowanej klasie, możesz utworzyć dla siebie stub, naciskając Ctrl-K, Ctrl - M.

Niestety to nie działa dla właściwości w VS2008, ale z tego co wiem z notatek dla VS2010 jest wiele ulepszeń w tym obszarze w następnym wersja.

 1
Author: Brian Rasmussen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-06 19:24:08

Niebezpieczeństwo polega na tym, że podczas pisania pierwszego testu założysz swoje API. Jedną z sztuczek jest pomyślenie o pierwszym teście - może napisz go na papierze lub przynajmniej na zewnątrz VS-zanim zaczniesz pisać kod. Po zapoznaniu się z metodami, których API będzie potrzebował, możesz przejść do kroku 3, a następnie cofnąć się (w odniesieniu do VS) do kroku 1 i napisać rzeczywisty test.

Przyznaję, że zwykle robię większość tego w głowie i zaczynam od kroku (3).

 1
Author: tvanfosson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-06 19:25:21

Myślę, że korzystanie z narzędzia takiego jak Resharper pomoże Ci lepiej poczuć TDD. Dla mnie tak.

Dzieje się tak dlatego, że może automatycznie wygenerować wiele pustych klas/metod, które musisz wypisać podczas ich pisania. Pomaga to nie przerywać przepływu, gdy myślisz o tym, jak powinien działać test i jak powinna działać Klasa/metoda, którą testujesz.

 1
Author: Karthik Hariharan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-06 21:23:09
 1
Author: philant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-07 08:24:10

Jeśli O mnie chodzi "see a red squiggle" = = kompilator się nie powiódł. Pamiętaj, że oryginalne manifesty testu jednostkowego/TDD zostały napisane bez IDE w umyśle. Dobre IDE były wtedy bardzo rzadkie w świecie Javy i jak zauważyli inni, języki dynamiczne nadal nie potrafią określić, że metoda nie istnieje w czasie kompilacji, kropka.

Jeśli używasz kombinacji język / IDE, która natychmiast wyświetla błędy kompilacji, to liczy się to jako nieudany cykl kompilacji.

 1
Author: Sean Reilly,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-11 18:16:47

Zgadzam się z innymi respondentami, myślę, że to tylko ludzie, którzy są naiwni, próbując zrobić "dobrą rzecz" bez zastanowienia. Słyszeli gdzieś, że powinieneś napisać swoje testy zanim napiszesz jakikolwiek kod, i robią to dosłownie i próbują skompilować z jakiegoś powodu.

Jest to związane z ta odpowiedź na inne pytanie , użyj najpierw głowy! To najlepsza praktyka.

 0
Author: Adam Bellaire,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:19:01