Obecnie refaktoryzuję część dużej bazy kodu bez żadnych testów jednostkowych. Próbowałem zmienić kod na brutalny, tzn. Próbując odgadnąć, co robi kod i jakie zmiany nie zmieniłyby jego znaczenia, ale bez powodzenia: losowo psuje funkcje w całej bazie kodu.
Należy pamiętać, że refaktoryzacja obejmuje przeniesienie starszego kodu C # do bardziej funkcjonalnego stylu (starszy kod nie korzysta z żadnych funkcji .NET Framework 3 i nowszych, w tym LINQ), dodając ogólne, w których kod może z nich skorzystać itp.
Nie mogę korzystać z metod formalnych , biorąc pod uwagę, ile by to kosztowały.
Z drugiej strony, zakładam, że należy ściśle przestrzegać zasady „Każdy zrekonstruowany starszy kod będzie zawierał testy jednostkowe” , niezależnie od tego, ile by to kosztowało. Problem polega na tym, że kiedy refaktoryzuję niewielką część prywatnej metody 500 LOC, dodawanie testów jednostkowych wydaje się trudnym zadaniem.
Co może mi pomóc w ustaleniu, które testy jednostkowe są odpowiednie dla danego fragmentu kodu? Domyślam się, że statyczna analiza kodu byłaby w jakiś sposób pomocna, ale jakich narzędzi i technik mogę użyć do:
Wiedz dokładnie, jakie testy jednostkowe powinienem utworzyć,
I / lub wiesz, czy dokonana przeze mnie zmiana wpłynęła na oryginalny kod w sposób, który wykonuje inaczej niż teraz?
źródło
formal methods in software development
ponieważ służy on do udowodnienia poprawności programu przy użyciu logiki predykatów i nie miałby zastosowania do refaktoryzacji dużej bazy kodu. Formalne metody zwykle stosowane w celu udowodnienia, że kod działa poprawnie w obszarach takich jak zastosowania medyczne. Masz rację, jest to kosztowne, dlatego nie jest często używane.Odpowiedzi:
Miałem podobne wyzwania. Książka Working with Legacy Code to świetny zasób, ale można założyć, że w testach jednostkowych możesz walić stopą, aby wesprzeć swoją pracę. Czasami to po prostu niemożliwe.
W mojej pracy z zakresu archeologii (mój termin na utrzymanie takiego kodu starszego typu) stosuję podobne podejście do tego, co nakreśliłeś.
W tym momencie powinieneś mieć listę kandydatów na to, co zostało ujawnione i / lub zmanipulowane przez tę procedurę. Niektóre z tych manipulacji mogą być nieumyślne. Teraz używam
findstr
i IDE, aby zrozumieć, jakie inne obszary mogą odnosić się do pozycji na liście kandydatów. Poświęcę trochę czasu na zrozumienie, jak działają te referencje i jaka jest ich natura.Wreszcie, kiedy już się łudzę, że rozumiem wpływ pierwotnej rutyny, wprowadzę zmiany pojedynczo i ponownie uruchomię opisane powyżej analizy, aby sprawdzić, czy zmiana działa zgodnie z oczekiwaniami to działa. W szczególności staram się unikać zmiany wielu rzeczy na raz, ponieważ stwierdziłem, że to mnie wysadza, gdy próbuję zweryfikować wpływ. Czasami można uniknąć wielu zmian, ale jeśli mogę podążać pojedynczą trasą, to moje preferencje.
Krótko mówiąc, moje podejście jest podobne do tego, co przedstawiłeś. To dużo pracy przygotowawczej; następnie dokonaj rozważnych, indywidualnych zmian; a następnie zweryfikuj, zweryfikuj, zweryfikuj.
źródło
Krótka odpowiedź: małe kroki.
Rozważ następujące kroki:
Przenieś implementację do innej (prywatnej) funkcji i przekaż połączenie.
Dodaj kod rejestrujący (upewnij się, że rejestracja nie powiedzie się) w oryginalnej funkcji dla wszystkich danych wejściowych i wyjściowych.
Uruchom aplikację i rób z nią, co możesz (prawidłowe użycie, nieprawidłowe użycie, typowe użycie, nietypowe użycie itp.).
Masz teraz
max(call_count)
zestawy danych wejściowych i wyjściowych do pisania testów; Możesz napisać pojedynczy test, który będzie powtarzał wszystkie posiadane parametry / zestawy wyników i wykonywał je w pętli. Możesz także napisać dodatkowy test, który uruchamia określoną kombinację (do użycia, aby szybko sprawdzić przekazywanie określonego zestawu we / wy).Przenieść
// 500 LOC here
z powrotem dougly500loc
funkcji (i usunąć z zalogowaniem funkcjonalność).Zacznij wyodrębniać funkcje z dużej funkcji (nie rób nic więcej, po prostu wyodrębniaj funkcje) i uruchamiaj testy. Po tym powinieneś mieć więcej małych funkcji do refaktoryzacji, zamiast 500LOC.
Żyj długo i szczęśliwie.
źródło
Zwykle są to testy jednostkowe.
Wykonaj niezbędne testy, które udowodnią, że prąd działa zgodnie z oczekiwaniami. Nie spiesz się, a ostatni test sprawi, że będziesz pewny wyników.
Jesteś w trakcie refaktoryzacji fragmentu kodu, musisz dokładnie wiedzieć, co robi i na co wpływa. Zasadniczo musisz przetestować wszystkie dotknięte strefy. Zajmie ci to dużo czasu ... ale jest to oczekiwany wynik każdego procesu refaktoryzacji.
Następnie możesz bez problemu rozerwać wszystko na strzępy.
AFAIK, nie ma na to techniki kuloodpornej ... musisz być metodyczny (na jakiejkolwiek metodzie, na której czujesz się komfortowo), dużo czasu i dużo cierpliwości! :)
Pozdrawiam i powodzenia!
Alex
źródło