2015-11-05 7 views
5

Die Problemstellung istTestfall für 100% Verzweigungsabdeckung ohne Fehler?

Ein Verfahren, das einen Null-Fehler hat, dass Sie eine Testsuite, dass schreiben hat 100 Anweisungsüberdeckung%, aber nicht den Fehler und eine weitere Testsuite finden, die 100% Zweigüberdeckung hat, dass enthüllt den Fehler?

Hier ist die Methode, die ich für die gleiche

schrieb
public faultyMethod1(int x, int y) { 
    int X =x; 
    int Y = y; 

    if (Y !=0){ 
    Z = X/Y; 
    } else { 
    System.out.println("Sorry. That's an DiviDeByZeroException"); 
    } 
} 

faultyMethod1 (1,2); 
faultyMethod1 (2,0); 

Der obige Code-Testsuite zu erreichen, die zu 100% Zweigüberdeckung hat, der den Fehler macht offenbaren“

Was Testsuite das hat 100% Anweisungsüberdeckung findet sie jedoch nicht den Fehler?

+2

Wo ist der Fehler? (Außerdem wird 'Z' nie deklariert und nie benutzt.) – 5gon12eder

+0

das ist nur ein Pseudo-Code :-) Der Fehler ist x/y. welches Division durch Null werfen kann. –

+2

Aber du hast einen Haken dafür. Der Code wird niemals durch Null geteilt. – 5gon12eder

Antwort

5

Lassen Sie uns ein anderes Beispiel machen ...

// The method, according to our imaginary specification, should do: 
// return x * y, IF x is less than 2 
// return x + y, in any other case 
public int doSomething(int x, int y) { 

if (x < 2) { 
    return x * x; // this is our bug, it SHOULD be x * y 
} 

return x + y; 

} 

Nun stell dir vor, wir haben zwei Tests:

assertEquals(0, doSomething(0, 12)); // works, as 0 * 0 == 0 * 12 
assertEquals(20, doSomething(10, 10)); // works fine 

So, jetzt haben wir 100% Testabdeckung (weil der x < 2 Zweig abgedeckt worden ist, sowie die andere). Aber wir haben den Fehler nicht gefunden, da die Verwendung von Null als Wert für x ihn verbirgt (da 0 * etwas immer 0 ist, ist y irrelevant). Wir hätten so etwas brauchen ...

assertEquals(12, doSomething(1, 12)); // fails, because it will be 1*1 == 1 

Das gleiche Problem kann für jede andere Situation auftreten, einschließlich einer Division durch Null. Ich kann mir kein gutes Beispiel vorstellen, aber ich schätze, Sie bekommen die grundlegende Idee, dass 100% ige Abdeckung nicht bedeutet, 100% aller Fehler zu finden. (Ein cooler Weg, sie zu finden, wäre Mutationstest, aber das ist ein ziemlich fortgeschrittenes Thema.)

+0

Während dieses Beispiel tatsächlich einen Fehler zeigt, der nicht von einer Testsuite mit voller Aussageabdeckung erfasst wird, beantwortet er die Frage nicht direkt, da die minderwertige Testsuite auch eine vollständige Zweigstellenabdeckung aufweist. – 5gon12eder

+0

Sorry, bekomme den Punkt nicht, das Beispiel hat auch volle Filialabdeckung wie jede, wenn Möglichkeit (es gibt nur eine) durchlaufen wird ...? –

+0

Ja, und das ist der Punkt. Es ist kein Beispiel für eine Testsuite mit vollständiger Aussageabdeckung, aber unvollständiger Zweigstellenabdeckung, die einen Fehler verfehlt, der gefunden worden wäre, wenn die Zweigstellenabdeckung abgeschlossen wäre. Es war mein (möglicherweise falsches) Verständnis für die Frage, dass ein solches Beispiel gesucht wurde. – 5gon12eder

1

Wie wäre es mit einem logischen UND mit einem ODER zu verwechseln?

Die folgenden Testeingänge erreichen eine 100% ige Aussageabdeckung und enthüllen den Fehler nicht.

assert foo("everything is fine", 6) == 3; // happy path, ok 
assert foo(null, 0) == -1;     // error path, ok 

Die Testsuite nicht folg Zweig-Abdeckung hat jedoch, weil die beiden Ausdrücke ODER-Verknüpfung zusammen auf den gleichen Wert in jedem Fall zu bewerten. Das Hinzufügen der folgenden zwei Testfälle vervollständigt die Zweigabdeckung und macht den Fehler verfügbar.

assert foo("bingo", 0) == -1; // ArithmeticException 
assert foo(null, 4) == -1;  // NullPointerException 

als eine Angelegenheit der Tatsache, erreichen diese vier Eingänge zusammen auch Pfadüberdeckung, die eine noch stärkere Forderung als Zweigüberdeckung ist.