Ce este testarea firelor în testarea software-ului?

⚡ Rezumat inteligent

Testarea firelor de execuție verifică capacitatea funcțională cheie a unei singure sarcini de business pe măsură ce aceasta trece printr-un sistem integrat și se execută la începutul testării integrării, mai degrabă decât după ce fiecare componentă este finalizată.

  • 🧵 Idee de bază: Un fir de execuție este o tranzacție de afaceri end-to-end, iar testul urmează această cale prin modulele integrate.
  • ⏱️ Când rulează: La începutul fazei de testare a integrării, ca strategie incrementală de integrare a sistemului.
  • 🔀 Două arome: Testarea cu un singur fir de execuție execută o tranzacție pe rând, în timp ce testarea cu mai multe fire de execuție execută mai multe simultan.
  • ???? Ce prinde: Condiții de concurență, blocaje, conflicte de resurse partajate și coruperea datelor pe care testarea pe o singură cale le ratează.
  • 🧰 Cum se execută: Execuții repetate cu diverse combinații de aplicații, instanțe multiple, hardware diferit și inspecție de cod.
  • 📉 Limita sinceră: Testele unitare reproductibile pentru codul multithreaded rămân dificile, astfel încât defectele de sincronizare pot fi intermitente.

Ce este testarea firelor de execuție în testarea software cu tipuri cu un singur thread și mai multe thread-uri?

Ce este testarea firelor?

Testarea firelor de ață este un tip de testare software care verifică capacitatea funcțională cheie a unei sarcini specifice, numită fir de execuție. De obicei, se efectuează în stadiul incipient al testarea de integrare fază. Testarea bazată pe fire de execuție este una dintre strategiile incrementale adoptate în timpul testării integrării sistemului. Din acest motiv, un test de fire de execuție este mai potrivit descris ca o testul de interacțiune a firelor de execuție.

Un fir de execuție aici nu este doar un fir de execuție al sistemului de operare. În Inginerie software termeni, un fir de acțiune este o tranzacție comercială completă — de exemplu „un client plasează o comandă” — tractrece prin fiecare modul pe care îl atinge. Testarea firelor de execuție întreabă dacă acea singură cale se comportă corect după ce modulele sunt conectate împreună.

Diagrama de mai jos arată cum firele de execuție individuale sunt integrate și exercitate ca un subsistem înainte de asamblarea întregului sistem.

Diagrama de testare a firelor de execuție care arată fire de execuție integrate incremental într-un subsistem și apoi într-un sistem complet

Tipuri de testare a firelor

Testarea bazată pe fire de execuție este clasificată în două categorii, iar distincția decide atât datele de testare, cât și defectele pe care este probabil să le găsiți.

  • Testarea cu un singur fir de execuție: Un test cu un singur fir de execuție implică o singură tranzacție a aplicației la un moment dat. Este servită o singură cerere, deci comportamentul răspunsului este previzibil, iar testul este ușor de scriptat și repetat.
  • Testare multi-thread: Un test multi-thread implică mai multe tranzacții active concomitent. Fire de execuție separate sunt pregătite pentru același serviciu, astfel încât răspunsul și gestionarea stării partajate să poată fi observate sub sarcină simultană.

O tranzacție care trece fără probleme în testarea cu un singur fir de execuție poate eșua totuși într-o rulare cu mai multe fire de execuție, deoarece a doua rulare adaugă concurență pentru aceleași înregistrări, conexiuni și memorie.

Cum se face testarea firelor

Procesul de tip thread se concentrează pe activitățile de integrare, mai degrabă decât pe întregul ciclu de dezvoltare. În practică, abordarea funcționează după cum urmează.

  • Testarea bazată pe fire este o formă generalizată de testare bazată pe sesiune, prin aceea că sesiunile sunt o formă de fir, dar un fir nu este neapărat o sesiune.
  • Firul de execuție sau programul (funcționalitate mică) este integrat și testat incremental ca subsistem, apoi executat pentru întregul sistem.
  • La cel mai scăzut nivel, oferă integratorilor o mai bună cunoaștere a domeniului de aplicare a ceea ce trebuie testat.
  • În loc să testeze direct componentele software, integratorii trebuie să se concentreze pe testarea căilor logice de execuție în contextul întregului sistem.

