Testy jednostkowe nie tylko ułatwiają projektowanie, ale jest to jedna z ich głównych zalet.
Napisanie pierwszego testu eliminuje modułowość i czystą strukturę kodu.
Kiedy piszesz swój kod w pierwszej kolejności, przekonasz się, że wszelkie „warunki” danej jednostki kodu są naturalnie wypychane do zależności (zwykle poprzez makiety lub kody pośredniczące), kiedy przyjmujesz je w swoim kodzie.
„Biorąc pod uwagę warunek x, spodziewaj się zachowania y”, często staje się odgałęzieniem do dostarczenia x
(co jest scenariuszem, w którym test musi zweryfikować zachowanie bieżącego komponentu) i y
staje się próbą, której wywołanie zostanie zweryfikowane na koniec testu (chyba że jest to „powinien zwrócić y
”), w którym to przypadku test po prostu wyraźnie zweryfikuje zwracaną wartość).
Następnie, gdy jednostka zachowuje się tak, jak określono, przechodzisz do pisania odkrytych zależności (dla x
i y
).
To sprawia, że pisanie czystego, modułowego kodu jest bardzo łatwym i naturalnym procesem, w przeciwnym razie często łatwo jest rozmazać obowiązki i powiązać zachowania bez uświadomienia sobie tego.
Pisząc testy później dowiesz się, kiedy twój kod ma słabą strukturę.
Kiedy pisanie testów dla fragmentu kodu staje się trudne, ponieważ jest zbyt wiele rzeczy do skartowania lub wyszydzenia, lub ponieważ rzeczy są zbyt ściśle ze sobą powiązane, wiesz, że masz ulepszenia w kodzie.
Kiedy „zmiana testów” staje się ciężarem, ponieważ w jednej jednostce jest tak wiele zachowań, wiesz, że masz ulepszenia w kodzie (lub po prostu w podejściu do pisania testów - ale z mojego doświadczenia nie jest tak zwykle) .
Gdy staje się zbyt skomplikowane scenariusze ( „jeśli x
a y
, a z
potem ...”), ponieważ trzeba bardziej abstrakcyjnego, wiesz, że masz ulepszenia wprowadzone w kodzie.
Kiedy skończysz z tymi samymi testami w dwóch różnych urządzeniach ze względu na powielanie i redundancję, wiesz, że masz ulepszenia w kodzie.
Oto doskonała rozmowa Michaela Feathersa, pokazująca bardzo ścisły związek między testowalnością i projektowaniem w kodzie (pierwotnie opublikowana przez displayName w komentarzach). Rozmowa dotyczy również niektórych powszechnych skarg i nieporozumień na temat dobrego projektu i ogólnie testowalności.