Hallo,
ich beschäftige mich gerade mit dem Testen von Software und brauche eine Aussage über die Signifikanz eines Tests. Da ich aber leider mit der Statistik auf Kriegsfuß stehe, trau ich meinen eigenen Ansätzen nicht wirklich über den Weg.
Problem:
Wenn z.B. in einem Formular (6 Felder) eine Eingabe FALSE ist, soll das Ergebnis auch FALSE sein. Nur wenn alle Eingaben TRUE sind, ist das Ergibnis TRUE. Daraus folgt: 2^6 mögliche TRUE/FALSE Kombinationen.
Der Testdurchlauf mit einer FALSE-Eingabe und einmal alles TRUE, ist also die mindeste realistische Testmenge.
Ab dem 8ten Durchlauf sind dann immer zwei Eingaben FALSE. Das würde in der Realität heißen, dass sich die Fehler in der Programmierung gegenseitig aufheben, wäre das Ergebnis TRUE. Die Wahrscheinlichkeit, dass man so schlampig programmiert sei sehr gering (Beispielsweise 2 Prozent).
Meine Frage: Wie schaut es mit dem Grenzzuwachs des Testergebnisses bei jedem folgenden Durchlauf aus? Oder anders: Welche Aussage (in Bezug auf das Gesamtergebnis) haben die Tests ab dem 8ten Durchlauf, wenn der Durchlauf mit ALLES TRUE und 6 mal ein Imput FALSE mit immer richtigem Ergebnis durchgeführt wurden.
Ich hoffe, dass ist verständlich beschrieben. Bin um jede Hilfe dankbar, Jakob Fischer
Problem:
Wenn z.B. in einem Formular (6 Felder) eine Eingabe FALSE ist,
soll das Ergebnis auch FALSE sein. Nur wenn alle Eingaben TRUE
sind, ist das Ergibnis TRUE. Daraus folgt: 2^6 mögliche
TRUE/FALSE Kombinationen.
Ja.
Der Testdurchlauf mit einer FALSE-Eingabe und einmal alles
TRUE, ist also die mindeste realistische Testmenge.
Ja.
Ab dem 8ten Durchlauf sind dann immer zwei Eingaben FALSE. Das
würde in der Realität heißen, dass sich die Fehler in der
Programmierung gegenseitig aufheben, wäre das Ergebnis TRUE.
Fehler im Programm multiplizieren sich gerne
Ausserdem kann man ja wohl eine Abfrage implementieren, die rigoros auf TRUE/FALSE prüft. Und selbst wenn ein Programm fehlerfrei läuft, muss es noch lange nicht im Sinne des Benutzers arbeiten…
Ausserdem: warum sollen zwei FALSE Eingaben erst ab der 8. Stelle Ärger machen ?
Hallo,
ich hab mich wohl undeutlich ausgedrückt. Mir geht es nicht um die Programmierung diese Problems. Ich brauche eine statistische Aussage über die Wahrscheinlichkeit, dass sich zwei fehler gegenseitig aufheben. Ab dem 8 ten Durchlauf sind das erste mal 2 -eingaben FALSE. Wäre das Ergebnis TRUE, müssten die sich exakt gegenseitig aufheben. Das ist aber eher unwahrscheinlich. So ein Test hat also im Bezug auf das Gesamtergebnis des Tests (man gebe alle 2^6 Kombinationen einmal ein) weniger Aussagekraft. Weniger wirds mit drei oder vier mal FALSE-Eingabe. Wäre das Ergebnis trotzdem TRUE müssten sich drei oder vier Programmierfehler exakt aufheben.
Ich denke man kann das mit abhängigen Wahrscheinlichkeiten ausdrücken, ich weiss aber nicht mehr.
ich beschäftige mich gerade mit dem Testen von Software und
brauche eine Aussage über die Signifikanz eines Tests. Da ich
aber leider mit der Statistik auf Kriegsfuß stehe, trau ich
meinen eigenen Ansätzen nicht wirklich über den Weg.
Das Problem ist bei solchen Tests, dass man keine Aussage machen kann, wenn man den Aufbau des Automaten nicht kennt.
Dein Test funktioniert, wenn das Problem kombinatorisch gelöst wurde:
X = A && B && C && D && E && F;
In disem Fall hat die CPU 100% des Codes abgearbeitet, zumindest bezogen auf den Source.
folgene Lösung ist aber auch denkbar:
Y = A\*1 + B\*2 + C\*4 + D\*8 + E\*16 + F\*32;
switch( Y)
{
case 0: X = FALSE; berak;
case 1: X = FALSE; berak;
.
.
.
case 62: X = FALSE; berak;
case 63: X = TRUE; berak;
}
Wenn du deine 8 Varienten getestet hast, wurden 7/8 des Codes NICHT getestet. Es können also noch 56+1 (die erste Zeile kann auch noch fehlerhaft sein) fehlerhafte Codezeilen vorhanden sein, welche dein Test nicht erfasst.
wie wahrscheinlich es ist, dass du fehlerhaft programmiert hast, wenn du eine bestimmte Anzahl von Testdurchläufen durchgeführt hast, die immer das richtige Ergebnis (TRUE nur, wenn keine FALSE-Eingabe vorkommt) liefern? Und/oder
wie viele Tests du durchführen musst, um mit hoher Wahrscheinlichkeit, z.B. 99,9%, davon ausgehen zu können, dass du keine Fehler programmiert hast?
Bevor ich mich intensiver damit beschäftige, wüsste ich gerne, ob ich dein Problem auch verstanden habe.
danke, ich versuchs nochmal besser zu erklären. Es geht um einen Black-Box Test einer Anwendung. Es geht NICHT um Programmierung. ich kenne den Code nicht und das ist auch so gewollt. Ich teste Programme von der User Seite aus.
Ein Ansatz, um den es hier geht, ist es, bei einem Formular, mit z.B. 6 Feldern die fehlerfreie Funktion zu testen. Nur wenn alle Felder fehlerfrei ausgefüllt wurden, darf das Formular angenommen werden. Beispielsweise sind nur positive Zahlen erlaubt. Wenn ich der Einfachkeit halber einfach mal sage ich habe nur die mögliche Falscheingabe „negative zahl“ (vergessen wir 0) habe ich 2^6 Möglichkeiten falsche und richtige Eingaben zu kombinieren, wobei nur bei „alle eingaben richtig“ das ergebnis „Formular angenommen“ sein darf.
Also ich fange an zu testen: erst mal alle eingaben positiv (also TRUE) und es funktioniert. Die Theorie sagt jetzt, gehe alle kombinationen durch. Also habe ich die nächsten 6 Fälle, bei denen jeweils einen Eingabe FALSE (negativ) ist. Das erwartete Ergebnis muss dann also auch „Nicht angenommen sein“.
Das macht ja noch Sinn. denn dann wäre Codeseitig alles normal programmiert.
Wie gesagt, geht die Theorie so weit, zu sagen, dass man alle Kombinationen Testen soll.
Als nächstes sind also jeweils zwei Eingaben negativ. Wenn alle vorigen Tests gut gelaufen sind, (eine Eingabe falsch -> abgelehnt) müsste der zweite False-Eintrag den ersten aufheben, um das Ergebnis des Durchlaufs auf „Formular angenommen“ zu setzten. Dies ist aber programmiertechnisch sehr unwahrscheinlich.
Wären alle 2^6 Fälle gleich wahrscheinlich, verhält sich mein Informationszuwachs linear. Wenn ich aber richtig liege nimmt der streng monoton ab,(erst müssten sich zwei Fehler genau aufheben, dann drei Fehler aufheben… obwohl im ersten durchlauf das alleinige Auftreten des Fehlers schon zu " Formular abgeleht " geführt hat). Wie kann ich dieses Verhalten mathematisch berechnen. Der Grenzinformationszuwachs muss pro durchlauf also abnehmen.
Sinn ist es, eine Aussage zu treffen, ob diese Theorie überhaupt Sinn macht.
Ich hoffe ich habs geschafft das Problem zu erklären…
Gruß jakob
dass es nicht um Programmierung geht, war mir klar.
Wenn du alle möglichen Kombinationen testest, dann wirst du einen Fehler - so vorhanden - mit Sicherheit entdecken. Ob das Vorgehen wirtschaftlich sinnvoll ist, kannst nur du entscheiden. Danach kennst du allerdings die Anzahl der Fehler mit Sicherheit, also hat das nichts mehr mit Wahrscheinlichkeiten zu tun. De facto hast du im Übrigen einen oder mehrere Fehler drin oder eben nicht; die „Wahrscheinlichkeit“ für einen Fehler in einem existierenden Programm (statistisch gesehen: einer Realisation einer Zufallsvariablen „Programm“) ist also nur deine mehr oder weniger subjektive Beurteilung des Programmierers. Wenn du gar nicht testest, ist deine „Wahrscheinlichkeit“ für einen Fehler irgendwo zwischen x > 0 und 1; wenn du alles testest, liegt sie bei 0.
Wenn du postulierst, dass die „Grenzinformation“ abnimmt, dann unterstellst du, dass Fehler der Art „drei Fehler heben sich gegenseitig auf“ weniger wahrscheinlich sind als solche der Art „zwei Fehler heben sich gegenseitig auf“ und diese wiederum weniger wahrscheinlich als solche der Art „eine einzige Falscheingabe bewirkt ein Gesamtergebnis TRUE“. Wenn du das nicht a priori weißt, ist es rationaler anzunehmen, dass alle Fehlerarten gleich wahrscheinlich sind.
OHNE Test hast du jeweils eine a priori Wahrscheinlichkeit dafür, dass in einer Konstellation der Art „keine FALSE-Eingabe“, „eine FALSE-Eingabe“ usw. ein Fehler drin ist. Wenn ich dich richtig verstehe, bewertest du dies unterschiedlich, d.h. z.B. mit 0.05, 0.04, 0.03 usw. Aber mit jedem Durchlauf, den du durchführst und der korrekt ist, reduziert sich diese Wahrscheinlichkeit auf eine a posteriori Wahrscheinlichkeit, und diese Reduktion kann man berechnen. Wenn deine a priori Wahrscheinlichkeiten nicht gleich sind, dann hast du den Fall abnehmender Grenzinformation. Wenn du die Konstellationen unterscheidest, dann verläuft die Kurve deiner Grenzinformation hingegen U-förmig, denn mit dem 1. Test in der Konstellation „ein FALSE“ gewinnst du 1/6 Info über diese Gruppe (da es sechs solcher Konstellationen gibt), mit jedem Test in der Konstellation „zwei FALSE“ jedoch nur 1/15 Info, bei „drei FALSE“ sind es pro Test 1/20, bei „vier FALSE“ wieder 1/15 und bei „fünf FALSE“ wieder 1/6.
Ist das eigentlich mehr als eine theoretische Überlegung? Praktisch gesehen, würde ich mir nämlich einfach eine gewünschte Sicherheit vorgeben und dann die Stichprobe der benötigten Tests festlegen.
Vielen Dank für diese ausfürliche Darlegung,
auf Deine Frage: Ja es ist mehr als eine rein theoretische Frage. In meinem Metier, der Wirtschaftsinformatik, gibt es (erfahrungsbedingt) einen Haufen Leute, welche gerne irgendwelche Metriken wollen und (ich unterstelle) oft weniger den Ihnalt solcher Aussagen verstehen, als die Zahlen zu lieben. Also z.B. nehme ich einfach nach der mir beigebrachten Regel z.B. eine t-Verteilung an. Verstehen warum, tu ich aber nicht wirklich; Leider.
Das Problem bleibt aber: Ich weiss, dass unter bestimmten Umständen (Art der Programmierung) die Wahrscheinlichkeiten pro Durchlauf nicht gleich bleiben (am Mitzählern bin ich schon, aber ich brauch noch mehr Beispiele um das belegen zu können). Leider kann ich die Leute nur überzeugen, wenn ich Zahlen liefere. (Über den Sachverhalt machen viele sich leidder dann in dem speziellen Fall aber keine Gendanken, Zahlen sind geil). Nun sind wir da bei meiner Schwäche. Im Eingangspost habe ich auf meinen Statistik-Kriegsfuß verwiesen. Deshalb habe ich gefragt. Auf der anderen Seite kann man unter der Annahme verschiedener Wahrscheinlichkeiten pro Gruppe, die Tests begrenzen,und nen Haufen Zeit sparen.
Dein Praktischer Ansatz stimmt an sich. In der Praxis habe ich allerdings noch das Problem, ich kann die Stichprobenqualität nicht bestimmen. Das geht nur nach Gefühl. Ich schau mir sog. Coding-Stile an, generelles QM der Entwickler, ein Beispielproblem…
Da all dies ziemlich schwammig ist, versuche ich die Sachverhalte einfach besser zu verstehen; einfach um schlauer zu werden. Deshalb frage ich.
Ich wäre Dir dankbar, könntest Du mir noch die Vorschrift posten, welche du auf das Problem anwendest. Leider ist mir auch nicht ganz klar, warum der Infozuwachs sich wie ein U verhält; oder ist das U nach rechts weiter offen? Ein Stichwort, nach welchem ich suchen muss um das Problem zu begreifen wäre auch super.