Domanda relativa alla copertura della decisione della succursale

6

ISTQB non distingue tra questi (si legge "Ramo / copertura decisionale") ma alcune fonti dicono che è diverso. Avrei due domande. L'essenziale riguarda la differenza. E l'altro - questo intero concetto appartiene al test unitario? O test della scatola bianca? Grazie

Da ISTQB:

branch coverage is closely related to decision coverage and at 100% coverage they give exactly the same results. Decision coverage measures the coverage of conditional branches; branch coverage measures the coverage of both conditional and unconditional branches. The Syllabus uses decision coverage, as it is the source of the branches. Some coverage measurement tools may talk about branch coverage when they actually mean decision coverage. (c) ISTQB foundation book.

    
posta John V 25.01.2013 - 13:33
fonte

3 risposte

1

Il ramo è un percorso di esecuzione opzionale, mentre una decisione è il risultato di una combinazione di condizioni (ad esempio un'espressione booleana).

Quindi, ci può essere una decisione senza ramo. Ad esempio:

int fun(int a, int b){
   return (a > 5) && (b < 15);
 }

Nella funzione precedente, "(a > 5)" è una condizione, "(b < 15)" è un'altra condizione. "(a > 5)  & & (b < 15) "è una decisione e non esiste un ramo.

Quindi in questo esempio, la copertura decisionale verrà raggiunta con solo 2 test e la copertura della filiale sul codice sorgente raggiungerà il 100% con un singolo test.

La copertura delle filiali a livello di assembly richiederebbe gli stessi due test, ma la domanda diventa complicata se si scrive la funzione in questo modo:

int fun(int a, int b){
   return (a > 5) & (b < 15);
 }

C'è ancora una decisione booleana (calcolata con operazioni aritmetiche) e l'assembly non avrebbe rami.

Il manuale della Nasa sulla misurazione MCDC chiarisce questo tipo di differenze. link

    
risposta data 25.01.2013 - 21:27
fonte
6

Ecco il problema in poche parole:

if ((test1() || test2()) {
    invoke_some_latent_bug_only_if_test1_is_false;
}
else {
    do_something_benign;
}

Supponiamo di avere due casi di test:

  • test1() valuta true e
  • Sia test1() che test2() valutano a false .

Alcuni strumenti di copertura del codice produrranno una copertura del 100% poiché questi due casi di test determinano l'esecuzione di ogni affermazione. Il problema è che ogni percorso non è stato testato. Questo codice richiede tre casi di test, uno in più per il caso in cui test1() valuta false ma test2() valuta true .

In questo esempio ipotetico, quel terzo caso di test critico potrebbe esporre quel bug latente. Se non si fornisce il terzo caso e si utilizza uno strumento di copertura basato esclusivamente sulle esecuzioni di dichiarazioni, si avrà la falsa sensazione che il test sia completo.

    
risposta data 25.01.2013 - 17:59
fonte
0

Se pensi al tuo programma come un grande grafo diretto con un nodo di partenza che va a uno o più nodi finali. Ogni affermazione nel tuo programma è un nodo sul grafico, i rami o le decisioni sono spigoli tra i nodi.

La copertura completa delle dichiarazioni è quando si visita ogni nodo nel grafico almeno una volta, copertura totale / copertura decisionale è quando attraversi ogni arco del grafico almeno una volta (e penso che siano la stessa cosa).

Nessuna di queste è necessariamente la stessa copertura del percorso completo, quando attraversi ogni percorso dal nodo iniziale a ogni nodo finale.

Come per qualsiasi terminologia, non vi è alcuna garanzia che tutti intendano esattamente la stessa cosa con lo stesso termine. Wikipedia sembra prendere la copertura delle filiali per indicare copertura decisionale modificata ma ci sono abbondante di altro fonti , come si nota, che dicono di essere il stesso. Quello che possiamo dire con più autorevolezza è che la copertura delle dichiarazioni non è la stessa della copertura delle filiali, e nemmeno la copertura del percorso.

Se hai bisogno di utilizzare questi termini, la soluzione migliore è definire che cosa tu intendi per loro prima di utilizzarli.

Per il punto 2. Le metriche di copertura possono essere utilizzate su qualsiasi forma di test, è certamente abbastanza comune utilizzarlo sui test unitari e sui test automatici di integrazione / sistema

    
risposta data 25.01.2013 - 14:00
fonte

Leggi altre domande sui tag