Początek TDD-wyzwania? Rozwiązania? Zalecenia? [zamknięte]

Ok, wiem, że były już pytania o Rozpoczęcie pracy z TDD.. Jednak chyba wiem, że ogólny concensus jest do po prostu to zrobić , jednak wydaje mi się, że mam następujące problemy z wejściem w grę:

  • podczas pracy ze zbiorami, czy nadal będzie testować na oczywiste Dodaj/usuń / wstawki pomyślne, nawet jeśli oparte na generykach itp., gdzie "wiemy", że będzie działać?
  • niektóre testy wydają się trwać wieczność, aby wdrożenie.. Na przykład podczas pracy z wyjściem ciągów, czy istnieje "lepszy" sposób na tego rodzaju rzeczy? (np. przetestuj model obiektowy przed parsowaniem, rozbij parsowanie na małe operacje i przetestuj tam) moim zdaniem zawsze powinieneś przetestować "wynik końcowy", ale to może się bardzo różnić i być żmudne do skonfigurowania.
  • nie mam frameworka testowego do wykorzystania (praca nie płaci za jeden), więc mogę" ćwiczyć " więcej. Czy są jakieś dobre, które są bezpłatne do użytku komercyjnego? (w tej chwili używam good ' ol debugowanie.Assert :)
  • Prawdopodobnie największy.. Czasami Nie wiem, czego się spodziewać , A NIE .. To znaczy, dostajesz Zielone światło, ale zawsze martwię się, że mogę przegapić test.. Czy kopać głębiej, aby spróbować złamać kod, lub zostawić go i czekać na to wszystko spadnie później (co będzie kosztować więcej)..

Więc w zasadzie to, czego tu Szukam, to nie " po prostu zrób to ", ale więcej " zrobiłem to, miałem z tym problemy, rozwiązałem je przez to ".. osobiste doświadczenie:)

Author: Community, 2008-08-24

11 answers

Po pierwsze, to jest w porządku i normalne czuć się sfrustrowanym, kiedy po raz pierwszy zaczynasz próbować używać TDD w swoim stylu kodowania. Po prostu nie zniechęcaj się i nie rezygnuj, musisz dać mu trochę czasu. Jest to istotna zmiana paradygmatu w sposobie myślenia o rozwiązaniu problemu w kodzie. Lubię o tym myśleć, jak wtedy, gdy przeszliśmy z programowania proceduralnego na obiektowy.

Po drugie, uważam, że test driven development jest przede wszystkim działalnością projektową, która służy do uelastyczniania projektu komponentu, tworząc test, który najpierw opisuje API, które ma zamiar ujawnić i jak zamierzasz korzystać z jego funkcjonalności. Test pomoże kształtować i kształtować testowany System, dopóki nie będziesz w stanie zamknąć wystarczającej funkcjonalności, aby spełnić wszystkie zadania, nad którymi pracujesz.

Biorąc pod uwagę powyższy akapit, spójrzmy na twoje pytania:

  1. Jeśli używam kolekcji w moim testowanym systemie, to skonfiguruję oczekiwanie, aby upewnij się, że kod został wywołany, aby wstawić element, a następnie sprawdzić liczbę kolekcji. Nie koniecznie testuję metodę dodawania na mojej wewnętrznej liście. Po prostu upewnij się, że został wywołany, gdy wywołana jest metoda, która dodaje element. Robię to, dodając do miksu szyderczy framework, z moim frameworkiem testowym.
  2. testowanie ciągów jako wyjścia może być żmudne. Nie możesz wyjaśnić każdego wyniku. Możesz przetestować to, czego oczekujesz, tylko na podstawie funkcjonalności testowanego systemu. Zawsze należy rozbić testy na najmniejszy element, który jest testowany. Co oznacza, że będziesz miał wiele testów, ale testy, które są małe i szybkie i sprawdzają tylko to, co powinny, nic więcej.
  3. istnieje wiele frameworków testowych open source do wyboru. Nie będę się spierał, co jest najlepsze. Po prostu znajdź taki, który Ci się podoba i zacznij go używać.
  4. Wszystko, co możesz zrobić, to skonfiguruj testy, aby uwzględniały to, co chcesz zrobić. Jeśli pojawi się scenariusz, który wprowadza błąd w funkcjonalności, przynajmniej masz test wokół funkcjonalności, aby dodać ten scenariusz do testu, a następnie zmienić funkcjonalność, aż test przejdzie. Jednym ze sposobów, aby znaleźć miejsce, w którym mogliśmy przegapić test, jest użycie pokrycia kodu.

W odpowiedzi na pytanie pierwsze wprowadziłem cię w szyderczy termin. Kiedy wprowadzasz do swojego arsenału drwiny dla TDD, to znacznie ułatwia testowanie wyodrębniania części, które nie są częścią testowanego systemu. Oto kilka zasobów na temat szyderczych RAM:

