Poate cineva să împărtășească întrebări de interviu bazate pe TDD?

Cel mai bun răspuns

În prezent, lucrez pentru AutoTrader, care face acest lucru foarte bine, în opinia mea.

Vă așezăm în fața unui laptop, cu un monitor și o tastatură / mouse mai mari, împerecheați cu unul dintre dezvoltatorii noștri superiori și observați de un alt dezvoltator senior.

Este destul de distractiv pentru tuturor, cu excepția nervilor obișnuiți ai interviului și a faptului că întâlnești oameni noi. Dar, cu siguranță, când sunt perechea ta, încerc să am un raport prietenos, să te fac să te simți binevenit și așa mai departe. Așa cum aș face în mod normal. De fapt, îmi fac rădăcini pentru a reuși. ​​

Veți obține o descriere a problemei de o jumătate de pagină a unei sarcini simple. Și apoi faci un pic de programare pereche.

Există mai multe lucruri observate și punctate:

  • Scrii mai întâi teste? După cod? Niciodată?
  • Folosiți teste pentru a vă gândi la design?
  • Numiți lucrurile clar?
  • Favorizați OOP, programarea procedurală – sau doar unul funcție enormă?
  • Interacționați bine cu perechea? Sau chiar deloc?
  • Vă explicați gândirea în timp ce mergeți și invitați perechea să contribuie? Sau stați în tăcere?
  • Folosiți facilități standard în Java, cum ar fi Colecțiile? Dacă nu, ce faci?
  • Folosești bine IDE (care este la alegerea ta)?
  • Împărțiți bine problema? Slab? Nu este deloc?

Dacă puteți face Java, TDD și / sau design pentru a fi testate pe unități și vi se pare un tip rezonabil de agreabil, aveți tendința de a obține un scor înalt.

Acest test nu se referă la cunoașterea ciudată a caracteristicilor lingvistice sau la cunoașterea ciudată a algoritmului sau chiar la rezolvarea problemei.

Totul este să vezi cum folosești aceste lucruri pe care le-ai scris în CV-ul tău în viața reală.

Vă va plăcea cu adevărat. Oferă tuturor o imagine corectă a locului în care se află un candidat.

Îndepărtează nemilos reclamațiile CV false.

Spuneți că faceți TDD? Nu știți ce înseamnă „afirmați”? Aoleu. Spuneți că ați stăpânit OOP? Tot codul, care nu funcționează, se află în aceeași metodă ca și testul unitar pe care l-am furnizat? Oh, dragă.

(Și da, asta s-a întâmplat cu adevărat).

Pentru mine, a fost un deschizător de ochi aflat pe ambele părți ale acestui proces.

Răspuns

TDD este un instrument. Ce nu este? tratează TDD ca o religie.

TDD se face de obicei cu teste unitare: teste de părți mici sau funcții („unități”) ) din codul dvs. Testele unitare ar trebui să ruleze rapid , astfel încât, în general, să faceți machete cu orice dependență de serviciu extern și să vă asigurați că codul în sine este testat.

Problema uriaș-elefant-în-cameră este că uneori acele servicii externe pe care le-ai batjocorit conțin majoritatea logicii unei funcții. Dacă „unitatea” dvs. preia un articol dintr-o bază de date folosind o interogare și îl returnează, batjocorind acea interacțiune este 100\% inutilă cu excepția faptului că înlocuiește verificarea de tip.

Permiteți-mi să spun asta din nou într-un mod diferit: Așa-numiții „lideri de gândire” ”Care predică Evanghelia TDD, de asemenea, predică frecvent Evanghelia limbilor dinamice. Deci, limbile pe care ți le spun sunt mult mai productive necesită de fapt mult mai multă muncă pentru a testa și adesea pentru a rescrie aceste teste atunci când trebuie să refactorizați.

Scrieți codul într-un limbaj mai sigur, cum ar fi C #, Java sau TypeScript, și nu Nu trebuie să vă faceți griji cu privire la verificarea tipurilor care sunt încă valabile. Și există tone de beneficii reale de la utilizarea limbajelor de tip static, pe lângă faptul că nu este nevoie să scrieți teste care nu testează nimic.

Deci, ce vreau să spun cu testele „să nu testez nimic”? Să presupunem că aveți o funcție care face o interogare SQL în baza de date. Ar trebui să caute articole filtrate de un anumit câmp. Pentru a scrie un test de unitate rapid, vă bateți joc de interogarea SQL. Cu excepția cazului în care biblioteca dvs. simulată poate simula întreaga logică a funcționării PostgreSQL pe un set de date eșantion, logica reală a funcției dvs. nu este testată deloc ; singurele teste de fond pe care le-ați putea scrie pentru a verifica logica ar valida doar faptul că batjocorile returnează răspunsuri adecvate.

Văd frecvent batjocuri care pur și simplu „verificați dacă baza de date a fost numită de câte ori este corect”. La urma urmei, acest lucru vă va oferi o acoperire de 100\% a codului! Super, un număr pentru a impresiona managerii non-tehnici, care nu înseamnă absolut nimic în practică! Du-te la echipă Statistici înșelătoare!

Nu, ceea ce ai nevoie este teste de sistem, sau teste de integrare / E2E, pentru a valida că întregul tău sistem este lucru. Nu doar teste unitare, ci teste care nu batjocoresc apelurile către baza de date, ci efectuează aceste apeluri.Și atunci când o suită de teste trebuie să ridice o bază de date de testare reală, ștergând-o și însămânțând-o între teste, acest lucru face TDD ca practică impracticabilă; este prea lent.

Deci, mergeți mai departe și scrieți mai întâi codul, apoi scrieți testul E2E și asigurați-vă că obține rezultatul corect. Heck, puteți utiliza caracteristica instantanee a suitelor de testare, cum ar fi Jesthttps: //jestjs.io/docs/en/snapshot-testing, pentru a valida doar faptul că răspunsul nu se schimbă; priviți-l o dată pentru a vă asigura că este corect și apoi, după ce îi spuneți lui Jest că are dreptate, va confirma că rămâne la fel în viitoarele rulări! API-urile pot fi testate și pot fi actualizate, într-o manieră aproape automatizată!

Deci, dacă ignorați delirurile credincioșilor TDD, vă puteți face treaba de două ori mai repede, deoarece nu aveți nevoie să aștept 10 minute (sau mai mult! Am văzut o suită de testare care a durat mai mult de o oră …) pentru ca suita E2E completă să ruleze pentru a vedea testul eșuat înainte de a începe să vă scrieți codul.

În plus, testarea UI deloc , așa cum sa subliniat în răspunsul lui Moray Taylor, este impracticabil în multe circumstanțe. Există un anumit nivel de test E2E care poate fi aplicat interfeței de utilizare, dar în cea mai mare parte rentabilitatea investiției pare să merite pentru cazul general.

Acestea fiind spuse, lucram la o bibliotecă grafică odată ce a fost utilizată de peste o sută de jocuri video diferite și am scris un test E2E suită pentru ca acesta să confirme că o schimbare a logicii interne a bibliotecii nu ar rupe un joc obscur pe care nici măcar nu l-am văzut niciodată. Bibliotecile merită întotdeauna teste mai amănunțite. Dar pentru UI pentru o singură aplicație, testarea E2E nu are aproape niciodată sens din experiența mea.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *