Spraw, by piłka toczyła się po TDD

10

Należę do zespołu programistów, który współpracuje z wieloma innymi zespołami w celu utrzymania i ulepszania aplikacji, która była używana przez co najmniej 15 lat. Kiedy został zbudowany i zaprojektowany po raz pierwszy, TDD było niespotykane.

Aplikacja jest dość stabilna i rzadko napotykamy błąd zatrzymujący program, ale robimy średnio około jednego lub dwóch błędów tygodniowo, co poważnie obniża jakość usług. Te błędy trwają wiecznie, aby je znaleźć i naprawić, głównie z powodu wskazywania palcem, a jedynym testem, jaki mamy, jest testowanie interfejsu. Ponieważ jest dużo marnowanego czasu na szukanie, gdzie jest błąd, zanim będzie można go naprawić, ja i inny programista planujemy zaproponować Test Driven Development. Niedługo nadejdzie nowy przegląd i chcielibyśmy zobaczyć prawie całkowite testowanie jednostek przeprowadzone na nowych modułach, planujemy również zaproponować zbudowanie jednostek testowych dla każdego kodu, który musimy zmienić, który jest starszy (tj. Naprawa błędu lub implementacja funkcji ), ale nie marnuj czasu na tworzenie przypadków testowych dla kodu, który nie spowodował problemów.

Wydaje mi się to rozsądne. W tym miesiącu mieliśmy błąd, którego usunięcie zajęło ponad dwa tygodnie, ale można go było zidentyfikować przed wdrożeniem, gdyby przeprowadzono testy jednostkowe. Ale dla naszych menedżerów wygląda na to, że wydadzą więcej pieniędzy.

Jak przekonać naszych klientów, że chcą wydać pieniądze na testy jednostkowe i rozwój oparty na testach? Czy są jakieś badania, które pokazują ROI testów jednostkowych?

Malfist
źródło
1
na TDD jest już za późno; patrz „Praca ze starszym kodem” Michaela Feathersa
Steven A. Lowe
Krok 1. Wyszukaj przepełnienie stosu. To zostało zadane. I odpowiedział. Przykłady: stackoverflow.com/search?q=starting+tdd
S.Lott,

Odpowiedzi:

6

Bezpośrednie włączenie pełnej wersji TDD do starszego kodu, projekt konserwacji jest bardzo trudny do sprzedania. Podejście, które widziałem bardzo dobrze, jest takie. Dla każdego przychodzącego błędu utwórz automatyczny test jednostkowy, który demonstruje błąd. Przez „niejednostkowy” rozumiem coś, co może dotykać wielu części systemu, trafionej bazy danych i systemu plików itp. - ale przez „automatyczny” rozumiem uruchamianie bez interakcji człowieka. Jest to rodzaj testu, który będzie potrzebny w pakiecie regresji w każdym przypadku. Napisanie go powoduje wiele rzeczy: sprawia, że ​​kod jest testowalny, nawet jeśli na tym bardzo zgrubnym poziomie, i wystawia cię na konstelację kodu, która może mieć coś wspólnego z błędem, więc edukuje i informuje cię o bardzo konkretny materiał.

Ale to nie koniec. Po uruchomieniu tego testu i uruchomieniu go na czerwono (demonstrując błąd w kodzie), znajdź czas, aby dowiedzieć się, co jest nie tak (w każdym razie musisz to zrobić). Ale jeszcze tego nie naprawiaj. Po wyizolowaniu tego, co uważasz za problem - napisz jednostkętest, który pokazuje ten problem. Teraz masz coś, z czym możesz pracować (i, nawiasem mówiąc, być może musiałeś nieco bardziej udoskonalić w kierunku jeszcze większej testowalności). Napraw błąd. Obejrzyj test zaliczeniowy jednostki. Może dopracuj to w niektórych przypadkach; zdobądź tę jedną jednostkę - tę, która kosztuje Cię zaledwie dwa tygodnie - solidna, czysta i dobrze przetestowana. Teraz uruchom test regresji i zobacz, jak się kończy (oczywiście, jeśli nie, musisz wykonać jeszcze więcej badań i pracy na poziomie jednostki - powtarzaj, aż on też przejdzie). Sprawdź to wszystko. Co masz? Testy regresji dla wcześniej nieudanego kodu. Testy jednostkowe wcześniej nieudanego kodu. Działający kod, który zawiódł. Lepiej zaprojektowany kod, ponieważ teraz jest bardziej testowalny niż był. Większe zaufanie do bazy kodu,

To nie jest „czysty” TDD. Ale szybko pokazuje wyniki i poprawia jakość kodu w miarę upływu czasu. Wyniki pomogą ci uzyskać wpisowe do zarządzania.