Deoarece unitatea de lucru este o cale de afaceri mai degrabă decât o componentă, testarea firelor de execuție se situează în mod natural între testarea modulelor și plin testarea sistemului.

Sfaturi pentru testarea cu mai multe fire

Defectele cu fire de execuție multiple depind de sincronizare, așa că o singură rulare curată dovedește foarte puțin. Sfaturile de mai jos cresc șansa de a le scoate la iveală.

  • Testați programul multithreaded executându-l în mod repetat cu un amestec diferit de aplicații care rulează.
  • Testați programul multithreaded având mai multe instanțe ale programului active în același timp.
  • Executați programul multithreaded pe diferite modele hardware cu niveluri de solicitare și sarcini de lucru variate.
  • Folosește inspecția codului, deoarece unele erori de sincronizare sunt mai ușor de citit decât de reprodus.
  • Colectează doar erorile și eșecurile care au apărut în alte fire de execuție decât cel principal.

Defecte comune descoperite în timpul testării filetului

Erorile de concurență se anunță rareori cu o stivă curată trace. Categoriile de mai jos prezintă majoritatea aspectelor expuse de o rulare multi-thread, iar fiecare are un simptom distinct care merită recunoscut.

  • Condiții de cursă: Două fire de execuție citesc și scriu aceeași valoare fără a fi ordonate, deci rezultatul final depinde de firul de execuție care s-a terminat primul. Simptom: totaluri corecte la unele rulări și greșite la altele.
  • Impas: Două fire de execuție au fiecare o blocare de care are nevoie celălalt și niciuna nu continuă. Simptom: tranzacția se blochează pe termen nelimitat în loc să eșueze cu o eroare.
  • Contestație privind resursele: Firele de execuție stau la coadă pentru aceeași conexiune, identificator de fișier sau înregistrare, iar debitul se reduce cu mult înainte ca limita hardware să fie atinsă.
  • Coruperea datelor: Structurile partajate parțial scrise lasă înregistrările într-o stare pe care nicio tranzacție validă nu ar putea-o produce.
  • Foame: Un fir de execuție cu prioritate scăzută nu obține niciodată resursa de care are nevoie, așa că o cale de utilizator expiră în timp ce restul sistemului pare sănătos.

Fiecare dintre acestea necesită înregistrarea rulării eșuate în jurnale, deoarece un defect care se reproduce o dată la cincizeci de încercări este altfel imposibil de ridicat prin intermediul procesul de management al defectelor.

Testarea firelor de execuție vs. testarea concurenței vs. testarea integrării

Cei trei termeni se suprapun și sunt frecvent amestecați în planurile de testare. Tabelul îi separă în funcție de intenție.

Aspect Testarea firelor de ață Testarea concurenței Testarea integrării
Unitatea testată O singură tranzacție comercială în mai multe module Mai mulți utilizatori sau fire de execuție care acționează simultan Interfețe între două sau mai multe componente
Întrebare principală Această cale cheie funcționează de la un capăt la altul? Ce se întrerupe când accesul este simultan? Modulele comunică corect între ele?
Etapa tipică Testarea timpurie a integrării Testarea sistemului sau a performanței După testarea unității
Defecte vizate Căi de execuție întrerupte, predări ratate Blocaje, condiții de concurență, dispute prin blocaje Neconcordanțe de interfață, conexiuni de date greșitetracts
Relaţie Varianta multi-thread se suprapune cu testarea concurenței Mai amplu decât secțiunea multi-thread a testării firelor de execuție Testarea firelor de execuție este o strategie incrementală în cadrul acesteia

Pe scurt, testarea concurenței întreabă ce efect are accesul simultan asupra sistemului, în timp ce testarea firelor de execuție întreabă dacă o cale importantă supraviețuiește integrării. Echipele care rulează ambele programează de obicei mai întâi testarea firelor de execuție.

