Curs_3 Testarea Statica

Embed Size (px)

Citation preview

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