curs_3 testarea statica
TRANSCRIPT
Costurile pe care le implic detecia i rezolvrea defectelor
Testarea Aplicaiilor Software
costurile cresc odat cu evoluia n timp a dezvoltrii proiectului
repararea unui defect -> (%) poate produce un alt defect
contractele ntre client i dezvoltator penalizri legate de livrare
cu ct sunt detectate/reparate mai multe defecte n perioada critic de livrare, cu att cresc ansele ca livrarea s fie amnat -> costuri de penalizare
un defect detectat din timp reduce costurile proiectului de X ori fa de un defect detectat trziu
t
costuri
Cerine/Specificaii
Dezvoltare
Livrare
Reducerea costurilor
Testarea Aplicaiilor Software
se caut defecte n cerine/specificaii cel mai ieftin la momentul proiectrii (costuri foarte mici se evit propagarea erorii)
detectarea unui defect de ctre programator nainte testor reduce costurile considerabil (timp, bani, persoane implicate)
defecte nainte de livrare influeneaz -> divizia de marketing (nu se pot realiza la timp pliante, demo-uri), divizia de documentare (documentaie, tutoriale), divizia de vnzri
dup livrare costurile pot crete exponenial, dac nu este specificat altfel n contract. Produsul software este actualizat (client unic vs. milioane de clieni, e-mail/web vs. mail)
Extreme programming soluie de reducere a costurilor ?
Testarea Aplicaiilor Software
reduce considerabil costurile de rezolvare a unui defect nainte de livrare
procesul de dezvoltare a proiectului divizat n cicluri de scurt durat (programare, testare, verificare client, proiectare) interaciune continu cu clientul
metod de dezvoltare software Agile
Costuri legate de calitatea produsului
Testarea Aplicaiilor Software
prevenire
verificare
defecte interne
defecte externe
4 categorii de costuri
Costuri de prevenire. Exemple
Testarea Aplicaiilor Software
colarizarea celor implicai n proiect
analiza cerinelor
proiectare tolerant la defecte
claritatea specificaiilor
documentarea intern a proiectului
evaluarea anticipat a fiabilitii utilitarelor necesare n dezvoltarea produsului
Costuri de verificare. Exemple
Testarea Aplicaiilor Software
revizuirea proiectrii
inspectarea codului
testare white box & black box
colarizarea testorilor
testare beta
testarea funcionalitii din punct de vedere al utilizatorilor propriu-zii
testarea produsului de ctre client, nainte de livrare
Costul defectelor interne. Exemple
Testarea Aplicaiilor Software
Rezolvarea defectelor
Testarea prin regresie
Timp pierdut n interiorul companiei (programator, testor)
Timp pierdut n marketing i vnzri
Timp pierdut n publicitate
Penalizri legate de livrarea ntrziat
Costul defectelor externe. Exemple
Testarea Aplicaiilor Software
Pierderea bunvoinei clientului
Telefoane pentru suport tehnic
Scrierea documentaiei Questions & Answers
Investigarea problemelor raportate de ctre client
Oferirea suportului pentru mai multe versiuni
Garanie, restituirea anumitor sume ctre client
Livrarea produselor actualizate
Motivarea necesitii rezolvrii defectului alturi de prile interesate pe baza costurilor estimate
Testarea Aplicaiilor Software
Echipa de documentare
Echipa de suport tehnic
Echipa de marketing
Echipa de vnzri
Managerii de proiect
Pri interesate
Testare/Analiz/Verificare static
Testarea Aplicaiilor Software
mbuntete calitatea codului
defecte software (implementare, editare)
verific codul pe anumite abloane standardizate la nivelul organizaiei
Testare static vs. Testare dinamic
nu se ruleaz software-ul -> se verfic buci de cod
produce avertismente nainte de compilare
Testare/Analiz/Verificare static
Testarea Aplicaiilor Software
Nu execut codul surs
Metode manuale (la inceput, costuri reduse) & automate - complementare
Detecia blocurilor executate n timpul testrii
Examineaz codul
Control-Flow
Criterii
Data-Flow
Criteriul Control-Flow
Testarea Aplicaiilor Software
Reprezentarea grafului Control-Flow- noduri = operaii/condiii executate secvenial
- muchii = fluxul de control dintre operaii
Scopul acoperirea grafului C-F, prin reducerea cazurilor de test
Tipuri de acoperire:- acoperirea operaiilor executabile
- acoperirea ramurilor - acoperirea deciziilor i a condiiilor -> independena subexpresiilor- acoperirea rutelor de execuie -> posibilele rute activate n execuia codului surs
Ex: condiii, cicluri, ieire din condiie/ciclu,...
Dezavantaje: - necesitatea nelegerii codului de ctre testor pt. producerea grafului C-F- multe linii de cod (module/uniti) -> numrul mare de cazuri de test
Criteriul Control-Flow. Acoperirea 100% a operaiilor executabile
Testarea Aplicaiilor Software
if (a>10) x+=2;if (b10b10) x+=2;if (b10b10b10 && b==0) x+=2;if (c=0) x-=2;
Acoperire incomplet a rutelor de execuie.
Din 4 rute au fost acoperite 2.
a>10 &&b==0c=0.x+=2x-=2
a=12, b=0,c=2, d=-3
a>10 &&b==0c=0.x+=2x-=2
a=1, b=0,c=-2, d=-3
Criteriul Control-Flow. Acoperirea 100% a rutelor de execuie
Testarea Aplicaiilor Software
Cicluri numr foarte mare de teste
.
Criteriul Control-Flow. Testarea structurat. Complexitate ciclomatic [Tom McCabe]
Testarea Aplicaiilor Software
obinerea grafului Control-Flow din codul software
calcularea Complexitii Ciclomatice (C)
selectarea unei mulimi de rute de baz (nceput/sfrit)
crearea unui caz de test pentru fiecare rut de baz
executarea testelor
Complexitate ciclomatic (C)
Testarea Aplicaiilor Software
C = muchii noduri + 2
sau
C = p + 1 / p numrul de decizii binare (valabil pt. tipuri de decizii exclusiv binare)
C = 24 - 19 + 2 = 7
sau
C = 6 + 1 = 7
C = numrul minim de rute de baz independente neciclice, care mpreun traverseaz toate muchiile, avnd proprietatea c oricare dou rute au cel puin o muchie diferit. Garanteaz 100% acoperirea operaiilor executabile i a condiiilor
Complexitate ciclomatic (C). Exemplu [Brown & Donaldson]
Testarea Aplicaiilor Software
boolean evaluateBuySell (TickerSymbol ts) { s1; s2; s3; if (c1) {s4; s5; s6;} else {s7; s8;} while (c2) { s9; s10; switch (c3) { case-A: s20; s21; s22; break; // End of Case-A case-B: s30; s31; if (c4) { s32; s33; s34; } else { s35; } break; // End of Case-B case-C: s40; s41; break; // End of Case-C case-D: s50; break; // End of Case-D } // End Switch s60; s61; s62; if (c5) {s70; s71; } s80; s81; } // End While s90; s91; s92; return result; }
si = operaia icj = condiia j
C = 22 16 + 2 = 8
1. ABDP
2. ACDP
3. ABDEFGMODP
4. ABDEFHKMODP
5. ABDEFIMODP
6. ABDEFJMODP
7. ABDEFHLMODP
8. ABDEFIMNODP
Variant 8 rute de baz
Test CaseC1C2C3C4C5
1FalseFalseN/AN/AN/A
2TrueFalseN/AN/AN/A
3FalseTrueAN/AFalse
4FalseTrueBFalseFalse
5FalseTrueCN/AFalse
6FalseTrueDN/AFalse
7FalseTrueBTrueFalse
8FalseTrueCN/ATrue
Cazuri de test / condiii
Complexitate ciclomatic (C). Tem
Testarea Aplicaiilor Software
...if (c1) {while (c2) {if (c3) { s1; s2;if (c5) s5;else s6;Break;} // End whileelseif (c4) { }else { s3; s4; break;}} // End while} // End ifs7;if (c6) s8; s9;s10;...
si = operaia icj = condiia j
Criteriul Data-Flow
Testarea Aplicaiilor Software
#include main() { int x; printf ("%d",x); }
Rezultat?Testarea Data-Flow = detecteaz utilizarea eronat a variabilelor n codul surs
Criteriul Data-Flow
Testarea Aplicaiilor Software
Posibiliti de prim apariie a unei variabile n cod
1. ~d variabila nu exist (notat prin ~), apoi este definit (d)2. ~u variabila nu exist, apoi este utilizat (u)3. ~k variabila nu exist, apoi este distrus (k)
?Perechi (d,u,k)
dd definire succesiv -> posibil eroare de codaredu definire apoi utilizare -> corectdk definire apoi distrugere -> posibil eroare de codareud utilizare apoi (re)definire -> okuu utilizare succesiv -> okuk utilizare apoi distrugere -> okkd distrugere apoi (re)definire -> okku distrugere apoi utilizare -> eroare majorkk distrugere succesiv -> posibil eroare de codare
Criteriul Data-Flow (Static)
Testarea Aplicaiilor Software
d(x)u(y)k(z)k(z)u(x)d(z)d(y)u(z)u(y)u(z)k(y)d(z)d(x)u(x)u(z)
~d corectdd eroaredu ok
Variabila x
du ok
~u eroare!ud okdu okuk - ok
Variabila y
dk eroare
~k eroareku eroare!uu ok
Variabila z
ud ok
kk eroare
Cazuri particulare:
- utilizarea vectorilor ( a[j] depinde de context)- anumite rute ce conin perechi eronate (d,u,k) nu sunt folosite niciodat -> cod nu neaparat incorect
==> Criteriul Data-Flow (Dinamic)
Criteriul Data-Flow (Dinamic)
Testarea Aplicaiilor Software
Se bazeaz pe Control-Flow
Pentru fiecare variabil se definete cel puin un caz de test pentru fiecare pereche def-use
variabil
definiie
utilizare
computaional
predicat
perechedef-useChang Liu, Teaching 'Data Flow Testing' in an SoftwareEngineering Course, Russ College of Engineering and Technology
Criteriul Data-Flow. Tem
Testarea Aplicaiilor Software
Creai cazuri de test pe baza criteriului Data-Flow pentru fiecare variabil din funcia factorial de mai jos. Un caz de test poate acoperi mai multe variabile.
int factorial (int n) {int answer, counter;answer = 1;counter = 1;
loop:if (counter > n) return answer;answer = answer * counter;counter = counter + 1;goto loop;}
Criteriul Data-Flow. Tem
Testarea Aplicaiilor Software
Creai cazuri de test Data-Flow, pe baza cilor Control Flow:
int module( int selector) {int foo, bar;switch selector {case SELECT-1:foo = calc_foo_method_1();break;case SELECT-2:foo = calc_foo_method_2();break;case SELECT-3:foo = calc_foo_method_3();break;}switch foo {case FOO-1:bar = calc_bar_method_1();break;case FOO-2:bar = calc_bar_method_2();break;}return foo/bar;}
Testare static. Analiz static
Testarea Aplicaiilor Software
FindBugs, Checkstyle
Splint, Frama-C, BLAST
CppCheck
Perl::Critic
Exemple de analiz static
Testarea Aplicaiilor Software
Recursivitate infinit
O singur instruciune return la nivel de funcie depanare uoar
Greeli de editare (=, ==) - typos
Comparaii ntre obiecte diferite
Evitarea erorii NullPointerException
Cod redundant
Exemple de analiz static
Testarea Aplicaiilor Software
int f( bool b ){int i;if ( b ){i = 0;}return i; }
Neiniializarea variabilei
Visual Studio Team System, Code Analysis for C/C++ Warnings
// i este neiniializat dac b = false
Exemple de analiz static
Testarea Aplicaiilor Software
#include
void f( ){ char *p = ( char * ) malloc( 10 );*p = '\0';
// ...free( p );}
Dereferenierea pointerului NULL
#include void f( ){char *p = ( char * )malloc ( 10 );if ( p ) {*p = '\0';
// ...free( p );}}
Visual Studio Team System, Code Analysis for C/C++ Warnings
Exemple de analiz static
Testarea Aplicaiilor Software
#include
void f( ){
fopen( "test.c", "r" ); // valoarea returnat ignorat
// ...}
Ingnorarea valorii returnate
#include
void f( ){FILE *stream;if((stream = fopen( "test.c", "r" )) == NULL ) return;
// ...}
Visual Studio Team System, Code Analysis for C/C++ Warnings
Exemple de analiz static
Testarea Aplicaiilor Software
#include void f( ){
char buff[15];sprintf(buff, "%s %s", "Hello, World!");}
Lips argument
#include void f( ){char buff[15];sprintf(buff, "%s %s ", "Hello","World");}
Visual Studio Team System, Code Analysis for C/C++ Warnings
Exemple de analiz static
Testarea Aplicaiilor Software
int buff[14]; // array de 0..13 elementevoid f(){for (int i=0; i0
#define INPUT_TYPE 2void f(int n){if((INPUT_TYPE & n) == 2){puts("comparaie AND pe bii adevrat");}else{puts("comparaie AND pe bii fals");}}
Visual Studio Team System, Code Analysis for C/C++ Warnings
Exemple de analiz static
Testarea Aplicaiilor Software
void f( int i ){while (i = 5){// ...}}
Operator incorect
void f( int i ){while (i == 5){// ... }}
Visual Studio Team System, Code Analysis for C/C++ Warnings
Exemple de analiz static
Testarea Aplicaiilor Software
void f( ){int i;
for (i = 100; i >= 0; i++){// ...}}
Incrementare eronat a contorului
void f( ){int i;
for (i = 100; i >= 0; i--){// ...}}
Visual Studio Team System, Code Analysis for C/C++ Warnings
Exemple de analiz static
Testarea Aplicaiilor Software
struct myBits{short flag : 1;short done : 1;//...} bitType;
void f( ){if (bitType.flag == 1) {// ...}}
Comparaie ntre bit field i tipul boolean
void f (){if(bitType.flag==bitType.done){// ...}}
Visual Studio Team System, Code Analysis for C/C++ Warnings
Exemple de analiz static
Testarea Aplicaiilor Software
void f( ){ size_t x;char a[10];
x= sizeof (a - 4);// ...}
Utilizare sizeof pentru o expresie
void f( ) {size_t x;char a[10];
x= sizeof (a) - 4;// ...}
Visual Studio Team System, Code Analysis for C/C++ Warnings
Exemple de analiz static
Testarea Aplicaiilor Software
void f(int n){ f=n*f(n-1);}
Recursivitate infinit
void f(int n){ if (n==1) return 1; else f=n*f(n-1);}
Exemple de analiz static
Testarea Aplicaiilor Software
int i=2;while (i){ // ... i nu este modificat}
Ciclu infinit
int i=2;while (i){ // ... i este modificat}
while (true){ // ... nu exist condiie de ieire break}
while (true){ // ... if (x==y) break;}
Rezumat & ntrebri
Testarea Aplicaiilor Software