Mam odpowiednią anegdotę z czegoś, co się teraz dla mnie dzieje . Jestem przy projekcie, który nie korzysta z TDD. Nasi pracownicy QA kierują nas w tym kierunku, ale jesteśmy małym strojem i był to długi, przeciągły proces.
W każdym razie ostatnio korzystałem z biblioteki innej firmy do wykonania określonego zadania. Wystąpił problem związany z korzystaniem z tej biblioteki, więc zostałem zmuszony do napisania wersji tej samej biblioteki na własną rękę. W sumie było to około 5000 wierszy kodu wykonywalnego i około 2 miesięcy mojego czasu. Wiem, że linie kodu są kiepską miarą, ale dla tej odpowiedzi uważam, że jest to przyzwoity wskaźnik wielkości.
Potrzebna mi była jedna szczególna struktura danych, która pozwoliłaby mi śledzić dowolną liczbę bitów. Ponieważ projekt jest w Javie, wybrałem Javę BitSet
i trochę ją zmodyfikowałem (potrzebowałem także możliwości śledzenia wiodących 0
s, czego BitSet Java nie robi z jakiegoś powodu .....). Po osiągnięciu ~ 93% zasięgu zacząłem pisać testy, które w rzeczywistości podkreśliłyby napisany przeze mnie system. Musiałem przeprowadzić analizę porównawczą niektórych aspektów funkcjonalności, aby upewnić się, że będą one wystarczająco szybkie dla moich końcowych wymagań. Nic dziwnego, że jedna z funkcji zastąpionych przez BitSet
interfejs była absurdalnie powolna w przypadku dużych zestawów bitów (w tym przypadku setek milionów bitów). Inne zastąpione funkcje opierały się na tej jednej funkcji, więc była to ogromna szyjka butelki.
Skończyło się na tym, że poszedłem do deski kreślarskiej i wymyśliłem sposób manipulowania podstawową strukturą BitSet
, którą jest long[]
. Zaprojektowałem algorytm, poprosiłem kolegów o ich dane wejściowe, a potem zabrałem się za pisanie kodu. Następnie przeprowadziłem testy jednostkowe. Niektóre z nich się zepsuły, a te, które wskazały mi dokładnie, gdzie muszę sprawdzić algorytm, aby go naprawić. Po naprawieniu wszystkich błędów z testów jednostkowych mogłem powiedzieć, że funkcja działa tak, jak powinna. Przynajmniej mogłem być tak pewny, że ten nowy algorytm działał tak samo, jak poprzedni algorytm.
Oczywiście nie jest to kuloodporny. Jeśli w moim kodzie jest błąd, którego testy jednostkowe nie sprawdzają, nie będę tego wiedział. Ale oczywiście ten sam błąd mógł również występować w moim wolniejszym algorytmie. Jednakże , mogę powiedzieć z dużą dozą pewności, że nie trzeba się martwić o złym wyjściem z danej funkcji. Wcześniej istniejące testy jednostkowe pozwoliły mi zaoszczędzić godziny, a może nawet dni, na przetestowanie nowego algorytmu, aby upewnić się, że jest poprawny.
To jest sens przeprowadzania testów jednostkowych niezależnie od TDD - to znaczy, testy jednostkowe zrobią to dla ciebie zarówno w TDD, jak i poza TDD tak samo, kiedy zakończysz refaktoryzację / utrzymanie kodu. Oczywiście należy to połączyć z regularnymi testami regresji, testami dymu, testami rozmytymi itp., Ale testy jednostkowe , jak sama nazwa wskazuje, testują rzeczy na najmniejszym możliwym poziomie atomowym, co daje wskazówki, gdzie pojawiały się błędy.
W moim przypadku bez istniejących testów jednostkowych musiałbym w jakiś sposób wymyślić metodę zapewniającą działanie algorytmu przez cały czas. Co w końcu ... brzmi jak testowanie jednostkowe , prawda?