Przeniesienie istniejącego kodu do Test Driven Development

Niedawno odkryłem tę metodę rozwoju, uważam ją za dość ładną metodologię. Tak więc, dla mojego pierwszego projektu, mam małą wartość DLL kodu (w C#.NET, o ile to jest warte), i chcę zrobić zestaw testów dla tego kodu, ale jestem trochę zagubiony, jak i od czego zacząć.

Używam NUnit, a VS 2008, wszelkie wskazówki, od jakich klas zacząć, do czego pisać testy, i wszelkie wskazówki, jak ogólnie przenieść kod do testów rozwój byłby bardzo mile widziany.

 34
Author: Matthew Scharley, 2008-10-03

5 answers

Zobacz książkę Working Effectively with Legacy Code autorstwa Michaela Feathersa.

Podsumowując, refaktoryzacja istniejącego kodu na testowalny i przetestowany kod to dużo pracy; czasami jest to zbyt dużo pracy, aby być praktycznym. To zależy od tego, jak duża jest baza kodowa i jak bardzo różne klasy i funkcje zależą od siebie nawzajem.

Refaktoryzacja bez testów wprowadzi zmiany w zachowaniu (np. błędy). A puryści powiedzą, że to nie do końca refaktoryzacja z powodu brak testów sprawdzających, czy zachowanie się nie zmienia.

Zamiast dodawać testy do całej aplikacji jednocześnie, dodaj testy, gdy pracujesz w obszarze kodu. Najprawdopodobniej będziesz musiał ponownie wrócić do tych" hotspotów".

Dodaj testy od dołu do góry: przetestuj małe, niezależne Klasy i funkcje pod kątem poprawności.

Dodaj testy z góry na dół: Przetestuj całe podsystemy jako czarne skrzynki, aby sprawdzić, czy ich zachowanie zmienia się wraz ze zmianami w kodzie. I tak możesz przejść przez nie, aby dowiedzieć się, co się dzieje. Takie podejście prawdopodobnie przyniesie Ci najwięcej korzyści.

Nie przejmuj się na początku tym, czym jest" poprawne " zachowanie podczas dodawania testów, uważaj na wykrywanie i unikanie zmian w zachowaniu. Duże, niesprawdzone systemy często mają wewnętrzne zachowania, które mogą wydawać się nieprawidłowe, ale od których zależą Inne części systemu.

Pomyśl o izolowaniu zależności, takich jak Baza Danych, system plików, sieć, aby mogły być zamienione na dostawców pozorowanych danych podczas testów.

Jeśli program nie ma wewnętrznych interfejsów, linii określających granicę między jednym podsystemem/warstwą a inną, być może będziesz musiał spróbować je wprowadzić i przetestować na nich.

Również automatyczne frameworki, takie jak Rhinomocks lub Moq mogą pomóc w mockowaniu istniejących klas. Nie znalazłem potrzeby ich w kodzie przeznaczonym do testowania.

 54
Author: Anthony,
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-10-23 15:38:19

Efektywna praca z kodem starszym jest moją Biblią, jeśli chodzi o migrację kodu bez testów do środowiska testowanego jednostkowo, a także zapewnia wiele wglądu w to, co sprawia, że kod jest łatwy do testowania i jak go testować.

Znalazłem również Test Driven Development na przykładzie i Pragmatic Unit Testing: in C# with NUnit jako przyzwoite wprowadzenie do testów jednostkowych w tym środowisku.

Jednym z prostych sposobów na rozpoczęcie TDD jest rozpoczęcie pisania testów najpierw od dziś i upewnij się, że za każdym razem, gdy musisz dotknąć istniejącego kodu (nie przetestowanego przez jednostkę), piszesz testy, które weryfikują istniejące zachowanie systemu, zanim go zmienisz, abyś mógł ponownie uruchomić te testy, aby zwiększyć pewność, że niczego nie zepsułeś.

 10
Author: David Alpert,
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-10-03 14:24:26

Nazywam to "test Driven Reverse Engineering".

Zacznij "na dole" - każda klasa może być osobno zbadana i napisana dla niej test. W razie wątpliwości, zgaduj.

Kiedy wykonujesz zwykłe TDD w kierunku do przodu, traktujesz test jako święty i zakładasz, że kod jest prawdopodobnie złamany. Czasami test jest zły, ale twoja pozycja wyjściowa jest taka, że to kod.

Kiedy robisz TDRE, kod jest święty - dopóki nie udowodnisz, że kod ma długotrwały błąd. W odwrotnym przypadku, piszesz testy wokół kodu, poprawiając testy, dopóki nie zadziałają i twierdzisz, że kod działa.

Następnie, można kopać w złym kodzie. Niektórzy bad cade będą mieli sensowne przypadki testowe. trzeba to tylko posprzątać. Niektóre zły kod, jednak, będzie również przypadek testowy, który jest bezsensowny. Może to być błąd lub niezdarny projekt, który możesz naprawić.

Aby ocenić, czy kod jest rzeczywiście zły, należy również zacząć od top z ogólnymi przypadkami testowymi. Dane na żywo, które faktycznie działają, to początek. Również dane na żywo, które generują wszystkie znane błędy, również dobre miejsce na początek.

Napisałem małe generatory kodu, które zamieniają dane na żywo w unittest cases. W ten sposób mam spójne podstawy do testowania i refaktoryzacji.

 9
Author: S.Lott,
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-10-03 17:10:40

Testowalny kod jest łatwy do wykrycia-przez towarzyszące testy. Jeśli są jakieś, muszą być testowalne. Jeśli ich nie ma-Załóżmy, że jest odwrotnie. ;)

To powiedziawszy: Test Driven Development (TDD) to nie tyle strategia testowania, co strategia projektowania. Testy, które piszesz, pomagają w zaprojektowaniu interfejsu Twoich klas, a także w poprawieniu zakresu Twoich klas (lub podsystemów w tym zakresie).

Mając testy, które stworzyłeś podczas TDD i wykonanie ich później czyni dobre testy, ale jest jedynie (bardzo mile widzianym) efektem ubocznym tej filozofii projektowania.

To powiedziawszy, spodziewaj się pewnego oporu ze strony kodu przed testowaniem. Posłuchaj kodu i zmień interfejs, aby był łatwy do przetestowania. Najprawdopodobniej przeprojektujesz go, gdy zaczniesz pisać testy.

 4
Author: Olaf Kock,
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-10-03 14:24:24

Twój DLL zapewnia jakiś rodzaj usługi. Dla każdej usługi, co musisz zrobić przed otrzymaniem tej usługi, jakie parametry należy przekazać, aby uzyskać tę usługę, skąd możesz wiedzieć, że żądana usługa została poprawnie wykonana ?

Gdy już znajdziesz odpowiedzi na te pytania, możesz napisać pierwszy test. Takie testy byłyby raczej nazywane testami charakterystyki niż testami jednostkowymi, ale prawdopodobnie byłoby łatwiejsze do napisania niż testami jednostkowymi, gdyby biblioteka DLL nie była rozwijana korzystanie z TDD.

Testy Charakterystyki są również omówione w "Working Effectively with Legacy Code" M. Feathers, co jest zalecane w innych odpowiedziach.

Pamiętaj również, aby przed dodaniem nowej linii kodu napisać nieudany test.

 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
2008-10-03 17:07:14