En enginyeria del programari, la cobertura de codi, també anomenada cobertura de proves, és una mesura percentual del grau en què s'executa el codi font d'un programa quan s'executa un conjunt de proves particular. Un programa amb una cobertura de codi alta té més del seu codi font executat durant les proves, la qual cosa suggereix que té menys possibilitats de contenir errors de programari no detectats en comparació amb un programa amb una cobertura de codi baixa. Es poden utilitzar moltes mètriques diferents per calcular la cobertura de la prova. Algunes de les més bàsiques són el percentatge de subrutines del programa i el percentatge de sentències del programa cridades durant l'execució de la suite de proves.

La cobertura de codi va ser un dels primers mètodes inventats per a les proves sistemàtiques de programari. La primera referència publicada va ser per Miller i Maloney a Communications of the ACM, el 1963.

Criteris de cobertura Per mesurar quin percentatge de codi ha estat executat per una suite de proves, s'utilitzen un o més criteris de cobertura. Normalment es defineixen com a regles o requisits, que ha de complir un conjunt de proves.

Criteris bàsics de cobertura Hi ha una sèrie de criteris de cobertura, però els principals són:

Cobertura de la funciós'ha cridat cada funció (o subrutina) del programa? Cobertura de la declaraciós'ha executat cada instrucció del programa? Cobertura de voras'han executat totes les arestes del gràfic de flux de control? Cobertura de la sucursals'ha executat cada branca (també anomenada DD-path) de cada estructura de control (com ara les declaracions if i case)? Per exemple, donada una instrucció if, s'han executat les branques vertadera i falsa? (Aquest és un subconjunt de cobertura de vora). Cobertura de condicionss'ha avaluat cada subexpressió booleana com a vertadera i falsa? (També s'anomena cobertura de predicats).

Per exemple, considereu la funció C següent:int foo (int x, int y) { int z = 0; if ((x > 0) && (y > 0)) { z = x; } return z; }Suposem que aquesta funció és part d'un programa més gran i que aquest programa s'ha executat amb algun conjunt de proves.

La cobertura de la funció es complirà si, durant aquesta execució, la funció foo s'ha cridat almenys una vegada. La cobertura d'instruccions d'aquesta funció es satisfarà si s'ha cridat, per exemple, com foo(1,1), perquè en aquest cas, s'executarien totes les línies de la funció, inclòs z = x;. La cobertura de la branca es satisfarà amb proves que criden foo(1,1) i foo(0,1) perquè, en el primer cas, tant if es compleixen les condicions com z = x; s'executa, mentre que en el segon cas, no es compleix la primera condició, (x>0), que impedeix l'execució de z = x;. La cobertura de condicions es satisfarà amb les proves que criden foo(1,0), foo(0,1) i foo(1,1). Són necessaris perquè en el primer cas, (x>0) s'avalua com a true, mentre que en el segon, s'avalua com a false. Al mateix temps, el primer cas fa (y>0) false, el segon cas no avalua (y>0) (a causa de l'avaluació mandrosa de l'operador booleà), el tercer cas ho fa true.

En els llenguatges de programació que no realitzen l'avaluació de curtcircuits, la cobertura de les condicions no implica necessàriament la cobertura de la branca. Per exemple, considereu el següent fragment de codi Pascal:if a and b thenLa cobertura de condicions es pot satisfer mitjançant dues proves:

a=true, b=false a=false, b=true

Tanmateix, aquest conjunt de proves no satisfà la cobertura de la branca, ja que cap dels dos casos complirà la condició if.

Pot ser necessària la injecció d'errors per garantir que totes les condicions i branques del codi de gestió d'excepcions tinguin una cobertura adequada durant la prova.

Condició modificada/cobertura de decisió Una combinació de cobertura de funcions i cobertura de sucursal també s'anomena cobertura de decisions. Aquest criteri requereix que cada punt d'entrada i sortida del programa s'hagi invocat almenys una vegada i que cada decisió del programa s'hagi pres sobre tots els resultats possibles almenys una vegada. En aquest context, la decisió és una expressió booleana que inclou condicions i zero o més operadors booleans. Aquesta definició no és la mateixa que la cobertura de la branca, tanmateix, de vegades s'utilitza el terme cobertura de decisió com a sinònim.

La cobertura de condició/decisió requereix que es compleixin tant la cobertura de la decisió com la de la condició. Tanmateix, per a aplicacions crítiques per a la seguretat (com ara programari d'aviònica) sovint es requereix que es compleixi la cobertura de condicions/decisions modificades (MC/DC). Aquest criteri amplia els criteris de condició/decisió amb requisits que cada condició ha d'afectar el resultat de la decisió de manera independent.

Per exemple, considereu el codi següent:if (a or b) and c thenLa condició/criteri de decisió es complirà amb el següent conjunt de proves: abcveritatveritatveritatfalsfalsfals Tanmateix, el conjunt de proves anterior no satisfarà la cobertura modificada de la condició/decisió, ja que en la primera prova, el valor de 'b' i en la segona prova el valor de 'c' no influirien en la sortida. Per tant, es necessita el següent conjunt de proves per satisfer MC/DC: abcfalsveritatfalsfalsveritatveritatfalsfalsveritatveritatfalsveritat

Cobertura de múltiples condicions Aquest criteri requereix que es comprovin totes les combinacions de condicions dins de cada decisió. Per exemple, el fragment de codi de la secció anterior requerirà vuit proves: abcfalsfalsfalsfalsfalsveritatfalsveritatfalsfalsveritatveritatveritatfalsfalsveritatfalsveritatveritatveritatfalsveritatveritatveritat

Cobertura del valor del paràmetre La cobertura del valor dels paràmetres (PVC) requereix que en un mètode que pren paràmetres, es tinguin en compte tots els valors comuns d'aquests paràmetres. La idea és que es comprovin tots els valors possibles comuns per a un paràmetre. Per exemple, els valors habituals d'una cadena són: 1) null, 2) buit, 3) espai en blanc (espai, tabulacions, nova línia), 4) cadena vàlida, 5) cadena no vàlida, 6) cadena d'un sol byte, 7) cadena de doble byte. També pot ser apropiat utilitzar cadenes molt llargues. Si no es prova cada valor de paràmetre possible, es pot produir un error. Provar només una d'elles podria donar lloc a una cobertura de codi del 100%, ja que cada línia està coberta, però com que només es prova una de les set opcions, només hi ha un 14,2% de PVC.

