Despre TDD & Agile, pe îndelete

nimeni din comunitatea rails il iau in seama pe dhh. el este software writer, eu sunt software engineer, precum restul oamenilor. Nu’s ruby dev, php dev, java dev.
Din experienta, TDD este foarte util. Imagineaza-ti ca scrii un feature, apoi peste 4 luni, trebuie sa schimbi ceva in cod, care poate atinge sau nu, parti din applicatie. Cum verifici?.
dupa patru luni, codul se schimba, se solidifica, clar nu stii exact ce ar trebui sa faca. Asa apar bugurile.

La munca, avem un REST api, are 100% coverage. Sunt mandru de asta :smile:

O foarte buna carte: http://www.amazon.com/Test-Driven-Development-By-Example/dp/0321146530
scrisa de un tip mult mai smart ca mine.

Consider ca testele sunt importante, cred ca este foarte important ca dezvoltator sa-ti testezi codul:

  • unit testing
  • integration testing
3 Likes

Pai asta e the basic tenet of TDD, sa te gandesti inainte la cazuri de tot felul si sa scrii teste pt ele. I know that. Dar cum ziceam, nu poti acoperi tot (cel putin nu cand sunt chestii complexe). Daca nu stii ca 5/2 = 2 poti sa fii tu cel mai mare as in TDD :smile:

Si nu merge sa zici ca no, daca-s omisiuni pai lasa sa fie. Utilizatorului ii pasa doar sa-i mearga aplicatia – deci o data ce a fost gasit un bug, pai la naiba, trebuie reparat. La asta se reduce tot. Si sunt destui bugsi pe lumea asta cat sa nu fie mereu evident ochiometric ce se intampla, ca sa n-ai nevoie de debugger.

Dar nu inteleg de ce zici ca “nu vei avea niciodata un test care sa fail-uie pe codul gata scris”. Pai motivul 1, 2 si 3 pentru care eu sustin utilitatea testelor este faptul ca reduc posibilitatea de regression (unde regression = bug-uri introduse reparand altceva, adica fix teste care treceau acum nu mai trec). Sau n-am inteles eu bine ce-ai zis?

1 Like

Cred că cea mai grea parte din TDD are loc înainte de red green refactor și este dezbinarea scenariilor complexe din lumea reală în teste simple. Dar o dată ce ai reușit sa faci acest lucru, pe lângă faptul că nu vei avea chestii complexe în codul tău(SOLID), vei avea și 100% încredere în testele tale care îți oferă mult mai mult decât diminuarea regresiunilor.

1 Like

@Kay Ce vroiam sa zic ese ca daca faci TDD, incepi cu testul, evident. Deci orice cod de productie ai avea, el a fost scris sa faca testul sa treaca si nimic mai mult. Adica in momentul cand ai ajuns sa faci acea impartire, deja ai testat suficient incat sa nu ajungi in cazul tau. … Poate un algoritm putin mai complex ar putea exemplifica mai bine. Ma gandesc la ceva concret pentru un raspuns ulterior.

Iar daca descoperi un bug in productie / testare vizuala, dupa aia faci un test automat sa reproduca bug-ul, si numai dupa aceea scrii codul care sa il rezolve.

Recunosc, nu ar fi trebuit sa folosesc cuvantul “niciodata”. In schimb folosesc “exista sanse foarte mici”.

2 Likes

Un lucru care ma convinge pe mine in ceea ce priveste TDD-ul este faptul ca mi se pare ca se potriveste cu OOP-ul. OOP inseamna programare “by contract” , iar TDD-ul te ajuta sa scrii “contract”-ul inainte sa il implementezi.

@csmdev Faptul ca scrii teste (specs) inainte de a scrie codul de implementare nu are nicio legatura cu Waterfall sau metodologiile evolutionare (agile family, etc). E un simplu mod de a ataca implementarea. Unii fac schite pe hartie altii scriu teste

Out off topic: Waterfall a aparut in anii '80 si a murit mai mult din motivul ca bussiness-ul nu putea fi atat de “batut in cuie” precum presupunea metologia si nu din motive de proasta implementare a codului. Poate ai fi surprins ca prin anii 70 la IBM se lucra in “evolutionary phases” (care aveau cateva saptamani).

1 Like

Un keynote cinic la adresa unor practici clean code :


Începând de la minutul 24 are o secţiune dedicată TDD (se potriveşte cu cele discutate mai sus)

Încă nu am văzut filmul, dar dhh a luat parte la niște discuții despre cât de mort este TDD și este destul de pornit împotriva TDD: Is TDD Dead?

1 Like

Unde e buton-ul de dislike la aceasta afirmatie, TDD nu e mort si nu va fi, e best practice, daca nu scrii teste te intrebi de ce nu ai tratat toate flow-urile si codul tau e plin de bug-uri :slightly_smiling:, nu trebuie sa o iei ca ceva personal(ego less programming).

3 Likes

Don’t kill the messenger! :slightly_smiling:

2 Likes

Cred că - cel puţin aşa am înţeles eu - în post-urile de mai sus, nu era ceva anume împotriva testelor, şi poate nici chiar împotriva creării testelor înainte de codului aferent, ci împotriva unor practici TDD (posibil greşit înţelese sau duse la extrem), precum axarea pe teste prea low-level şi faptul că aceste teste devin (un) factor decisiv, care determină design-ul codului.

Nişte (contra)exemple, pe care le-am văzut real-life:

  • crearea de teste doar la nivel de metode, pentru a avea test coverage de 100% :sunglasses:
    (ceea ce nu garantează neapărat funcţionarea corectă a unei componente)
  • sacrificarea încapsulării (i.e. a design-ului), prin crearea de metode care primesc ca parametru un membru din aceeaşi clasă, pentru ca metoda să fie mai “potrivită pentru testare” (!=OOP)
  • crearea, în aceeaşi clasă, a unor miriade de funcţii cu maxim 5-6 linii de cod (again, design), tot în onoarea code coverage-ului de 100%
2 Likes

Principalul motiv pentru care am metode mici este ușurința cu care citesc ulterior codul (eu încerc să limitez la 10-15 linii de cod).

1 Like

Clar, motivaţia această este perfect pertinentă (ziceam doar de cazul în care testarea este motivul).
Oricum 10-15 linii e o valoare mai de bun simţ decâţ 5-6 :slightly_smiling:

1 Like