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.
![Baner promujący artykuł](/assets/images/posts/post-banner-test-first.png)
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
![TDD Lifecycle](/assets/images/posts/tdd/tdd-lifecycle.png)
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.