To je vsechno sice hezke, ale kde je tvoje pointa a jak to souvisi s TDD? Vsechno, co jsi rekl, jsem uz naznacoval vys v diskusi. Nejsem proti unit testum, jsem proti urcitemu zpusobu jejich pouzivani. A jasne jsem napsal, ze pokud toto je TDD, je to proste spatna metodologie.
Mym cilem nebyla pointa, jen diskuze s nekterymi tvymi nazory, s kterymi jsem nesouhlasil, a i kdyz tvrdis, ze vse co jsem rekl, jsi naznacoval jiz drive, nektere tve vyroky jsem puvodne vnimal jinak (:
TDD jsem nikdy nepouzival, a osobne si myslim, ze lepsi je pri programovani vyuzivat abstrakci a ruznych assertu nez testovat (protoze to jsou fakticky testy nad nekonecnou mnozinou pripadu) Stale si myslis ze asserty dokazou nahradit unit testy?
Ja si myslim, ze pokud muzete zvolit mezi assertem a testem, assert je ucinnejsi. Podle me jsi srovnaval nesrovnatelne
Tedy, jinak receno, jsou ty testy dostupne neomezene behem vyvoje, nebo se pouziji az po jeho skonceni? Pokud to prvni, hrozi riziko, ze napisete program ne tak, aby byl spravny, ale aby prosel testy. Testy jsou dostupne behem vyvoje, pokud jsou spravne napsane, takove riziko je dost male. Programator, ktery by se tak choval, by byl sam proti sobe.
Mimochodem, extremni pripady a vadne vstupy jsou prave ty situace, kde je IMHO vhodnejsi assert. Nerikam, ze by se to nemelo testovat, jen ze mi prijde napsat tam assert jako ucinnejsi metoda nez napsat na to test. Opet, kazde slouzi k necemu jinemu. Psat testy na extremni pripady mi prijde v poradku.
Ano, tohle narazi na limity assertu v mnoha jazycich (napriklad v Common Lispu by makro na takovy assert nebyl problem vytvorit). Proto rikam, ze nemaji takovou podporu v jazycich jako testy, a to je skoda! Protoze jsou obecnejsi.. Ale principialne v tom problem neni - neni problem mit assert, ktery otestuje soucasne vstup a vystup z funkce (vyjimka je jen specialni druh navratove hodnoty). Takovy assert je problem, pokud netestuje stav, ale vztah vstupu a vystupu, pak se jedna o defacto duplikaci implementace funkce.
Nemam nic proti unit testum, proti cemu namitam je:
- Jejich pouzivani tam, kde jsou asserty jasne lepsi (jako treba u tech null situaci). A nebo v situacich, kde by bylo lepe zvolit dalsi abstrakci. opet, asserty zde nejsou lepsi, plni jinou ulohu, nedaji se s testy srovnat. Mmchd, pokud pises test, zda funkce assertuje neplatna data, nemusis testovat i presny format debugovacich vypisu, v praxi ti staci, ze jde o AssertionError, a na to uz unit test smysl napsat ma.
No, a ja si proste myslim, ze nejdriv bychom se meli pokusit o tu korektnost (tedy pouzivat asserty a abstrakce) a pak az teprve o tu "kvalitu" (ve skutecnosti to prvni v mnohem postihuje to druhe). TDD dava prednost tomu druhemu na ukor spravnosti, a i kdyz mam jiste uvahy v tomto smeru, nepovazuji tento pristup obecne za spravny. Asserty ti nijak nezajistuji korektnost, pokud tedy nepovazujes za korektni chovani to, ze kdyz se ti program dostane do nepovoleneho stavu, tak spadne. Ano, asi je to korektnejsi nez kdyby generoval nesmysly, ale ja si pod korektnim programem predstavim takovy, ktery se do nepovoleneho stavu nedostane.
Nekdo tu psal, ze TDD dovoluje, aby testy slouzily jako specifikace. To mi prijde spatne. Ne nutne, je videt ze nemas s unit testy zkusenost. Vyvoj programu pokryteho testy typicky vypada tak, ze hledam nejakou funkci, ktera by se mi mohla hodit, kdyz ji najdu, samozrejme me zajima jak presne se chova a jak ji pouzit. Najdu si jeji testy, a podle prikladu pouziti vetsinou velice dobre zjistim, jak reaguje na ocekavane a neocekavane vstupy. Nikdy se nestane, jako se to v praxi u textove dokumentaci casto stava, a velice obtizne tomu jde zabranit, ze by test neodpovidal realite. Jako specifikace tak mohou slouzit v praxi velice dobre, byt treba ta funkce nema rigorozne popsanou semantiku - zase si muzu byt jisty, ze ten popis neni obsolete, coz je castokrat horsi nez kdyby nebyl zadny.
A jak souvisi Unit testy s Test Driven Development? Mozna te zklamu, ale na to se mi nechce odpovidat :-) Jen jsem chvilku tahal pilku za unit testy (nj, rootovska captcha)