Dodawanie testów jednostkowych do kodu starszego [zamknięte]

Czy dodałeś kiedyś testy jednostkowe, po fakcie, do kodu starszego? Jak skomplikowany był kod i jak trudno było wszystko skrócić i wyśmiewać? Czy efekt końcowy był wartościowy?

Author: BuckeyeSoftwareGuy, 2009-10-09

8 answers

Najlepszym sposobem, jak znalazłem, jest stopniowe dodawanie testów jednostkowych, a nie po prostu wskoczyć i powiedzieć, że będziemy teraz testować aplikację jednostkową.

Więc, jeśli masz zamiar dotknąć kodu, aby naprawić błędy lub refaktoryzację, najpierw napisz testy jednostkowe. W przypadku błędów testy jednostkowe pomogą udowodnić, gdzie jest problem, ponieważ można go powielić.

Jeśli refaktoryzacja, będziesz chciał napisać testy jednostkowe, ale może się okazać, że test jest niemożliwy do napisania, więc być może będziesz musiał znaleźć wysoki poziom, to wywołuje funkcję, która będzie refakturowana, i test jednostkowy tej części. Następnie, gdy refaktorujesz funkcję ofensywną, napisz swoje testy, aby upewnić się, że działa ona tak, jak powinna.

Nie ma na to łatwego sposobu.

To pytanie może pomóc w więcej sugestii. jak wprowadzić testy jednostkowe do dużej, starszej bazy kodowej (C / C++)?

 50
Author: James Black,
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:10:11

Michael Feathers książka "Working Effectively with Legacy Code" jest całą książką obejmującą ten temat. Michael stwierdza, że często zbyt trudno jest wprowadzić testy dla kodu starszego, ponieważ nie jest on skonstruowany do testowania. Co mam z książki najbardziej było kilka wzorów o nazwie "Sprout functions" i "Sprout classes". Funkcja sprout to taka, która zawiera zmiany, które musisz wprowadzić w kodzie. Następnie testujesz tylko te funkcje. Klasa kiełków to ten sam pomysł oprócz nowej funkcjonalności jest zawarty w klasie.

 36
Author: Phillip Ngan,
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-10-09 03:02:30

Tak, i to jest ogólnie bolesne. Często kończyłem na pisaniu testów integracyjnych.

Książka Sztuka testowania jednostkowego ma na ten temat dobre rady. Poleca również książkę działającą efektywnie z kodem starszym ; tego ostatniego jeszcze nie czytałem, ale jest na moim stosie.

EDIT: ale tak, nawet minimalne pokrycie kodu było warte zachodu. Dało mi to pewność siebie i zabezpieczenie do refaktoryzacji kodu.

EDIT: przeczytałem skutecznie ze starszym kodem i jest doskonały.

 8
Author: TrueWill,
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
2012-10-10 17:36:19

Jedną z alternatyw dla testów jednostkowych, wprowadzoną również w efektywnej pracy z kodem starszym, są testy charakterystyki . Miałem ciekawe wyniki z takich testów. Są łatwiejsze do skonfigurowania niż testy jednostkowe, ponieważ testujesz z punktu, niż można je przetestować (zwane szwem). Wadą jest to, że gdy test się nie powiedzie, masz mniej wskazówek na temat lokalizacji problemu, ponieważ obszar badany może być znacznie większy niż w przypadku testów jednostkowych. Logowanie pomaga tutaj.


A unit test framework such te z rodziny xUnit mogą być używane do pisania testów charakterystyki.

W takich testach, pisanych po Faktach, twierdzenia weryfikują bieżące zachowanie kodu. W przeciwieństwie do testów jednostkowych, nie udowadniają one, że kod jest poprawny, są tylko przypinaniem (charakteryzowaniem) bieżącego zachowania kodu.

Proces jest podobny do TDD,:

  • napisz test dla części kodu
  • execute it-fail
  • fix test z obserwowanych zachowanie kodu
  • execute it-pass
  • repeat

Testy nie powiodą się, jeśli zmodyfikujesz zewnętrzne zachowanie kodu. Zewnętrzne zachowanie kodu ? brzmi znajomo ? Tak, jesteśmy. Teraz możesz refaktorować kod.

Oczywiście ryzyko zależy od zakresu testów charakterystyki.

 5
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-10-10 14:24:58

Przyjrzyj się również nowemu podejściu w obszarze testowania jednostek kodu źródłowego-projekt asis, inspirowany projektem ApprovalTests i dzieli się jego kluczowymi koncepcjami.

Jak wspomniano o podejściu ApprovalTests w w tym artykule :

Często masz ogromny projekt kodu legacy, w którym nie masz testów na wszystkie, ale trzeba zmienić kod, aby zaimplementować nową funkcję, lub refaktor. Ciekawostką w kodzie legacy jest to, że działa! Informatyka działa dla lat, bez względu na to, jak jest napisane. A to jest bardzo wielki zaleta tego kodu. Z zatwierdzeniem, tylko jeden test można uzyskać wszystkie możliwe wyjścia (HTML, XML, JSON, SQL lub dowolne wyjście być) I zatwierdzić, bo wiesz-to działa! Po zakończeniu taki test i zatwierdził wynik, jesteś naprawdę znacznie bezpieczniejszy z refaktoryzacja, ponieważ teraz "zablokowałeś" wszystkie istniejące zachowania.

Narzędzie Asis jest dokładnie o utrzymanie kodu poprzez automatyczne tworzenie i uruchamianie testów charakterystyki.

Więcej informacji można znaleźć na stronie

 5
Author: zavg,
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
2013-09-21 14:43:43

Jeśli planujesz refaktoryzację kodu starszego, tworzenie testów jednostkowych jest koniecznością. Nie martw się o wyśmiewanie lub stubbing - martw się o testowanie wejść i wyjść systemu, aby twoje zmiany lub wysiłki refaktoryzacyjne nie złamały bieżącej funkcjonalności.

Nie będę kłamać, modernizacja testów jednostkowych do kodu starszego jest trudna - ale warto.

 4
Author: Andrew Hare,
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-10-09 02:59:42

Spójrz na darmową, otwartoźródłową bibliotekę narzędzi do testowania jednostek, ApprovalTests . Jeśli jesteś programistą. NET, twórca, Llewellyn Falco, stworzył serię filmów pokazujących, w jaki sposób używa testów zatwierdzających do ulepszenia testów jednostkowych zarówno dla nowego, jak i starszego kodu.

 4
Author: Lynn Langit,
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
2012-05-17 23:04:38

Już jakiś czas temu mówiłem o idei odwróconych testów w kodzie Legacy Na XPDays http://xpdays.com.ua/archive/xp-days-ukraine-2012/materials/legacy-code/

Ta prezentacja powinna odpowiedzieć na pytanie, dlaczego tak ważne jest czasami, aby zacząć od testów integracyjnych / funkcjonalnych lub nawet testów akceptacyjnych na wysokim poziomie podczas pracy z kodem starszym. A potem powoli, krok po kroku Wprowadzamy testy jednostkowe. Nie ma przykładów kodu-sorry, ale można znaleźć kilka ich w książce Michaelsa Feathersa "Working effectively with Legacy Code".

Możesz również sprawdzić legacy Code Retreat http://www.jbrains.ca/legacy-code-retreat i poszukaj tego spotkania w swojej okolicy.

 1
Author: streser,
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
2013-06-27 07:58:55