2009-06-18 7 views
1

Ich habe auf meinem Computer C++ Test nur mit UnitTest Lizenz (nur Unit Test Lizenz) als Visual Studio 2005 Plugin (cpptest_7.2.11.35_win32_vs2005_plugin.exe) installiert.Code Coverage Prozentsatz nicht gut

Ich habe eine Probe ähnlich der folgenden:

bool MyFunction(... parameters...) 
{ 
    bool bRet = true; 

     // do something 
    if(some_condition) 
    { 
     // do something 
     bRet = CallToAFunctionThatCanReturnBothTrueAndFalse.... 
    } 
    else 
    { 
     bRet = false; 
     // do something 
    } 

    if(bRet == false) 
    { 
     // do something 
    } 

    return bRet; 
} 

In meinem Fall nach dem Coverage Tool läuft ich die folgenden Ergebnisse haben (für eine ähnliche Funktion wie die zuvor erwähnt):

[LC=100 BC=100 PC=75 DC=100 SCC=100 MCDC=50 (%)] 

Ich verstehe wirklich nicht, warum ich bei PathCoverage (PC) keine 100% ige Abdeckung habe. Auch wenn jemand, der Erfahrung mit C++ Test hat, Parasoft die geringe MCDC-Abdeckung für mich erklären könnte, wäre das großartig.

Was soll ich tun, um die Abdeckung zu erhöhen? weil mir in diesem Fall die Ideen ausgehen. Wegbeschreibung zu (einigen Teilen) der Dokumentation sind willkommen.

Danke,

Iulian

+0

Ich sehe 4 Pfade durch Ihren Code. Aber ein Pfad ist nicht möglich (ich bin sicher, dass das Testwerkzeug das nicht sehen kann). Wie viele hast du getestet? –

Antwort

2

Dies ist eine gute Referenz auf die verschiedenen Arten der Codeabdeckung: http://www.bullseye.com/coverage.html.

MCDC: Um die MCDC-Abdeckung zu verbessern, müssen Sie sich,ansehen. Angenommen, es handelt sich um einen komplexen booleschen Ausdruck, müssen Sie prüfen, ob Sie die erforderlichen Wertekombinationen verwenden. Insbesondere muss jeder boolesche Unterausdruck wahr und falsch ausgeführt werden.

Pfad: Eines der Dinge, die in der obigen Verbindung als Nachteil der Pfadabdeckung erwähnt werden, ist, dass viele Pfade unmöglich zu trainieren sind. Das mag bei deinem Beispiel der Fall sein.

+1

Ich denke, dass http://www.bullseye.com/coverage.html#basic_path ein gutes Beispiel dafür ist, was PathCoverage (PC) bedeutet. Das bedeutet, dass der C++ Test die "unmöglichen" Fälle nicht beseitigt. – INS

3

Ich kann nicht mit dem speziellen Werkzeug helfen Sie verwenden, aber die allgemeine Idee mit Pfadüberdeckung ist, dass jeder mögliche Weg durch den Code ausgeführt werden soll.

Wenn Sie ein Flussdiagramm durch das Programm zeichnen, Verzweigung bei jedem if/break/continue, etc. sollten Sie sehen, welche Pfade Ihre Tests durch das Programm nehmen. Um 100% zu erhalten (was nicht unbedingt notwendig ist, noch einen perfekten Test gewährleistet), muss Ihr Test jeden Zweig des Codes durchlaufen und jede Zeile ausführen.

Hoffe, dass hilft.

+1

Ich weiß, was Sie sagen, aber meine Vermutung ist, dass C++ Test einige Fälle nicht beseitigt, die nicht möglich sind. Zum Beispiel können Sie den "else" -Teil nicht ausführen, ohne das letzte "if" auszuführen. Wahrscheinlich wird dieser Fall nicht von C++ Test aus der Liste der Möglichkeiten entfernt. – INS

+0

@Iulian: Ich denke, Sie beantworten Ihre eigene Frage in diesem Kommentar. –

1

