Test-Driven Development - Pagina 2 - Forumul German Python
Din 2002 discuții despre limbajul de programare Python

Dezvoltare bazată pe test
Da, poate că testele ar trebui scrise la extinderea unui program. Acesta pare a fi un mod sensibil de a delimita dacă merită testarea.
Unde vedeți avantajele testului py sau ale nasului față de unittest?
Știe cineva cartea Test Driven Development de Kent Beck?
Bună, este o întrebare legitimă bună.
Îl văd ca BlackJack și Eydu.
Acoperirea legată de testele unitare ar trebui să fie în primul rând cea deranjantă pentru dvs. ca programator Pierdeți greutatea muncii pentru a identifica dacă ați acoperit toate cazurile de care aveți nevoie (pe care le considerați importante). Cu aplicații foarte mari, uitați adesea să scrieți teste unitare pentru domenii importante ale software-ului dvs. deoarece devine extins, complex și confuz [1].
Acoperirea se presupune că vă scutește de munca de identificare a zonelor care nu au fost încă acoperite de testele unitare [2]. Apoi, puteți utiliza raportul generat pentru a decide ce lucruri în opinia dvs. trebuie acoperite și care sunt neglijabile pentru dvs. Lucruri neglijabile ar putea de exemplu Funcțiile banale reale sunt care nu sunt schimbate înainte și „întotdeauna” funcționează. - Dar după cum a indicat corect BlackJack, diavolul se află în detalii. Adesea sunt exact acele lucruri în care credeți că „nu trebuie să vă încadrați” și greșelile se ascund acolo. Prin urmare, încerc de obicei (în funcție de complexitatea software-ului) să obțin o acoperire de 100%.
[1]: Și de cele mai multe ori, testele unitare nu sunt scrise paralel cu software-ul propriu-zis, ci mult mai târziu = săptămâni sau chiar luni după aceea. Se folosește dezvoltarea bazată pe test, unde mai întâi sunt scrise testele unitare și apoi sunt implementate lucrurile respective.
[2]: Astfel de zone nu sunt doar în interiorul unei funcții, ci reprezintă întregul spațiu al modulului: Cu alte cuvinte, funcțiile pentru care nu există deloc test de unitate vă sunt afișate de acoperire. Deci, de ex. Dacă am modulul "foobar", deoarece există "foo" și "bar" și am scris doar un test de unitate pentru "foo", acoperirea ulterioară îmi arată "bara" `nu a fost executat (= testat) de modulul de testare a unității.
Întrebarea din exemplul dvs. „acces la baze de date și socket” este ce face mai exact software-ul dvs.? Dacă software-ul dvs. folosește doar componentele (care nu sunt scrise de dvs.), atunci nici nu trebuie să le testați! Nu este treaba dvs. să acoperiți bibliotecile terțe cu testele unitare. Pentru aceasta cere să scrie lui Mocks.
Să presupunem că aveți o funcție sau o clasă care accesează socketurile prin `socket` și, în funcție de rezultate, execută anumite acțiuni sau modifică stările. Acum apare problema că atunci când îl utilizați pentru a accesa un SERVER extern care trebuie întotdeauna să returneze anumite date. În acest caz, abstractizați „socket” și datele așteptate de la $ SERVER în măsura în care funcția dvs. funcționează la fel ca și când ați utiliza de fapt „socket” cu $ SERVER.
Mai exact, asta înseamnă că aveți necesar Rescrierea interfețelor „socket” care stop stat se conectează cu $ SERVER, returnează doar datele pe care le așteptați de la $ SERVER real. Întregul lucru urmează să vi se promită o batjocură - un manechin - pe care o atribuiți funcției voastre. Desigur, trebuie să recreați acest manechin, astfel încât codurile de eroare/excepția pe care o așteptați să fie aruncate ca și în cazul originalului.
Și acolo începe să se complice. Subiectul nu este chiar banal și puteți ajunge rapid la limitele a ceea ce este fezabil (= proporționalitate). Nu degeaba scrierea unui mediu de testare poate deveni rapid mai extinsă și mai complexă decât mediul de testat. Aici trebuie să cântăriți între beneficiu și proporționalitate, de la caz la caz.
De asemenea, ar trebui să luați în considerare dacă software-ul este utilizat într-un mediu relevant pentru securitate. Acolo, OMI, zonele relevante pentru securitate nu ar trebui să fie testate deloc cu simulări, dar ar trebui să fie creat un mediu de testare existent, special conceput pentru aceasta.
Ceea ce este încă interesant în contextul testelor unitare care acoperă 100% totul este faptul că testele unitare reprezintă, de asemenea, o specificație, ca să spunem așa. Specificați (abstract) întreaga interfață până la cel mai mic detaliu; chiar dacă este lizibil doar pentru programator.
În acest context, ar fi interesant dacă ar exista programe care ar genera, de asemenea, o specificație într-o formă lizibilă din acesta. și creați un program care creează o specificație din acesta
Sună amuzant, dar este menit serios. În depozitul Ruby există considerații (izolate) în această direcție. Există, de asemenea, un pachet de testare unitară care nu vorbește despre scrierea testelor unitare, ci despre scrierea specificațiilor - Ok, niciun porc nu poate citi în afară de cei care au scris „specificațiile” sau de tocilarii Ruby