Wprowadziłem testy jednostkowe do baz kodu, które wcześniej go nie miały. Ostatni duży projekt, w którym byłem zaangażowany, kiedy to zrobiłem, produkt był już w produkcji z zerowymi testami jednostkowymi, kiedy dotarłem do zespołu. Kiedy odszedłem - 2 lata później - mieliśmy około 4500+ testów dających około 33% pokrycia kodu w bazie kodu z 230 000 + produkcyjnym LOC (finansowa aplikacja Win-Forms w czasie rzeczywistym). Może to zabrzmieć nisko, ale rezultatem była znaczna poprawa jakości kodu i wskaźnika defektów oraz poprawa morale i rentowności.
Można to zrobić, mając zarówno dokładne zrozumienie, jak i zaangażowanie zaangażowanych stron.
Przede wszystkim ważne jest, aby zrozumieć, że testowanie jednostkowe jest umiejętnością samą w sobie. Możesz być bardzo produktywnym programistą według „konwencjonalnych” standardów i nadal mieć trudności z napisaniem testów jednostkowych w sposób, który skaluje się w większym projekcie.
Ponadto, szczególnie w danej sytuacji, dodawanie testów jednostkowych do istniejącej bazy kodu, która nie ma testów, jest również specjalistyczną umiejętnością samą w sobie. O ile ty lub ktoś z twojego zespołu nie ma pomyślnego doświadczenia we wprowadzaniu testów jednostkowych do istniejącej bazy kodu, powiedziałbym, że przeczytanie książki Feather jest wymogiem (nie jest opcjonalne ani zdecydowanie zalecane).
Przejście na testowanie jednostkowe kodu jest inwestycją w ludzi i umiejętności, tak samo jak w jakość kodu. Zrozumienie tego jest bardzo ważne z punktu widzenia nastawienia i zarządzania oczekiwaniami.
Teraz, jeśli chodzi o komentarze i pytania:
Obawiam się jednak, że przeoczę ogólny obraz i przeoczę podstawowe testy, które zostałyby uwzględnione, gdybym używał TDD od samego początku.
Krótka odpowiedź: Tak, przegapisz testy i tak, początkowo mogą nie wyglądać tak, jak miałyby w sytuacji green field.
Bardziej szczegółowa odpowiedź brzmi: to nie ma znaczenia. Zaczynasz bez testów. Zacznij dodawać testy i refaktoryzuj w miarę postępów. Wraz ze wzrostem poziomu umiejętności zacznij podnosić poprzeczkę dla całego nowo napisanego kodu dodanego do projektu. Kontynuuj ulepszanie itp ...
Teraz, czytając między wierszami, odnoszę wrażenie, że wynika to z myślenia o „doskonałości jako wymówce dla niepodejmowania działań”. Lepszym sposobem myślenia jest skupienie się na zaufaniu do siebie. Ponieważ możesz jeszcze nie wiedzieć, jak to zrobić, zorientujesz się, jak to zrobić, i wypełnisz puste pola. Dlatego nie ma powodu do zmartwień.
Ponownie, to umiejętność. Nie można przejść od testów zerowych do doskonałości TDD w jednym „procesie” lub „krok po kroku” podejściu do książki kucharskiej w sposób liniowy. To będzie proces. Twoje oczekiwania muszą dotyczyć stopniowego i narastającego postępu i poprawy. Nie ma magicznej pigułki.
Dobra wiadomość jest taka, że wraz z upływem miesięcy (a nawet lat) Twój kod będzie stopniowo stawał się „prawidłowym”, dobrze podzielonym na czynniki i dobrze przetestowanym kodem.
Na marginesie. Przekonasz się, że główną przeszkodą we wprowadzaniu testów jednostkowych w starej bazie kodu jest brak spójności i nadmierne zależności. Dlatego prawdopodobnie okaże się, że najważniejszą umiejętnością będzie przełamywanie istniejących zależności i oddzielanie kodu, zamiast samodzielnego pisania rzeczywistych testów jednostkowych.
Czy są jakieś procesy / kroki, których należy przestrzegać, aby zapewnić, że istniejące rozwiązania są właściwie testowane jednostkowo, a nie tylko wprowadzane?
Jeśli jeszcze go nie masz, skonfiguruj serwer kompilacji i skonfiguruj kompilację ciągłej integracji, która działa przy każdym sprawdzaniu, w tym wszystkich testach jednostkowych z pokryciem kodu.
Szkol swoich ludzi.
Zacznij gdzieś i zacznij dodawać testy, robiąc postępy z perspektywy klienta (patrz poniżej).
Użyj pokrycia kodu jako przewodniego odniesienia do tego, jaka część kodu produkcyjnego jest testowana.
Czas budowy powinien być zawsze szybki. Jeśli czas kompilacji jest wolny, twoje umiejętności testowania jednostkowego są opóźnione. Znajdź wolne testy i popraw je (oddziel kod produkcyjny i testuj w izolacji). Dobrze napisane, powinieneś być w stanie łatwo przeprowadzić kilka tysięcy testów jednostkowych i nadal ukończyć kompilację w mniej niż 10 minut (~ 1-kilka ms / test to dobra, ale bardzo przybliżona wskazówka, kilka wyjątków może mieć zastosowanie, jak kod wykorzystujący odbicie itp. ).
Sprawdź i dostosuj.
Jak mogę zapewnić, że testy są dobrej jakości i nie są tylko przypadkiem jakiegokolwiek testu, jest lepsze niż brak testów.
Twój własny osąd musi być głównym źródłem rzeczywistości. Nie ma miernika, który mógłby zastąpić umiejętności.
Jeśli nie masz takiego doświadczenia lub osądu, rozważ zatrudnienie kogoś, kto to robi.
Dwa ogólne wskaźniki pomocnicze to całkowite pokrycie kodu i szybkość kompilacji.
Czy warto podjąć wysiłek dla istniejącego rozwiązania, które jest w produkcji?
Tak. Zdecydowana większość pieniędzy wydanych na niestandardowy system lub rozwiązanie jest wydawana po wprowadzeniu go do produkcji. Inwestowanie w jakość, ludzi i umiejętności nigdy nie powinno wychodzić z mody.
Czy lepiej byłoby zignorować testy dla tego projektu i dodać je w możliwym przyszłym przepisaniu?
Musiałbyś wziąć pod uwagę nie tylko inwestycję w ludzi i umiejętności, ale przede wszystkim całkowity koszt posiadania i spodziewany czas życia systemu.
Moja osobista odpowiedź brzmiałaby „tak, oczywiście” w większości przypadków, ponieważ wiem, że jest o wiele lepiej, ale zdaję sobie sprawę, że mogą być wyjątki.
Co będzie bardziej korzystne; spędzasz kilka tygodni na dodawaniu testów lub kilka tygodni na dodawaniu funkcjonalności?
Ani. Twoje podejście powinno polegać na dodawaniu testów do bazy kodu, GDY robisz postęp w zakresie funkcjonalności.
Ponownie, jest to inwestycja w ludzi, umiejętności ORAZ jakość bazy kodu i jako taka będzie wymagała czasu. Członkowie zespołu muszą nauczyć się, jak przełamywać zależności, pisać testy jednostkowe, uczyć się nowych nawyków, poprawiać dyscyplinę i świadomość jakości, jak lepiej projektować oprogramowanie itp. Ważne jest, aby zrozumieć, że kiedy zaczynasz dodawać testy, członkowie zespołu prawdopodobnie tego nie zrobią. mają te umiejętności na wymaganym poziomie, aby to podejście odniosło sukces, więc zatrzymywanie postępów w celu spędzenia całego czasu na dodaniu wielu testów po prostu nie zadziała.
Ponadto dodawanie testów jednostkowych do istniejącej bazy kodu o dowolnej wielkości projektu jest DUŻYM przedsięwzięciem, które wymaga zaangażowania i wytrwałości. Nie możesz zmienić czegoś fundamentalnego, spodziewaj się po drodze dużej wiedzy i poproś swojego sponsora, aby nie oczekiwał zwrotu z inwestycji poprzez zatrzymanie przepływu wartości biznesowej. To nie poleci i szczerze mówiąc nie powinno.
Po trzecie, chcesz zaszczepić w swoim zespole solidne wartości biznesowe. Jakość nigdy nie odbywa się kosztem klienta, a bez jakości nie można działać szybko. Ponadto klient żyje w zmieniającym się świecie, a Twoim zadaniem jest ułatwienie mu adaptacji. Dostosowanie do klienta wymaga zarówno jakości, jak i przepływu wartości biznesowej.
To, co robisz, to spłacanie długu technicznego. Robisz to, jednocześnie obsługując stale zmieniające się potrzeby klientów. Stopniowo, gdy dług jest spłacany, sytuacja poprawia się i łatwiej jest lepiej obsługiwać klienta i dostarczać więcej wartości. Itd. Ten pozytywny rozmach jest tym, do czego powinieneś dążyć, ponieważ podkreśla on zasady zrównoważonego tempa i utrzyma i poprawi moralność - zarówno dla zespołu programistów, klienta, jak i interesariuszy.
Mam nadzieję, że to pomoże