Jednym ze sposobów pomocy w korzystaniu z TDD, oprócz czytania o tym procesie, jest obserwowanie, jak ludzie to robią. Polecam w oglądaniu na ekranie pojawia się JP Boodhoo na DNRTV. Zobacz też:

Ok, pomogą Ci zobaczyć, jak używane są terminy, które wprowadziłem. Wprowadzi również inne narzędzie o nazwie Resharper i jak może ułatwić proces TDD. Nie mogłem polecić tego narzędzia wystarczająco podczas robienia TDD. Wydaje się, że uczysz się tego procesu i po prostu znajdujesz niektóre problemy, które zostały już rozwiązane za pomocą Inne narzędzia.

Myślę, że zrobiłbym krzywdę społeczności, gdybym nie zaktualizował tego dodając nową serię Kenta Becka na Test Driven Development na Pragmatic Programmer.

 50
Author: Dale Ragan,
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
2011-08-27 20:33:46

Z własnego doświadczenia:

  1. Przetestuj tylko swój własny kod, a nie kod bazowego frameworka. Więc jeśli używasz listy generycznej, nie ma potrzeby testowania dodawania, usuwania itp.

  2. Nie ma 2. Spójrz tam! Małpy!!!

  3. NUnit jest drogą do zrobienia.

  4. Na pewno nie możesz sprawdzić każdego wyniku. Testuję to, czego oczekuję, a następnie testuję kilka skrajnych przypadków, w których oczekuję wyjątków lub nieprawidłowych odpowiedzi. Jeśli błąd pojawi się na ścieżce z powodu czegoś, co zapomniałeś przetestować, pierwszą rzeczą, którą powinieneś zrobić (zanim spróbujesz naprawić błąd), jest napisanie testu, aby udowodnić, że błąd istnieje.

 6
Author: Matt Hamilton,
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
2008-08-24 10:49:10

Moje zdanie na ten temat jest następujące:

  • + 1 dla nie testowania kodu framework, ale nadal może być konieczne przetestowanie klas wywodzących się z framework classes.
  • jeśli jakaś Klasa/metoda jest uciążliwa do testowania, może to być silne wskazanie, że coś jest nie tak z desingiem. Staram się przestrzegać zasady "1 klasa - 1 odpowiedzialność, 1 Metoda - 1 działanie". W ten sposób będziesz mógł testować złożone metody znacznie łatwiej, robiąc to w mniejszych porcjach.
  • + 1 dla xUnit. Dla Javy możesz również rozważmy TestNG .
  • TDD nie jest pojedynczym zdarzeniem, jest procesem. Więc nie próbuj wyobrażać sobie wszystkiego od początku, ale upewnij się, że każdy błąd znaleziony w kodzie jest rzeczywiście objęty testem po wykryciu.
 2
Author: Dima Malenko,
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
2008-08-24 11:17:45

Myślę, że najważniejszą rzeczą z (a właściwie jednym z wielkich wyników, w nieco rekurencyjny sposób) TDD jest skuteczne zarządzanie zależnościami. Musisz upewnić się, że moduły są testowane w izolacji bez skomplikowanej konfiguracji. Na przykład, jeśli testujesz komponent, który ostatecznie wysyła wiadomość e-mail, Ustaw nadawcę wiadomości e-mail jako zależność, aby można było z niej korzystać w testach. To prowadzi do drugiego punktu-kpiny są twoimi przyjaciółmi. Zapoznaj się z wyśmiewaniem frameworki i styl testów, które promują (behawioralne, w przeciwieństwie do klasycznych opartych na stanie), oraz wybory projektowe, które zachęcają (zasada "Powiedz, nie pytaj").

 2
Author: On Freund,
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
2008-08-24 12:46:34

Odkryłem, że zasady przedstawione w trzech kart indeksowych, aby łatwo zapamiętać istotę TDD jest dobrym przewodnikiem.

Anyway, to answer your questions

  1. nie musisz testować czegoś, co "wiesz", że zadziała, chyba że to napisałeś. Nie napisałeś generyków, tylko Microsoft;)
  2. Jeśli musisz zrobić tak wiele dla swojego testu, być może twój obiekt / metoda robi zbyt wiele, jak również.
  3. Pobierz TestDriven.NET aby natychmiast uruchomić jednostkę testowanie na Twoim Visual Studio (chyba, że jest to edycja Express)
  4. po prostu przetestuj poprawną rzecz, która się wydarzy. Nie potrzebujesz , aby przetestować wszystko, co może pójść źle: musisz czekać, aż testy się nie powiedzą.

Poważnie, po prostu to zrób, koleś. :)

 2
Author: Jon Limjap,
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
2008-08-24 13:14:47

W żadnym wypadku nie jestem ekspertem w TDD, ale oto mój pogląd:

  • jeśli jest całkowicie trywialny (getters/setters itp.), nie testuj go, chyba że z jakiegoś powodu nie masz zaufania do kodu.
  • Jeśli jest to dość prosta, ale nietrywialna metoda, przetestuj ją. Test pewnie i tak jest łatwy do napisania.
  • Jeśli chodzi o to, czego się spodziewać, że się nie stanie, powiedziałbym, że jeśli pewnym potencjalnym problemem jest odpowiedzialność klasy, którą testujesz, musisz przetestować że obsługuje to poprawnie. Jeśli nie odpowiada za to obecna klasa, nie testuj jej.