Altres criteris de cobertura Hi ha altres criteris de cobertura, que s'utilitzen amb menys freqüència:

Cobertura de seqüència de codi lineal i salt (LCSAJ) també conegut com a cobertura JJ-Paths'han executat tots els camins LCSAJ/JJ? Cobertura del camíS'han executat totes les rutes possibles a través d'una part determinada del codi? Cobertura d'entrada/sortidaS'han executat totes les trucades i retorns possibles de la funció? Cobertura de bucleS'han executat tots els bucles possibles zero vegades, una vegada i més d'una vegada? Cobertura estatalS'ha assolit i explorat cada estat d'una màquina d'estats finits? Cobertura del flux de dadesS'ha assolit i explorat cada definició de variable i el seu ús?

A la pràctica El programari de destinació es construeix amb opcions o biblioteques especials i s'executa sota un entorn controlat, per assignar cada funció executada als punts de funció del codi font. Això permet provar parts del programari de destinació a les quals s'accedeix rarament o mai en condicions normals, i ajuda a assegurar-se que s'han provat les condicions més importants (punts de funció). A continuació, s'analitza la sortida resultant per veure quines àrees de codi no s'han exercit i les proves s'actualitzen per incloure aquestes àrees segons sigui necessari. Combinat amb altres mètodes de cobertura de proves, l'objectiu és desenvolupar un conjunt de proves de regressió rigoroses, però manejables.

En implementar polítiques de cobertura de proves en un entorn de desenvolupament de programari, cal tenir en compte el següent:

Quins són els requisits de cobertura per a la certificació del producte final i, en cas afirmatiu, quin nivell de cobertura de prova es requereix? El nivell típic de progressió de rigor és el següent: declaració, branca/decisió, condició modificada/cobertura de decisió (MC/DC), LCSAJ (seqüència de codi lineal i salt) Es mesurarà la cobertura amb proves que verifiquen els requisits que s'imposen al sistema en prova (DO-178B)? El codi objecte generat es pot traçar directament a les declaracions del codi font? Algunes certificacions, (és a dir, DO-178B Nivell A) requereixen cobertura a nivell de muntatge si aquest no és el cas: "Llavors, s'ha de realitzar una verificació addicional sobre el codi d'objecte per establir la correcció d'aquestes seqüències de codi generades" (DO-178B) paràgraf-6.4.4.2.

Referències

Categoria:Programari Categoria:Enginyeria de programari