2009-05-27 17 views
7

Pozwól mi najpierw wyjść z szafy. Jestem wierzącym w TDD. Próbuję ćwiczyć Test Driven Development tak bardzo, jak tylko mogę.Jaki jest najlepszy argument, aby przekonać programistów do nauki TDD?

Niektórzy programiści w mojej pracy odmawiają nawet wypróbowania. Sam założyłem TDD, próbując udowodnić jednemu z moich rówieśników, że Test Driven Development to zły pomysł. Argumenty są następujące:

  • Dlaczego? Do tej pory byłem dość udanym deweloperem.
  • To mnie spowolni.

Jaki najlepszy argument pro TDD został usłyszany lub wykorzystany?


Zobacz także:What is the best reason for unit testing?

+0

możesz chcieć użyć pełnej frazy "rozwój oparty na teście" gdzieś w pytaniu. – Jherico

+1

lub w rzeczywistości projekt testowany ... –

+3

Należy zwrócić uwagę, że pytanie dotyczy projektowania/projektowania opartego na testach, a nie tylko testów jednostkowych. Odpowiedzi, które odnoszą się jedynie do testów jednostkowych, są w pewnym sensie pozbawione sensu. Wiele osób (prawdopodobnie większość), których test jednostkowy nie kupuje w TDD. – Chuck

Odpowiedz

15

TDD to zwrot "zapłać mi teraz lub zapłać później". Jeśli tylko odliczasz czas od rozpoczęcia kodowania do sprawdzania kodu, TDD często zajmuje więcej czasu, szczególnie przy pierwszym uczeniu się TDD. Wypłata pojawia się później w fazie testów, a także w przyszłych rundach kodowania.

W fazie badań stwierdziliśmy, że z TDD:

  1. I miały znacząco mniej błędów. Mój ostatni kod TDD miałem błędy tylko z powodu nieporozumień wymagań (lub zmian) lub w obszarach, w których nie byłem w stanie doprowadzić testowanego kodu (w tym przypadku kod PHP).
  2. Błędy, które miałem, były na ogół łatwiejsze do odtworzenia w teście, ponieważ miałem już testowany system.
  3. Naprawianie błędów było szybsze, a dzięki testom mogłem mieć większe przekonanie, że nie wprowadziłem nowych błędów.

Sam kod miał następujące właściwości:

  1. Jak zacząłem myśleć jak klient kodu, kod tendencję do być łatwiejsze w użyciu. (Jest to jedna z zalet pisania testów w pierwszej kolejności).

  2. Kod łatwiej przetestować.

  3. Pisanie testów jednostkowych jest łatwiejsze (i w wielu przypadkach bardziej zabawne) tuż przed, niż po, więc napisano więcej testów.

  4. Kod łatwiej refactor i oczyścić. Było to szczególnie prawdziwe w przypadku Pythona, w którym narzędzia do automatycznego refaktoryzacji mają trudniejszy czas.

Z tego powodu, kiedy przyszedł czas na przegląd kodu, łatwiej było zrozumieć i łatwiej zmienić, plus mieliśmy przynajmniej kilka testów regresji już na miejscu.

Co oznacza, że ​​zwrot z tytułu czasu TDD może być późniejszy: miesięcy. Ponadto uruchamianie TDD ze starszym kodem jest szczególnie trudne. Potem jest czas, aby nauczyć się pisać dobre testy (zły zestaw testowy może być albo niewystarczający, albo gorszy, być kruchym, co utrudnia, nie jest łatwiejsze do zrobienia refaktoryzacji) i jak uzyskać złożony testowany system.

Muszę przyznać, że nie byłem w stanie zdobyć zbyt wielu innych osób, aby przejść na TDD.Myślę, że zmieniłem się głównie dlatego, że chciałem łatwiejszy sposób testowania, a także miałem okazję dowiedzieć się, jak z małą bazą kodu i osobistym projektem.

+0

Podoba mi się "cztery właściwości", o których wspomniałeś. Są prawie tym, co widziałem ... zwłaszcza fakt, że wynikowy kod okazał się łatwiejszy w użyciu. – StudioEvoque

+0

Zajmowałem się dotychczasowym aspektem kodu, pisząc kod testowy, który można również połączyć z plikiem wykonywalnym. Wadą jest to, że musisz "założyć", że reszta systemu działa poprawnie, a następnie używasz TDD tylko do "nowego kodu". –

1

Argumenty ty wymienione nie są racjonalne, logiczne argumenty. Nie mają za sobą żadnego uzasadnienia (chyba, że ​​faktycznie podsumowałeś znacznie dłuższe prawdziwe argumenty).

W związku z tym nie sądzę, że będziesz w stanie przekonać każdego, kto wysunie te roszczenia z racjonalnymi argumentami własnego . Najlepszym sposobem będzie odwołanie się do źródła ich argumentów; doświadczenie. Poproś ich, aby tymczasowo korzystali z TDD, aby zobaczyć, co o nich myślą, a jeśli tak, to czy TDD działa samodzielnie, co jest oczywiście bardzo dobrą pracą i przedstawia je jako przykład dla nich.