Frameworki testowe xUnit są często bezpłatne, więc jeśli jesteś facetem z. Net, sprawdź NUnit, a jeśli lubisz Javę, sprawdź JUnit.

 0
Author: Erik Öjebo,
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
2008-08-24 10:55:18

Powyższa rada jest dobra, a jeśli chcesz mieć listę darmowych frameworków, nie musisz szukać dalej niż Lista frameworków xUnit Na Wikipedii. Mam nadzieję, że to pomoże:)

 0
Author: Eric Scrivner,
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
2008-08-24 11:18:12

Moim zdaniem (przebieg może się różnić):

1-Jak nie napisałeś to nie testuj. Jeśli go napisałeś i nie masz do niego testu to nie istnieje.

3 - Jak wszyscy mówili, xUnit jest wolny i świetny.

2 & 4-decydowanie o tym, co dokładnie przetestować, jest jedną z tych rzeczy, o których możesz dyskutować ze sobą na zawsze. Staram się kreślić tę linię stosując zasady projektowania przez umowę. Sprawdź 'obiektowa Budowa oprogramowania' lub 'pragmatyczny programista' po szczegóły robi się.

 0
Author: Chris B-C,
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
2008-08-24 12:49:23

Trzymaj testy krótko, "atomowe". Przetestuj najmniejsze założenie w każdym teście. Zrób każdy Testmetod niezależny, dla testów integracyjnych nawet utworzyć nową bazę danych dla każdej metody. Jeśli potrzebujesz zbudować dane dla każdego testu, użyj metody "Init". Użyj mocks, aby oddzielić klasę testowaną od jej zależności.

Zawsze myślę "jaka jest minimalna ilość kodu, którą muszę napisać, aby udowodnić, że to działa we wszystkich przypadkach ?"

 0
Author: Chris Porter,
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
2008-08-24 18:33:10

W ciągu ostatniego roku stałem się coraz bardziej przekonany o korzyściach płynących z TDD. Rzeczy, których nauczyłem się po drodze: 1) dependency injection jest twoim przyjacielem. Nie mówię o inwersji kontenerów sterujących i frameworków do montowania architektur wtyczek, tylko o przekazaniu zależności do konstruktora testowanego obiektu. To zwraca ogromne dywidendy w testowalności kodu. 2) wyruszyłem z pasją / gorliwością nawróconego i chwyciłem szyderczego framework i zestaw o używaniu mocks do wszystkiego, co mogłem. Doprowadziło to do kruchych testów, które wymagały wielu bolesnych ustawień i przewróciłyby się, gdy tylko zacząłem refaktoryzację. Użyj odpowiedniego rodzaju podwójnego testu. Podróbki, w których musisz tylko honorować interfejs, stuby do przekazywania danych z powrotem do testowanego obiektu, makiety tylko tam, gdzie zależy ci na interakcji. 3) Test powinien być mały. Celuj w jedno twierdzenie lub interakcję badaną w każdym teście. Staram się to robić i przeważnie tam jestem. To jest o solidności kodu testowego, a także o złożoności testu, gdy trzeba go później ponownie odwiedzić.

Największym problemem, jaki miałem z TDD, była praca ze specyfikacją z organu normalizacyjnego i implementacja przez stronę trzecią tego standardu, który był de facto standardem. Zakodowałem wiele naprawdę ładnych testów jednostkowych zgodnie z literą specyfikacji tylko po to, aby stwierdzić, że implementacja po drugiej stronie ogrodzenia postrzegała standard jako bardziej doradczy dokument. Grali z tym dość luźno. Jedynym sposobem, aby to naprawić, było przetestowanie z implementacją, jak również testy jednostkowe i refakturowanie testów i kodu w razie potrzeby. Prawdziwym problemem było przekonanie z mojej strony, że tak długo, jak miałem kod i testy jednostkowe wszystko było dobre. Nie. Musisz budować rzeczywiste wyniki i przeprowadzać testy funkcjonalne w tym samym czasie, co testy jednostkowe. Małe korzyści przez cały proces-w ręce użytkowników lub interesariuszy.

 0
Author: Hamish Smith,
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
2008-09-17 11:07:07

Jako dodatek do tego, pomyślałem, że powiem, że umieściłem blog post na moich przemyśleniach na temat rozpoczęcia testów( po tej dyskusji i moich własnych badaniach), ponieważ może to być przydatne dla osób oglądających ten wątek.

"TDD-pierwsze kroki z rozwojem opartym na testach " - otrzymałem jak dotąd świetne opinie i byłbym wdzięczny za więcej, które macie do zaoferowania.

Mam nadzieję, że to pomoże! :)

 0
Author: Rob Cooper,
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
2008-09-22 07:53:46