Dziś miałem przyjemność zapoznać się z artykułem na blogu The Clean Code Blog, pt. Test First, autorstwa Uncle Boba. Wpis ten objaśnia, czym jest Test First… i robi to na tyle dobrze, że i ja zrozumiałem.
Test-Driven Development (TDD)
Jak dobrze wiecie, TDD to styl wytwarzania oprogramowania, który skupia się na trzech regułach:
- zanim napiszesz kod produkcyjny, napisz test sprawdzający jego działanie,
- napisz jak najprostszy kod produkcyjny, który powoduje, że test przechodzi,
- dokonaj refaktoryzacji kodu produkcyjnego oraz testu.
Red, Green, Refactor
Te reguły tworzą 3 fazy cyklu życia:
- Red — piszesz test, który failuje
- Green — piszesz kod produkcyjny, który rozwiązuje test
- Refactor (Blue) — ulepszasz obie warstwy
Asymetria
Jasne jest więc, że jakość kodu produkcyjnego zależy od testów, ale czy jakość testów zależy od kodu produkcyjnego? Nie.
Dlatego też mityczne Test First polega na tym, aby:
- dbać o kod produkcyjny ZACZYNAJĄC od dbania o testy,
- utrzymywać kod produkcyjny ZACZYNAJĄC lepszego zarządzania testami,
- myśleć o kodzie produkcyjnym ZACZYNAJĄC od testów.
Oczywiście, w stylu TDD powinniśmy:
- ZACZYNAĆ od napisania testów,
- oraz ustawić testom NAJWYŻSZY priorytet w wytwarzaniu oprogramowania.
Podsumowanie
O to właśnie chodzi w Test First.
Nie możemy napisać testów i o nich zapomnieć. Kod w testach należy traktować tak samo poważnie (a nawet bardziej poważnie) jak kod produkcyjny. Dlaczego? Uncle Bob podaje świetny przykład.
Jeśli stracimy kod produkcyjny, ale mamy testy, to możemy odtworzyć z niego kod produkcyjny, ale kiedy nie mamy testów, ale mamy kod produkcyjny, to ciężko jest do takiego kodu napisać testy, z uwagi na to, że istnieje w nim duża liczba zależności.
Kod, który nie posada testów określa się mianem legacy. A taki kod rozwija się wolno i z brakiem przekonania, że zmiana nie wygeneruje regresji.
Podoba mi się to wyjaśnienie. Powtórzę jeszcze raz:
Legacy Code, to kod, który nie posiada testów.