(nie jestem wierzący TDD. Jest to praktyczny sposób można przekonać mnie, że to był dobry pomysł.)

20

Żadna ilość argumentów przekona nikogo do korzystania TDD.

Należy POKAZAĆ je i wykazać korzyści. Łatwiej jest sprawić, że ktoś "zacznie świecić", pokazując, a nie mówiąc.

+9

+1 do Mitcha. To nie jest ćwiczenie w filozofii, to programowanie. Jeśli nie możesz pokazać korzyści, może one nie istnieją. A jeśli możesz i twoja rada jest zignorowana, możesz mieć większe problemy niż przekonanie ludzi do przyjęcia TDD. – micahtan

+2

Podczas gdy nie jestem na łodzi TDD, całkowicie zgadzam się co do wartości osobistego przykładu. Pokazywanie komentarzy o wątkach stackoverflow i proszenie swoich kolegów z zespołu o przejście na TDD w oparciu o to spowoduje, że OP będzie dobrze zasłużony boot :) –

+0

To musi być prawda! ponieważ nie używamy TDD i osobiście wciąż nie jestem przekonany. Wciąż czytam wątki, aby sprawdzić, czy mogę uzyskać wgląd. Używamy generowania kodu, dużo !, i przekonamy się, że poświęcenie czasu na utrzymanie zmniejsza ilość przyszłej pracy, a wiele błędów, w niektórych przypadkach, naprawia wiele błędów za jednym zamachem. Nie jesteś pewien, czy warto napisać wygenerowany kod testowy? –

0

Jako profesjonalny programista od ponad 10 lat, najlepszym argumentem, jaki mogę wysunąć, jest to, że nawet znalazłem swoje błędy, zanim dotarłem do punktu, w którym można "uruchomić" aplikację.

Odkryłem również, że konstrukcja mojego kodu była bardziej solidna i łatwiejsza do zmiany, a to dało mi większą pewność, że refactor.

"Całkiem udany" nie oznacza "Naprawdę udany".

Inną wielką zaletą jest to, że nie muszę już pisać uprzęży testowych, ponieważ biegacze testów jednostkowych skutecznie stają się moją uprzężą testową.

+0

David, podane przez ciebie powody są zdecydowanie poprawne. Są to jednak zalety testów jednostkowych, a nie specyficzne dla TDD. –

+0

Testowanie jednostki różni się od testu przed napisaniem. Podczas, gdy dwa z trzech, być może testów jednostkowych, "DESIGN OF MY CODE" nie jest wynikiem testów jednostkowych, ale bardziej TDD podejście do budowania testu przed napisaniem kodu. –

0

Pokaż im tę prezentację. Sprzedał mnie.

http://www.slideshare.net/sebastian_bergmann/testing-with-phpunit-and-selenium-156187

Każdy programista, kto kiedykolwiek do czynienia z naprawdę trudnym zadaniu z wielu warunków brzegowych powinien być w stanie zobaczyć wartość TDD. Jeśli chodzi o coś takiego, jak upewnienie się, że wyszukiwarka będzie pasować do określonych ciągów, TDD jest jedynym sposobem, w jaki będziesz w stanie pozostać przy zdrowych zmysłach podczas konserwacji - to jedyny sposób, by upewnić się, że naprawiłeś jedną skrzynkę bez zrywania kilku innych jest zautomatyzowane testowanie.

+1

Zgadzam się, że zautomatyzowane testowanie jest bardzo przydatne podczas projektowania skomplikowanych systemów, takich jak te, których wyniki można obiektywnie ocenić (przykro mi, nie oglądałem prezentacji, mam nadzieję, że nie brakuje mi kontekstu) - ale to nie jest tak naprawdę test napędzany rozwój, czyż nie? To tylko testowanie. Rozwój oparty na testach wymagałby testowania zarówno tych systemów, jak i tych prostszych. – mquander

+0

Zgadzam się z mquander. Z mojego doświadczenia wynika, że ​​udało mi się przekonać ludzi, którzy nigdy wcześniej nie testowali jednostek, do przyjęcia testów jednostkowych w ciągu kilku dni. Jednak nie miałem szczęścia przekonać ich do przejścia na TDD. TDD to całkowita zmiana w podejściu do kodowania. Również wielu programistów uważa kod testowy za obywatela trzeciej kategorii. Pomysł na rozpoczęcie testów? To zbyt szalone :) –

3

Różne osoby będą przekonane (lub nie) na różne sposoby, więc jedyną uczciwą odpowiedzią jest "to zależy".

Jednym ze sposobów, w jaki widziałem pracę kilka razy, jest usiąść z kimś po tym, jak zmagają się z kawałkiem kodu i odtworzyć go za pomocą TDD. Wynikowy kod jest zwykle mniejszy i bardziej przejrzysty.

3

Nie ćwiczę TDD. Chociaż widzę, jak to jest dobre, jeśli masz złożone projekty, w których masz do przetestowania wiele różnych przypadków testowych, nie widzę wielkich korzyści z używania go w, powiedzmy, prostej aplikacji internetowej.

