Tu cum îți testezi codul?

În ultimele zile am devenit din ce în ce mai interesant de unit testing (UT) și de test driven development (TDD). În principiu, pentru că mă încântă ideea de a scrie cod fără să trebuiască să dau ctrl+r în browser după care cinci click-uri, după care mai știu eu ce minune ce trebuie să-mi intre în reflex. Am început să sap după resurse de TDD în JavaScript, am început să înțeleg cum se face (momentan parțial), am înțeles beneficiile șamd. Încă învăț, dar în momentul în care înțeleg totul cum trebuie, voi scrie un articol pe blog :)

Am vorbit cu mai mulți programatori care nu au făcut niciodată UT iar majoritatea nu au făcut pentru că au auzit ei (sau au dedus) că UT presupune a scrie și mai mult cod. Unul mi-a zis că nu face UT pentru că a auzit că se face doar la proiectele mari și că oricum nu știe nici un alt programator care face. Yup, motive bune :)

La întrebarea „Faci unit testing la cod? Dacă da, de ce? Dacă nu, de ce?” pusă pe twitter am primit un singur răspuns:

da, bullet proof, write once and forget about headaches.

Așadar, sunt foarte curios: faci UT? De ce da, de ce nu? În ce limbaj programezi?

8 Comentarii to “Tu cum îți testezi codul?”

  1. DA.

    Acum ceva vreme mi se parea unspeakably boring scrisul de teste, si evitam cat se poate sa am de-a face cu ele. Pana am avut de dezvoltat ceva chestie cu 17000 de cazuri particulare (daca utilizatorul alege X apoi Y apoi Z se intampla ceva, daca alege X, Z, Y se intampla altceva, si tot asa, times 100). Fara TDD, de fiecare data cand faceam o modificare trebuia sa-mi sap prin memorie sa-mi amintesc care naiba erau toate cazurile particulare, si sa le incerc pe toate ca sa ma asigur ca n-am stricat nimic.

    Pana la un moment dat m-am enervat si-am scris cate un test pt fiecare caz :) Si my life became so much easier ca I haven’t given up TDD since :) Cum vad eu problema: un test scris corect e suficient de granular cat sa nu ia mult timp sa-l scrii, deci una peste alta in majoritatea cazurilor sa testezi ceva de mana dureaza cam la fel cat scrisul unui test automat. Numai ca in datile urmatoare testatul de mana o sa-ti ia aceeasi cantitate de timp, pe cand pt ala automat ajunge sa press a button ;)

    Asa ca brusc nu mi se mai pare atat de boring scrisul de teste, din contra, mi se pare o investitie in calitatea codului pt viitor. But then I don’t develop for the web so YMMV.

  2. Marius Costache

    Nu.

    As vrea sa fac, dar: 1. Firma la care lucrez nu serveste si 2. Am senzatia ca trebuie sa scriu mult mai mult cod.
    Ar mai fi varianta sa fac UT intr-un proiect in afara jobului insa sunt destul de avansat si imi este foarte lene sa il integrez acum :)

    Am avut o tentativa cu Selenium IDE dar am renuntat dupa 1 zi.

    Tu folosesti vreo librarie in particular(Jasmine, etc)?

    Numai bine

  3. Staicu Ionuț-Bogdan

    @Marius: încă nu am înțeles anumite chestii în UT la nivel conceptual, deci nu folosesc nimic. Dar oscilez între Qunit și Jasmine destul de mult (de exemplu, ieri eram convins că Jasmine e minunat, azi… nu prea; probabil mâine mă răzgândesc)

  4. Pana recent nu m-am gandit serios la TDD, dar la noul job i-am inteles rostul. Aproape tot backendul aplicației este testat cu phpunit. Următorul meu task va fi sa setez un continuous integration testing pentru partea de front-end, in care sa testam efectiv rezultatul prezentat unui user, nu doar unit testing. Ma gandesc sa folosesc qUnit & TestSwarm pentru asta.

  5. NU. La momentul când a trebuit să iau decizia cum îmi testez codul, m-am speriat că am să rămân în urmă, că o să scriu o grămadă de cod și că e inutil…deh, eram naiv. Pe parcurs am ajuns să-mi scriu propriile unelte pt live debuging și testat parțial funcționalitatea unor bucățele de cod. Adică, nu numai că am ales prost să nu fac UT la timp, dar am ales și mai prost când m-am complicat încercând să reinventez roata care nu o vedeam de spițe… De atunci a trecut ceva timp și nu o dată a fost când mi-am promis că la următorul proiect am să încep să scriu câteva teste simple, să mă obișnuiesc. Încă aștept să mă organizez cumva :)

  6. Dap. Unit testing la greu. Ai impresia că scrii mai mult cod, dar nu e așa. Și la servici și în proiectele personale aleg diverse metode de a testa codul, în funcție de necesități.

    Ai grijă să nu confunzi unit testing cu test driven development.
    TDD folosești doar dacă proiectul tău este sub presiuni foarte mari din partea clienților, și are schimbate continuu requirementurile. Altfel, te cam complici.
    Nu încerca să folosești o paradigma doar de dragul de a o folosi, gândește-te bine înainte, altfel o să te îngropi în idei și nu mai iese nimic.

    La fel și cu frameworul de test. Simți nevoia lui? Partea bună este că îți oferă codul gata făcut. Partea aiurea este că încapsulează multă logică și îți e mai greu să înțelegi ce se întâmplă acolo. Îți propun să scrii tu singur, cu mânuța ta, tot ce ai nevoie pentru a testa, pe măsura ce o să îți dai seama că ai nevoie de mai mult o să știi și de ce framework ai nevoie (sau poate nu vei avea și vei face propriul cod pentru testing).

    Mult succes!

  7. Staicu Ionuț-Bogdan

    Ai grijă să nu confunzi unit testing cu test driven development.

    Sebastian, mulțumesc pentru comentariu. În urmă cu două săptămâni, când am început să mă documentez, eram convins că tdd === unit testing. În urmă cu o săptămână am început să bănuiesc că e posibil sa nu fie așa :D

    Din păcate (fericire?) am găsit doar resurse în cele două sunt strâns legate între ele.

  8. Yup, eu sunt un mare fan de UT :D Dar sincer nu prea il folosesc pentru web dev, proiectele erau mult prea mici. Dar la orice proiect C# sau Java, unit testing e absolut necesar. N-am intalnit nici un client/manager care sa nu vrea sa-ti vada codul impreuna cu teste. Ce sa zic, echipa de test e la fel de mare ca echipa de dev de obicei!
    N-am implementat inca TDD pana acum. Probabil din lipsa de experienta.

Show trackbacks

Ți-a plăcut articolul? Lasă un comentariu!

You can insert code snippets using BBcode:
[js].[/js] [html].[/html] [php].[/php] [css].[/css]
You can also use some HTML tags:
<blockquote>.</blockquote> <code>.</code> <a href="">.</a> <strong>.</strong> <em>.</em>