Viteza de execuție a testului unității (câte teste pe secundă?)

Ce fel de rată de execuție urmărești cu testele unității (# test pe secundă)? Cât timp este prea lung pentru un test individual al unității?

Mi-ar fi interesat să știu dacă oamenii au niște praguri specifice pentru a determina dacă testele lor sunt prea lent sau este doar atunci când fricțiunea unei suite de testare de lungă durată devine cea mai bună dintre dvs.?

În cele din urmă, când decideți că testele trebuie să funcționeze mai repede, ce tehnici folosiți pentru a accelera testele dvs.?

Notă: testele de integrare sunt, evident, o problemă diferită. Suntem în mod strict vorbind teste unitate care trebuie să fie executate cât mai frecvent posibil.


Response roundup: Thanks for the great responses so far. Most advice seems to be don't worry about the speed -- concentrate on quality and just selectively run them if they are too slow. Answers with specific numbers have included aiming for <10ms up to 0.5 and 1 second per test, or just keeping the entire suite of commonly run tests under 10 seconds.

Nu sunteți sigur dacă este corect să marcați unul ca un "răspuns acceptat" atunci când toate sunt utile :)

0
fr hi bn
1 secundă pe test înseamnă că suita dvs. de testare va ajunge rapid în punctul în care vă opriți să o executați tot timpul, deoarece se simte prea lent. Când puteți executa 100 de teste/sec, veți rula suita mult mai frecvent decât atunci când durează de 100 de ori mai mult.
adăugat autor Jeffrey Fredrick, sursa

11 răspunsuri

Tind să mă concentrez mai mult pe lizibilitatea testelor decât viteza. Cu toate acestea, încerc să le fac în mod rezonabil rapid. Cred că dacă se execută în ordine de milisecunde, ești bine. Dacă rulează un al doilea sau mai mult pe test ... atunci este posibil să faceți ceva care ar trebui optimizat.

Testele lente devin o problemă, deoarece sistemul se maturizează și provoacă construirii ore întregi, moment în care este mai probabil să vă aflați într-o problemă cu multe teste lente, decât unul sau două teste pe care le puteți optimiza cu ușurință. (probabil mai repede, cate secunde fiecare), decat sa asteptati pana cand se ajunge la sute de teste care iau acel punct lung (in momentul in care merge pentru a fi foarte greu pentru a rezolva problema).

Chiar și așa, va reduce doar timpul dintre momentul în care construirea dvs. automată emit erori ... ceea ce este bine dacă este o oră mai târziu (sau chiar câteva ore mai târziu), cred. Problema este să le executați înainte de a intra în cont, dar acest lucru poate fi evitat prin selectarea unui mic subset de teste pentru a rula care sunt legate de ceea ce lucrați. Doar asigurați-vă că ați repara construirea dacă verificați codul care întrerupe testele pe care nu le-ați executat!

0
adăugat

Punct de date - teste de regresie Python

Iată numerele de pe laptop-ul meu care rulează "face test" pentru Python 2.5.2:

  • număr de teste: 3851 (aproximativ)
  • timpul de execuție: 9 min, 6 sec
  • Rata de execuție: 7 teste/sec
0
adăugat

A fost un bun articol despre acest lucru din Power Of Two games, autorii UnitTest ++ .

0
adăugat

Dacă vorbim de teste unitare strict, aș încerca mai mult pentru completitudine decât pentru viteză. Dacă timpul de rulare începe să provoace frecare, separați testul de diferite proiecte/clase etc. și executați doar testele legate de ceea ce lucrați. Lăsați serverul de integrare să ruleze toate testele la checkin.

0
adăugat

În prezent, avem 270 de teste în aproximativ 3 secunde. Există probabil aproximativ 8 teste care efectuează fișierul IO.

Acestea se execută automat după construirea cu succes a bibliotecilor noastre pe fiecare mașină de ingineri. Avem teste de fum mai extinse (si consumatoare de timp), care se fac in fiecare seara de constructorul sau se pot porni manual pe o masina de ingineri.

După cum puteți vedea, nu am ajuns încă la problema testelor fiind prea consumatoare de timp. 10 secunde pentru mine este punctul în care începe să devină intruziv, când începem să ne apropiem că va fi ceva la care ne vom uita. Probabil că vom muta bibliotecile de nivel inferior, care sunt mai robuste, deoarece se schimbă rar și au puține dependențe, în construcțiile de noapte sau într-o configurație în care sunt executate numai de mașina de construcție.

Dacă descoperiți că durează mai mult de câteva secunde pentru a rula o sută de teste, ar putea fi necesar să examinați ceea ce clasificați ca un test de unitate și dacă ar fi mai bine tratat ca un test de fum.

kilometrajul dvs. va fi în mod evident foarte variabil în funcție de zona dvs. de dezvoltare.

0
adăugat

Judecă testele pe un test pe un test, nu prin numărul de teste pe secundă. Rata pe care intenționez este de 500ms sau mai puțin. Dacă este mai presus de asta, voi examina testul pentru a afla de ce durează atât de mult.

Când cred că un test este de a încetini, înseamnă de obicei că face prea mult. Prin urmare, doar refactorizarea testului prin împărțirea acestuia în mai multe teste face de obicei trucul. Alteori, când am observat că testele mele rulează lent, este momentul în care testul arată o piedică în codul meu, apoi este în ordine refactorizarea codului.

