Software testen (einfache Bedingungsüberdeckung)
-
Hio!
Ich habe mal eine Frage zum Testen von Software, konkret zum "Einfachen Bedingungsüberdeckungstest". Hier werden alle atomaren Prädikate einer Formel min. einmal zu "true" und einmal zu "false" ausgewertet. Nun fiel mir folgendes Beispiel ein:
if (X && Y) { foo1(); if (Z) foo2(); } if (X || Y) foo3();
mit den Testfällen:
- Y = true, X = Z = false
- Y = false, X = Z = trueNun ist hier die Frage: Werden die Prädikate vollständig unabhängig voneinander betrachtet oder muss man im gewissen Sinne auf den Kontrollfluss achten? Meiner Meinung nach, werden die Prädikate vollständig unabhängig voneinander ausgewertet.
In diesem Beispiel wird damit die Zeile "if (Z) foo2());" nie erreicht und damit wird das Prädikat "Z" im gesamten Programm niemals ausgewertet. Wenn man die einzelnen IF-Abfragen jedoch getrennt betrachtet, wird "Z" einmal zu "true" und einmal zu "false" ausgewertet,also besteht das Programm mit den obrigen Testfällen die einfache Bedingungsüberdeckung oder?Gruß
Pille456
-
Ich habe zwar kein Wort verstanden, aber falls das eine Programmiersprache sein soll, die sich in etwa so wie eine C-artige Sprache verhält, dann wird foo2() in Testfall 2 nicht ausgeführt.
foo2() wird also dann und nur dann ausgeführt, wenn X, Y und Z erfüllt sind.
-
Das soll C-artiger Pseudo-Code sein, wobei ein Prädikat eine einfache (elementare) logische Anweisung ist, die nicht mit weiteren logischen Operatoren verknüpft ist.
Bsp (in C-Code)
//... int i = 0; int j = 10; if (i > -5 || j < 10) { foo(); }
In diesem Fall wäre "i > -5" und "j < 10" jeweils ein Prädikat, verkürzt also:
if (X || Y) { foo(); }
Das Beispiel habe ich so konstruiert, dass foo2() eben in keinem Testfall ausgeführt wird
Das ist ja gerade meine Frage ob das immernoch ein gültiger "einfacher Bedingungsüberdeckungstest" ist.
-
Ok, dann sollte
cooky451 schrieb:
foo2() wird also dann und nur dann ausgeführt, wenn X, Y und Z erfüllt sind.
die Frage ja eigentlich beantworten.
-
Hm ja ne...
Es geht nicht darum, welche Funktionen ausgeführt werden und welche nicht, sondern konkret darum, wie überhaupt getestet werden soll.
Es gibt ja ziemlich viele Testarten (Anweisungsüberdeckung, Zweigüberdeckung ...), die alle einen anderen Ansatz haben und ich verstehe gerade nicht 100%ig, was man bei der "Einfacher Bedingungsüberdeckung" machen soll.Wahrscheinlich sind die meisten User hier zu praxisorientiert, in der Uni darf ich mich jedoch damit noch rumschlagen. Daher versuche ich das mal etwas anders zu formulieren:
Beim "Einfachen Bedingungsüberdeckungstest" muss jedes atomare Prädikat im Programm einmal zu true und einmal zu false ausgewertet werden. Soweit so einfach, prinzipiell würde ich damit in jedem Programm mit 2 Testfällen hinkommen um diesen Test erfolgreich durchzuführen (jetzt mal fieße Schleifenkonstrukte mit Zählern und so vor weg gelassen).
Alle Beispiele die ich finde, zeigen wie man einen Testfall für eine einfache IF-Abfrage konstruiert, die jedoch aufjedenfall ausgewertet wird.
In meinem Beispiel wird Z nun wie gefordert 1x auf true und 1x auf false gesetzt.Der Compiler jedoch würde davon nichts mitbekommen bzw. würde diese Auswertung zu true/false gar nicht erst vornehmen, da er dort beim parsen niemals ankommt.
Also würde Z zu true/false ausgewertet werden, falls der Compiler überhaupt dahin käme, was er aber nicht tut.
Ist das dann immernoch ein gültier "Einfacher Bedingungsüberdeckungstest" oder nicht?
-
Ach so ok, ich glaube (hoffe) jetzt habe ich die Frage verstanden.
Pille456 schrieb:
Wahrscheinlich sind die meisten User hier zu praxisorientiert, in der Uni darf ich mich jedoch damit noch rumschlagen.
Nein, das liegt an mir, ich bin nur ein armer kleiner Schüler, der mal studieren möchte.
Also wenn ich mir den Wikipedia Artikel angucke:
http://de.wikipedia.org/wiki/BedingungsüberdeckungstestDann wird im ersten Beispiel:
bool a, b; if (a || b) { .. }
Ja schon ein Beispiel gegeben, das ein Einfachbedingungsüberdeckungstest ist, bei dem man bei dem Kombinationen a = true, b = false und a = false, b = true auch das gleiche Ergebnis hätte. Daher würde ich mal sagen, dass auch dein Beispiel ein gültiger Einfachbedingungsüberdeckungstest ist.
Dazu kommt auch noch: http://de.wikipedia.org/wiki/Dynamisches_Software-Testverfahren#Einfacher_Bedingungs.C3.BCberdeckungstest_.28C2_-Test.29
Was dem nicht widersprechen würde.
-
Ja, genauso habe ich mir das auch gedacht. Ich dachte jemand wüsste das auf Anhieb, dass das genauso auch richtig ist. Weil intelligent Raten in einer Klausur halt immer so ne Sache ist
Aber danke für die Bestätigung
Falls jemand sich sicher ist, dass mein Beispiel richtig oder falsch ist, darf er mir aber ruhig noch einen Tipp geben
-
Hm. Bei weiterer Überlegung stellt sich die Frage, was atomare Prädikate sind. Sind das Aussage (X, Y, Z) oder Bedingungen (if())? Denn sind es Bedingungen, klingt die Forderung, dass für einen gültigen Test alles ein Mal mit wahr und ein Mal mit falsch ausgewertet werden muss gleich ganz anders. Dann ist das kein gültiger Test mehr, da if(Z) ja nie true war.
Hier wird sogar ein Test konstruiert, bei dem weder alle Bedingungen, noch alle Aussagen ein Mal wahr bzw. falsch waren. Jetzt bin ich total verwirrt. Bitte komme jemand mit Ahnung und kläre das.
Edit:
Aha, deine Erklärung ist doch verständlich. if(Z) ist also das Prädikat. Es wurde nie zu true ausgewertet, damit ist der Test ungültig. Jetzt dürfte alles Sinn machen.
Der Test oben macht jetzt auch Sinn, da (Y = 0), (X > 1), (X = 3) und (Z > 1) mindestens ein Mal wahr bzw. falsch waren.
-
Wenn Du Schüler bist fehlen Dir jetzt hier wahrscheinlich die Grundlagen in Aussagenlogik...
Im Sinne der Aussagenlogik ist ein atomares Prädikat ein atomare Aussage, die man nicht weiter verkleinern kann, ganz unabhängig von den IF-Bedingungen.Eine IF-Bedingung sagt nur dem Compiler, dass er hier was überprüfen soll, aber hat ja nichts mit der darunterliegenden Mathematik zu tun. Damit das Testen jedoch einheitlich bzw. von der Programmiersprache/System etc. möglichst unabhängig ist, betrachtet man eben die mathematische Struktur des Programms.
Beispiel:
"if (i > 5 && j < 10)" wäre eine gültige IF-Anweisung (ohne Rumpf) in C. In Pascal würde das ja dann z.B. so aussehen "IF i > 5 AND j < 10 THEN". Egal wie die IF-Anweisung nun genau formuliert ist - für das Programm ist nur die Aussage "i > 5 UND j < 10" wichtig.
Hierbei ist UND (genau wie OR,XOR etc) ein logischer Operator.Man kann dann (induktiv) definieren, dass alles das eine logische Aussage ist, was aus elementaren Aussagen und den logischen Operatoren besteht. Etwas einfacher heißt das:
Wenn man (syntaktisch Korrekt) elementare Aussagen wie <,>,== mit &&(AND),|| etc zusammenpackt, sind das immernoch logische Aussagen. Das was in den Klammenr vom IF steht ist dann die gesamten logische Aussage (man darf ja &&, || etc alles verwenden!). Die Prädikate sind aber nur die elementaren Aussagen innerhalb der gesamten logischen Aussage.Beispiel:
if ((i > 5 && j < 10) || k == 5). Hier ist (i > 5 && j < 10) || k == 5 die logische Aussage mit drei atomaren Prädikaten/Aussagen i>5,j<10,k==5
if (i > 5): Hier ist die Aussage (i > 5) gleichzeitig auch das einzige Prädikat.
Es geht nun bei dem Test darum, dass man jedes Prädikat identifiziert und die Eingaben so bestimmt, dass es jeweils 1x zu TRUE und 1x zu FALSE ausgewertet wird und genau das passiert auch in dem Link von Dir. Der Trick ist ja gerade, dass man nicht die gesamte logische Aussage betrachtet, sondern nur Teilaussagen. Dadurch wird der Test einfacher bzw. die Testmengen überschaubarer. Im Gegenzug dazu bekommt man schnell Probleme bei zusammengesetzten logischen Aussagen wo ein OR/AND etc vorkommt.
Nun wird in meinem Beispiel das Prädikat im konkreten Programm gar nicht ausgewertet. Nun stellt sich die Frage, wie man das bewerten soll (konkretes Programm vs. math. Struktur). Im englischen Sprachraum habe ich eine Formulierung gefunden, die besagt, dass die Prädikate unabhängig voneinander ausgewertet werden und damit wäre mein Test korrekt. Zudem kommt, dass bei "echter Software" mit vielen tausend Zeilen Code es durchaus einfacher wäre alle Prädikate zu suchen, als den gesamten Kontrollfluss zu analysieren. Wenn ich das mache, dann kann ich auch gleich einen der weiterführenden Tests duchführen.
-
Danke für die Erklärung, aber siehe mein Edit oben.
Pille456 schrieb:
Im englischen Sprachraum habe ich eine Formulierung gefunden, die besagt, dass die Prädikate unabhängig voneinander ausgewertet werden und damit wäre mein Test korrekt. Zudem kommt, dass bei "echter Software" mit vielen tausend Zeilen Code es durchaus einfacher wäre alle Prädikate zu suchen, als den gesamten Kontrollfluss zu analysieren. Wenn ich das mache, dann kann ich auch gleich einen der weiterführenden Tests duchführen.
Diese Erklärung würde keinen Sinn machen, wenn alle atomaren Bedingungen unabhängig von der Programmstruktur getestet werden würden.
Auch hier wird von "not eval(uated?)" gesprochen.Zusammen mit der Forderung, dass jede Bedingung ein Mal wahr und ein Mal falsch sein muss, tendiere ich doch weiter sehr dazu zu behaupted, dass dein Test so nicht korrekt ist. Ach, ich hasse Sachen ohne verünftigen Wikipedia Artikel.