Sie benötigen mindestens zwei Testfälle, um eine 100% ige Abdeckung zu erhalten. Einer, wo some_condition wahr ist und einer, wo es nicht ist. Wenn Sie das haben, sollten Sie 100% ige Abdeckung erhalten.

Obwohl Sie 100% Abdeckung als perfekt sehen sollten. Sie würden in diesem Fall 3 Tests benötigen, damit alle Kombinationen getestet werden können. Sehen Sie sich die zyklomatische Komplexität an, um mehr darüber zu erfahren.

+0

Ich habe alle möglichen Testfälle gemacht. Die Line-Coverage (LC) und die Block-Coverage (BC), der Decision Coverage (DC) - Simple Condition-Converage (SCC) ist 100%, wie Sie sehen können. Das einzige Problem ist Path Coverage (PC) und MCDC (Modified Condition, Decision Coverage) sind nicht 100%, obwohl ich alle Fälle getestet habe. Deshalb denke ich, dass dies irgendwie eine Art Bug von C++ Test ist. – INS

+1

@Iulian: Nein. Ich denke, es ist das, was du in dem anderen Kommentar gesagt hast. –

1

Es gibt vier hypothetische Pfade durch diese Funktion. Jede if-Klausel verdoppelt die Anzahl der Pfade. Jede if-Anweisung ist ein Zweig, in dem Sie zwei verschiedene Wege gehen können. Wann immer Ihr Tool auf ein "if" stößt, wird angenommen, dass der Code entweder den Zweig "true" oder den Zweig "false" annehmen kann. Dies ist jedoch nicht immer möglich.Betrachte:

bool x = true; 
if (x) { 
    do_something(); 
} 

Der "falsche" Zweig der if-Anweisung ist nicht erreichbar. Dies ist ein offensichtliches Beispiel, aber wenn Sie mehrere if-Anweisungen berücksichtigen, wird es immer schwieriger zu erkennen, ob ein Pfad möglich ist oder nicht.

Es gibt nur drei mögliche Pfade in Ihrem Code. Der Pfad, der den Zweig "false" in der ersten if-Anweisung und den Zweig "true" in der zweiten if-Anweisung übernimmt, ist nicht erreichbar.

Ihr Werkzeug ist nicht schlau genug, das zu erkennen.

Das heißt, selbst wenn das Werkzeug perfekt ist, ist es in einer realen Anwendung wahrscheinlich unwahrscheinlich, eine 100% ige Pfadabdeckung zu erhalten. Eine sehr niedrige Pfadabdeckung ist jedoch ein sicheres Anzeichen dafür, dass Ihre Methode eine zu hohe zyklomatische Komplexität aufweist.

+0

Wenn es vier theoretische Pfade durch diese Funktion gibt, dann ist Ihre Theorie falsch. Welchen Theorembeweiser benutzen Sie? –

+0

Das obige ist eine Annahme. Ich bin nicht vertraut mit C++ Test, es tut mir leid zu sagen. – waxwing

+0

@Pete Kirkham Es gibt 4 theoretische Pfade (in meiner Beispielfunktion), und nur 3 von ihnen sind möglich. Weitere Informationen zur Abdeckung finden Sie unter dem Link von Pete TerMaat. – INS

0

Ich persönlich denke, es schlechte Form irgendeine Funktion mit

Bool retCode = true zu beginnen;

Sie machen eine explizite Annahme, dass es standardmäßig erfolgreich ist und dann unter bestimmten Bedingungen fehlschlägt.

Programmierer, die nach Ihnen kommen, werden diese Annahme nicht machen.

Fail schnell, früh ausfallen.

Und wie andere gesagt haben, wenn Sie Fehlerfälle testen möchten, müssen Sie Tests testen, die fehlschlagen.

+0

Nicht im Zusammenhang mit dieser Frage, aber es ist eine gute Sichtweise. BTW Ich bin nur Unit-Test bestehenden Code, der nicht geändert werden kann, während Tests geschrieben werden. – INS