Jednym ze sposobów, w jaki ktoś mógłby mnie przekonać do korzystania z TDD byłoby, gdybyśmy wzięli ten sam projekt i zrobili to obok siebie, zobacz kto ma lepsze wyniki i kto szybciej wykonuje zadanie.

31

Być może wiedzą lepiej.

Testy jednostkowe przez deweloperów jest niezwykle przydatny praktyka i nie mogę przecenić swoje korzyści, nie tylko podczas początkowego rozwoju, ale także podczas refaktoryzacji gdy testy jednostkowe mogą złapać wcześnie nie tylko wady zwykły kod, ale również przerwę założeń poczynionych przez programistów, którzy nigdy nie zostali przechwyceni w formalnej dokumentacji, a zatem prawdopodobnie utracą je w momencie refaktoryzacji.

Mając na uwadze powyższe, TDD ma magicznego pyłu pixie:

  1. do „wystarczy napisać tyle kodu, aby zdać test” podejście daje fałszywych alarmów. Często znane są błędy i problemy, których nie można rozwiązać za pomocą podejścia "tylko tyle". Krótkie przykłady, które przychodzą na myśl, to: problemy z wydajnością distributed systems fallacies lub NUMA. Po prostu przechwytywanie tych wymagań w prosty wyrażając te przypadki testowe dla TDD zamieniłoby się w pracy w pełnym wymiarze godzin w sobie.
  2. eksplozja moqs wymyka się spod kontroli w przypadku każdego poważnego projektu. mocks są kodowane jak każdy inny kod, muszą być utrzymane i po prostu nie pisać się z nieba.
  3. TDD jest często używany jako pretekst do wyeliminowania testów QA. "nasz programista napisał już testowany identyfikator, pozwala go całkowicie zaniedbać kompleksowe testy zorientowane na funkcje Kontrola jakości powinna obejmować:
  4. Nie ufam, że lis strzeże kurnika. Nieprawidłowy algorytm może nadal przekazywać TDD z latałymi kolorami, jeśli te same błędy są popełniane zarówno w teście, jak iw implementacji.
  5. Wszystkie metody w końcu próbują użyć procesu do zastąpienia talentu.

Moja główna kłótnia z TDD jest przedstawiana jako magiczne rozwiązanie większości problemów rozwojowych, ale jego koszty są utrzymywane pod stołem przez jej adwokatów. Podwojenie lub potrojenie bazy kodu za pomocą moqs nie przychodzi za darmo. Raczej widzę kilka kompleksowych testów jednostkowych napisanych podczas opracowywania. Testowe podejście TDD, jeszcze nie widzę jego zalet w projekcie o realnej wielkości.

Rozumiem będę jajko-ed na śmierć teraz za komentarz, ale co do cholery, kogo to obchodzi ...

+1

Uzgodnione. Srebrne kule nie istnieją. –

+3

Uzgodnione. Ale najpierw napisanie testu zmusza (autora) do przemyślenia, w jaki sposób twój kod/API/biblioteka/cokolwiek zostanie zużyte. Przestajesz myśleć o wewnętrznych szczegółach i zaczynasz zastanawiać się, w jaki sposób zostanie użyty. To prowadzi do czystszych interfejsów i bardziej przydatnego kodu. –

+1

Prawda. Powinieneś bezwzględnie napisać test dla interfejsu składnika "brama publiczna" iw ten sposób spożywać będziesz swój własny karmy dla psów, miejmy nadzieję, że skończy się na interfejsie, z którego ludzie mogą korzystać. Czy TDD jest jedynym sposobem na osiągnięcie tego? Czy przyjęcie TDD zagwarantuje ten wynik? –

2

Pair z nimi. Nie musisz nazywać tego "programowaniem parami" - to przerażające dla kogoś, kto nie chce nawet rozważać "radykalnych" technik, takich jak TDD - ale jeśli oboje siedzisz przy biurku i pracujesz nad tym samym problemem, łatwo jest wykazać wartość TDD. To nie może być koniec rozmowy, ale to piekielnie dobry początek. Daje ci wiarygodność do końca rozmowy i daje ci coś prawdziwego jako podstawę do dalszej dyskusji.

0

Dokładne testy jednostkowe ograniczają występowanie błędów, ale także zmniejszają możliwość powtórnego wykrywania lub zakres uszkodzeń spowodowanych przez ponowne wykrycie.

2

Momentem "aha" dla mnie było przeczytanie rozdziału 2 "Test-Driven Development in Microsoft.Net" James Newkirk. (Nie znaczy to, że reszta książki nie była ważna ... poświęca kilka rozdziałów na tworzenie wielopoziomowej aplikacji w TDD).

Tworzy prosty stos, ale zobaczysz kod "ewoluuj" jego złożoność, zamiast zaczynać od złożonych.

Nawet wtedy nadal będziesz mieć problemy z przekonaniem naiwnych, ponieważ wydaje się, że TDD wymaga dużo więcej pracy niż tradycyjne programowanie. Jednak większość programistów anty-TDD zapomina o uwzględnieniu czasu rozwoju testów jednostkowych na końcu, przynajmniej z mojego doświadczenia.

Powiązane problemy