- Mówię o testach jednostkowych w sensie TDD. (Nie zautomatyzowana „integracja” lub jak to nazywasz testami).
- Stary kod jak w: (C ++) bez testów. (patrz: Efektywna współpraca Michaela Feathersa ze starszym kodem )
- Ale także starszy kod jak w: Kod, nad którym nasz zespół pracuje od 10-5 lat, więc bardzo często mamy całkiem dobre pojęcie, gdzie należy coś zmienić.
- Prowadzimy testy jednostkowe (za pośrednictwem Boost.Test) dla niektórych modułów, które pojawiły się później lub były „naturalnym” dopasowaniem do testów jednostkowych (typowe pojemniki specyficzne dla aplikacji, łańcuchy, pomoce sieciowe itp.)
- Nie mamy jeszcze odpowiednich automatycznych testów akceptacyjnych.
Teraz ostatnio miałem „przyjemność” zaimplementować 3 nowe funkcje zorientowane na użytkownika.
Każda z nich zajęła mi około 1-2 godzin przygotowania się do pracy z częściami kodu, które musiałem zmienić, 1-2 godzinami na wdrożenie (małego) kodu, który musiałem zmienić, i kolejne 1-2 godziny, aby upewnić się, że aplikacja działał poprawnie później i zrobił to, co miał zrobić.
Teraz naprawdę dodałem trochę kodu. (Myślę, że dla każdej funkcji jest jedna metoda i kilka linii wywoławczych).
Wyodrębnienie tego kodu (dowolną z metod sugerowanych w WEwLC ), tak aby test jednostkowy miał sens (a nie była kompletną tautologią), zajęłoby z łatwością kolejne 2-4 godziny, jeśli nie więcej. Wydłużyłoby to 50–100% czasu do każdej funkcji, bez natychmiastowych korzyści, jak
- Nie potrzebowałem testu jednostkowego, aby zrozumieć cokolwiek na temat kodu
- Ręczne testowanie to ta sama ilość pracy, ponieważ wciąż muszę sprawdzić, czy kod jest poprawnie zintegrowany z resztą aplikacji.
Oczywiście, jeśli później ktoś „przyjdzie” i dotknie tego kodu, teoretycznie mógłby skorzystać z tego testu jednostkowego. (Tylko teoretycznie, ponieważ ta przetestowana wyspa kodu żyłaby w oceanie nieprzetestowanego kodu).
Tak więc „tym razem” nie zdecydowałem się na dodanie ciężkiej pracy polegającej na dodaniu testu jednostkowego: zmiany w kodzie w celu przetestowania tych rzeczy byłyby znacznie bardziej skomplikowane niż zmiany w kodzie w celu prawidłowego (i czystego) wdrożenia funkcji.
Czy jest to coś typowego dla mocno sprzężonego starszego kodu? Czy jestem leniwy / czy jako zespół ustalamy niewłaściwe priorytety? Czy też jestem ostrożny, testując tylko te rzeczy, w których koszty ogólne nie są zbyt wysokie?