Carl Manaster
źródło
Świetna sugestia, ale myślę, że PO szuka bardziej przekonującego argumentu, który uzasadnia dodatkowy czas potrzebny na wdrożenie tego rodzaju podejścia.
Bernard,
Może więc muszę to przeredagować. Próbowałem wyrazić, że większość opisanego wysiłku i tak jest konieczna - dodatkowy czas jest bardzo skromny, co daje znaczne korzyści. Przepraszam, jeśli to nie było jasne.
Carl Manaster,
Jako deweloper jest to dla mnie jasne, ale wiem, że kierownictwo zwykle potrzebuje bardzo przekonującego argumentu (tj. Uzasadnienia kosztów).
Bernard,
Właśnie to zasugerowałem w drugim akapicie pytania. Piszemy TDD dla „nowego kodu” i piszemy przypadki testowe dla każdego starszego kodu, który zmieniliśmy przez poprawkę błędu lub żądanie funkcji.
Malfist
3

W mojej firmie po prostu zastosowałem metodę „tylko chrząknięcia” od JoelOnSoftware i zacząłem pisać testy jednostkowe, ilekroć normalnie po prostu zhakowałem jakąś aplikację konsolową. Zacząłem robić rzeczy znacznie szybciej dzięki bardziej stabilnym wydaniom i zostałem za to zauważony. Zapytany, co robię, wyjaśniłem, że zacząłem używać TDD i pisać testy jednostkowe za każdym razem, gdy modyfikowałem stary kod lub pisałem nowy. Moi koledzy programiści zaczęli się interesować i sami zaczęli używać zintegrowanych testów jednostkowych. Nie wydaje mi się, aby istniał dobry argument za pisaniem testów działającego starszego kodu, ale jeśli możesz udowodnić, że pisanie testów automatycznych jest szybsze i wygodniejsze niż pisanie spaghetti hackowania na konsoli, inteligentni programiści pójdą za nimi.Będą tam również inne korzyści, które skutkują wyższą jakością oprogramowania, ale kluczem do zalogowania się programisty jest pokazanie, że ułatwia im to życie. Jeśli chodzi o rejestrację biznesową, fakt, że zapewni lepsze oprogramowanie i prawdopodobnie zajmie mniej czasu niż wcześniej, powinien wystarczyć do ich przekonania.

Morgan Herlocker
źródło
0

Po pierwsze, należy docenić swoje podejście i szczerość w stosunku do wartości dodanej do pieniędzy klienta. A oto moje przemyślenia na temat tego, jak przekonać swojego menedżera i klienta:

  • Zbierz miary błędów, które naprawiłeś, powiedzmy przez ostatnie 6 miesięcy, oraz minimalny, średni i maksymalny czas, jaki zajęło ci naprawienie błędu.
  • Dla wszystkich błędów, które naprawiłeś lub masz kontekst, spróbuj napisać testy jednostkowe obejmujące te obszary.
  • W przypadku błędów, nad którymi pracujesz, i tych, nad którymi będziesz pracować, spróbuj napisać testy jednostkowe wokół tych obszarów, zanim jeszcze wprowadzisz jakiekolwiek zmiany. Następnie napisz kod, aby ustalić przyczynę i naprawić ją. Sprawdź, czy psuje którykolwiek z istniejących przypadków testowych. Jeśli tak, wyjaśnij i pomóż swoim rówieśnikom zrozumieć znaczenie testów jednostkowych.
  • Gdy wszyscy programiści zrozumieją znaczenie testów jednostkowych, poproś ich o kontynuowanie tego, co robiłeś przez tak wiele dni / tygodni.
  • W miarę upływu czasu produktywność zespołów powinna się poprawiać do tego stopnia, że ​​zarówno kierownik, jak i klienci byliby zaskoczeni tempem poprawy wydajności i jakości kodu. Jest to trochę czasochłonne, ale warto spróbować.

Istnieje inny sposób, a mianowicie próba dołączenia do swojego menedżera podczas konferencji Agile, które odbywają się w okolicy. Na pewno warto wziąć udział.

Jeśli uważasz, że nic nie działa, przejdź dalej ... dołącz do miejsca, które Ci odpowiada. Szczerze, to właśnie zrobiłem. Kiedy wszystko zawiodło, przeszedłem;)

I dowiedz się, jakie testy Jednostek po napisaniu kodu nie są tak naprawdę TDD, ale zawsze może to być pierwszy krok. Co najmniej tak dobrze tu pasuje.

Życzę powodzenia i sukcesów!

karthiks
źródło