0
adăugat

Unele cadre oferă execuția automată a testelor unitare specifice bazate pe euristică, cum ar fi timpul ultimul modificat. Pentru ruby și Rails, AutoTest oferă o execuție mai rapidă și mai receptivă a testelor - când salvez un model Rails app/models/foo.rb , testele unității corespunzătoare în test/unit/foo_test.rb se execută.

Nu știu dacă există ceva similar pentru alte platforme, dar ar avea sens.

0
adăugat

Cât timp este prea lung pentru un individ   test unitate?

Aș spune că depinde de viteza de compilare. Se execută, de obicei, testele la fiecare compilare. Obiectivul de a testa unitatea nu este să încetinească, ci să aducă un mesaj " nimic rupt, continuați " (sau " ceva rupt, STOP ").

Nu mă deranjez cu privire la viteza de execuție a încercărilor până când acest lucru nu începe să devină enervant.

Pericolul este să nu mai executați testele deoarece sunt prea lente.

În cele din urmă, când decideți testele   trebuie să meargă mai repede, ce tehnici fac   folosiți pentru a vă accelera testele?

Primul lucru pe care trebuie să-l faci este să reușești să afli de ce sunt prea lent și problema este în testele de unitate sau în codul testat?

Aș încerca să rup suita de testare în mai multe părți logice, executând numai partea care este presupusă afectată de codul pe care l-am schimbat la fiecare compilare. Aș rula celelalte apartamente mai rar, poate o dată pe zi, sau când aveam îndoieli că aș fi putut sparge ceva și cel puțin înainte de integrarea .

0
adăugat

Scopul este de 100 de teste pe secundă. Modul în care ajungeți acolo este urmând regulile de testare a unităților ale lui Michael Feather .

Un aspect important care a apărut într-o discuție anterioară despre CITCON este că dacă testele dvs. nu sunt atât de rapide, este destul de probabil că nu beneficiați de avantajele de proiectare ale testării unităților.

0
adăugat

Toate testele de unitate ar trebui să se desfășoare sub o secundă (adică toate testele combinate trebuie să funcționeze în 1 secundă). Acum sunt sigur că acest lucru are limite practice, dar am avut un proiect cu 1000 de teste care rulează rapid pe un laptop. Veți dori cu adevărat această viteză, astfel încât dezvoltatorii dvs. nu se tem să refactorizeze o parte esențială a modelului (adică, Lemme du-te să bem niște cafea în timp ce alerg aceste teste ... 10 minute mai târziu se întoarce).

Această cerință vă obligă să vă proiectați corect aplicația. Înseamnă că modelul dvs. de domeniu este pur și conține referințe zero la orice tip de persistență (File I/O, Database etc.). Testele pe unități se referă la testarea acestor relații de afaceri.

Acum, asta nu înseamnă că ignorați testarea bazei de date sau persistența. Dar aceste probleme sunt acum izolate în spatele depozitelor care pot fi testate separat cu teste de integrare care se află într-un proiect separat. Dvs. executați testele unității în mod constant atunci când scrieți codul de domeniu și apoi executați testele dvs. de integrare o dată la check-in.

0
adăugat
Ce limbă, compilator și motor de test folosiți? 1000 de teste pe secundă sunt nebuni - am un timp dificil de a obține mai bine decât 4 teste/secundă în C #/Visual Studio 2010.
adăugat autor Nilzor, sursa
Bănuiesc (nu am căutat dovezi) că alergătorii de test popular din VS nu depun prea multe eforturi în optimizarea vitezei lor. 4 teste pe secundă sunt foarte lente. Dacă aveți de gând să aveți o mulțime mare de teste, doriți să reușiți să treceți prin sute pe secundă. Lansarea tuturor într-o secundă nu este o cerință scalabilă pentru proiectele mari de dezvoltare.
adăugat autor Niall Connaughton, sursa

Una dintre cele mai importante reguli despre testele de unitate este că ar trebui să ruleze rapid .

Cât timp este prea lung pentru un test individual de unitate?

Dezvoltatorii ar trebui să poată rula întreaga serie de teste de unități în câteva secunde și cu siguranță nu în minute și minute. Dezvoltatorii ar trebui să poată să le execute rapid după schimbarea codului. Dacă durează prea mult, ei nu vor deranja să le execute și veți pierde unul dintre principalele beneficii ale testelor.

Ce fel de rată de execuție urmărești cu testele unității (# test pe secundă)?

Ar trebui să încercați ca fiecare test să ruleze într-o ordine de milisecunde, orice timp de peste 1 secundă este probabil prea testarea.

În prezent avem aproximativ 800 de teste care se desfășoară în mai puțin de 30 de secunde, aproximativ 27 de teste pe secundă. Aceasta include timpul pentru lansarea emulatorului mobil necesar pentru a le rula. Cele mai multe dintre ele au fiecare 0-5ms (dacă îmi amintesc corect).

Avem unul sau doi care durează aproximativ 3 secunde, care sunt probabil candidați pentru verificare, dar lucrul important este că întreaga suită de testare nu durează atâta timp, încît îi împiedică pe dezvoltatori să o execute și nu încetinește semnificativ continuitatea integrarea construiască.

Avem, de asemenea, o limită de timp de configurabil setată la 5 secunde - orice durează mai mult va eșua.

0
adăugat