Temat: Czy przy pomocy TDD tworzony kod jest lepszy- eksperyent
A próbowałeś tak robić z "odziedziczonym" kodem napisanym przez "ruskich hakerów"?
Hm.. nie :) Uważam, że taki kod jest "nietestowalny". Tzn można napisać dla niego testy które dzielnie sprawdzają 'różne' rzeczy ale IMHO jest to czynność:
1. jeśli w dokumentacji są opisane testy -
mało efektywna tzn wiemy, że aplikacja 'przechodzi' testy logiki biznesowej ale nie wiemy czy program ma poprawnie napisana logikę 'niebiznesową'.
2. jeśli w dokumentacji nie ma opisanych testów -
nonsensowną.
W takich przypadkach można jedynie testować funkcjonalność 'niebiznesową'. W kontekście tego, że nie wiemy co ma ona de facto robić (nie mamy dokumentacji testów), pisanie i przeprowadzanie takich testów jest absurdalne.
Wiem, że są programiści którym powyższe nie przeszkadza i na zasadzie 'ktoś, kiedyś w jakiejś książce napisał albo ja to tak przynajmniej zrozumiałem'
wymyślają dziesiątki testów które właściwie nie wiadomo co testują.
Takie 'wymyślanie' testów w najlepszym przypadku jest stratą czasu -
'poprawianie jakości kodu poprzez implementację testów' - zupełnym nieporozumieniem.
Naprawdę bez złośliwości polecam pozycję :
http://www.amazon.com/Test-Driven-Development-Kent-Bec....
Jak będziesz sobie implementował przykład po przykładzie powinieneś zauważać jakie zyski daje ci podejście TDD.
Hm.. uważam, że testy są nieodłączną częścią projektu tzn są tak samo ważne jak kod który testują.
Załóżmy, że masz przed sobą klasę "UserManager" z metodą "addUser". W specyfikacji masz napisane, że metoda sprawdza poprawność danych użytkownika łącząc się z zewnętrznym serwisem sprawdzającym pesel, łączy się z baza i tam zapisuje dane użytkownika, na dysk zapisuje jego zdjęcie, a na koniec wysyła email do administratora portalu.
Napisz zestaw testów jednostkowych.
To nie jest specyfikacja testów. To nawet nie jest specyfikacja funkcjonalności bo nie ma słowa o tym, co ma się dziać kiedy np. któryś z kroków nie może został wykonany. Czy autor chciał opisać domenę czy to jak została ona zamodelowana w systemie ?
A co powiesz o takim opisie testów:
1.
Parametry przekazywane do metody:
imie - jan
nazwisko - kowalski
PESEL - 9999999
Zdjecie - img.jpg (0.1mb)
Oczekiwany wynik:
metoda rzuca wyjatek "InvalidPESELException"
2.
Parametry przekazywane do metody:
imie - jan
nazwisko - kowalski
PESEL - 82011877453
Zdjecie - img.jpg (0.1mb)
Oczekiwany wynik:
true
3.
Parametry przekazywane do metody (mock bazy danych):
imie - Jan
nazwisko - Kowalski
PESEL - 82011877453
Zdjecie - img.jpg (0.1mb)
Oczekiwany wynik:
metoda rzuca wyjatek "PersistanceContextCreationException" ?
Niczego nie trzeba wymyślać. I ma się tą pewność że autor dokumentacji dobrze wie co robi.