ALGO25 / BLOG

Cum construiești teste limită pentru probleme C++

Construiește teste cu un scop clar: minim, maxim, duplicate, valori negative și egalități. Separă datele valide de intrările în afara cerinței.

Un test bun verifică o ipoteză a soluției. Nu trebuie să fie mare ca să fie util. Un singur element negativ poate descoperi o inițializare greșită, iar două elemente egale pot arăta o departajare incorectă pe care sute de valori distincte o ascund.

Începe cu domeniul permis

Notează dimensiunea minimă și maximă, domeniul valorilor și proprietățile garantate: sortare, unicitate, conexitate sau alfabet. Nu folosi un vector nesortat ca test de corectitudine pentru o problemă care garantează ordonarea. Poți testa robustețea la intrări invalide separat, dar nu confunda cele două obiective.

Dacă n începe de la 1, cazul n=0 nu este obligatoriu pentru soluția problemei. Dacă zero este permis ca valoare numerică, trebuie însă verificat în prelucrarea cifrelor sau în împărțiri.

Pentru o căutare, teste distincte sunt valoarea prezentă, valoarea absentă și duplicatele la frontieră.Pentru o căutare, teste distincte sunt valoarea prezentă, valoarea absentă și duplicatele la frontieră.Mărește schema ↗

Alege câte un test pentru fiecare risc

Pentru un maxim: toate valorile negative, maxim la început, maxim la sfârșit și maxime repetate. Pentru o secvență: cea mai bună secvență la început, la sfârșit și două soluții egale. Pentru o matrice: o singură linie, o singură coloană și dimensiuni diferite.

Pentru text: linie goală dacă este permisă, un caracter, lungime maximă, spații consecutive și caractere repetate. Pentru grafuri: un singur vârf, componente separate și un ciclu, în măsura în care contractul le permite.

Nu toate aceste cazuri se aplică oricărei probleme. Selectează-le după variabilele și deciziile algoritmului, nu după o listă bifată mecanic.

Exemplu: prima poziție a maximului

Pentru 5, răspunsul este poziția 1. Pentru 9 2 3, este 1. Pentru 2 3 9, este 3. Pentru 9 2 9, rămâne 1 dacă se cere prima apariție. Ultimul test separă comparația strictă de cea care actualizează și la egalitate.

Pentru -7 -2 -5, poziția corectă este 2. Acest caz verifică dacă maximul a fost inițializat din date, nu cu zero. Fiecare intrare din set are un motiv distinct, ceea ce face diagnosticul mai rapid când apare o eroare.

Verifică și valorile intermediare

Pentru o sumă, un test cu toate elementele la limita maximă verifică domeniul rezultatului. Pentru un produs, rezultatul intermediar poate fi mai mare decât cel final după o împărțire. Pentru o căutare, ținta absentă și aflată dincolo de capete verifică oprirea și indicii.

Calculează răspunsul așteptat independent: manual pentru cazurile mici sau printr-o metodă simplă și verificată pentru cele generate. Nu compara două implementări care copiază aceeași formulă greșită și presupune că acordul lor demonstrează corectitudinea.

După fiecare corectare

Păstrează testul care a descoperit bugul și adaugă o explicație scurtă: „maxim repetat, aleg prima poziție” sau „secvența optimă ajunge la ultimul element”. Rulează întregul set după modificare. Acesta devine un set de regresie care urmărește greșelile reale ale soluției.

Folosește maxime și poziții, matrice și limite și trimiterea și verificarea soluțiilor pentru a aplica metoda imediat.

Întrebări frecvente

Ce este un test limită la o problemă de informatică?

Un caz permis care verifică o frontieră sau o ipoteză sensibilă: dimensiunea minimă, valoarea maximă, duplicatele ori soluția aflată la margine. Testul trebuie ales după contractul problemei.

Trebuie să testez n egal cu zero dacă enunțul cere n pozitiv?

Nu pentru corectitudinea pe domeniul declarat. Intrările invalide pot fi testate separat pentru robustețe, dar nu înlocuiesc cazurile limită valide cerute de problemă.

Cum verific răspunsul așteptat al unui test?

Calculează-l manual pentru date mici sau cu o metodă simplă și independentă. Două programe care copiază aceeași formulă greșită pot fi de acord fără ca răspunsul să fie corect.