Avantajele testării filetelor

Tehnica își câștigă locul într-un plan de integrare din mai multe motive practice.

  • Căile cheie de afaceri sunt validate din timp, astfel încât o predare defectuoasă este identificată înainte de asamblarea întregului sistem.
  • Integratorii obțin o imagine clară a domeniului de aplicare, deoarece unitatea de testare este o tranzacție recognoscibilă, mai degrabă decât un element abs.traclimita componentei t.
  • Testarea căilor logice de execuție în contextul sistemului expune erori care au izolat testarea componentelor nu pot vedea.
  • Rulările multi-thread scot la iveală defecte de concurență - blocaje, condiții de concurență și conflicte de resurse - care altfel ar ajunge în producție.
  • Integrarea incrementală menține suprafața de depanare mică, deoarece se adaugă un singur fir de execuție odată.
  • Rezultatele sunt introduse direct în testarea regresiei, deoarece un fir de execuție care trece reprezintă un candidat evident pentru suita de regresie.

Dezavantajele testării firelor

  • Pentru testarea multithreading, cea mai mare provocare este posibilitatea de a programa un test reproductibil pentru un test unitar.
  • Scrierea testelor unitare pentru cod multithreaded este o sarcină dificilă.
  • Criteriile de testare pentru testarea multi-thread diferă de testarea cu un singur thread. Pentru testarea multi-thread, factori precum dimensiunea memoriei, capacitatea de stocare și problemele de sincronizare variază atunci când codul este apelat pe hardware diferit.
  • Firele de execuție nu pot fi testate înainte ca modulele pe care le traversează să fie disponibile, așadar programarea depinde de ordinea integrării.
  • Defecțiunile intermitente sunt ușor de trecut cu vederea drept zgomot ambiental, ceea ce face ca exploatarea disciplinată a forestieră să fie esențială.

Întrebări frecvente

Liderul de teste colaborează cu analiștii de business pentru a clasifica tranzacțiile în funcție de impactul asupra veniturilor și frecvența de utilizare. Căile cu cea mai mare valoare sunt integrate și conectate mai întâi, astfel încât apare o eroare critică de predare cât timp mai există timp de planificare.

Înregistrează traiectoria afacerii, modulele traversate, datele transmise între ele și starea finală așteptată. Spre deosebire de o componentă caz de testare, condiția de trecere se află la sfârșitul întregii tranzacții.

Generatoarele de sarcină care generează utilizatori virtuali configurabili sunt alegerea obișnuită — JMeter este opțiunea open-source obișnuită. Numărul de thread-uri, setările de ramp-up și buclă se mapează direct pe scenarii multi-thread.

Modelele de învățare automată grupează modele de jurnalizare din mii de rulări repetate și semnalează intercalările care preced o blocare sau o înregistrare coruptă. Acest lucru restrânge o eroare de sincronizare intermitentă la un set mic de secvențe suspecte.

Copilotul GitHub elaborează rapid thread pool-urile, latch-urile și buclele de stres. Un tester trebuie să decidă în continuare care sunt punctele de sincronizare importante, deoarece testele generate trec adesea fără a forța vreodată o intercalare reală.

Nu există un număr fix. Echipele repetă scenariul pe diverse sarcini de lucru și hardware până când erorile nu mai apar, apoi păstrează scenariul în suita nocturnă, deoarece defectele de sincronizare reapar atunci când mediul se schimbă.

Fiecare fir de execuție prioritizat se execută de la un capăt la altul fără un defect nerezolvat, rularea multi-thread se finalizează la concurența țintă și nicio problemă deschisă nu este un deadlock sau o eroare de clasă de corupere a datelor în cadrul... ciclul de viață al testării.

Da — firul de execuție devine o cale de solicitare prin servicii, mai degrabă decât prin module. Distribuit tracing înlocuiește stiva de apeluri locală și se aplică aceeași întrebare: oare o tranzacție de business supraviețuiește intactă fiecărui salt?

Rezumați această postare cu: