Kurs:Wirtschaftsinformatik SS09/SE1/Lernskript/Testen
Testen:
[Bearbeiten]Testing-Begriff
[Bearbeiten]- Software testing is the process of uncovering evidence of defects in software systems
- „Software testing is the process of uncovering evidence of defects in software systems.“ (McGregor, 2002)
- „Unter Testen versteht man den Prozess des Planens, der Vorbereitung und der Messung, mit dem Ziel, die Eigenschaften eines IT-Systems festzustellen und den Unterschied zwischen dem tatsächlichen und dem erforderlichen Zustand aufzuzeigen (Pol, 2000)
- Als Testen bezeichnen wir jede einzelne Ausführung des Testobjekts unter spezifizierten Bedingungen zum Zwecke des Überprüfens der Ergebnis im Hinblick auf gewisse gewünschte Eigenschaften
- Testen ist Kontrollfunktion im Software – Entwicklungsprozess, umfasst nicht
Fehlerkorrektur
- Durch Testen können Fehlerwirkungen aufgedeckt werden
- Debuggen ist die Tätigkeit des Lokalisierens und Behebens eines Fehlerzustands
Gründe für Testing
[Bearbeiten]- Kostenreduktion: je später Fehler erkannt, desto teurer Beseitigung
- Fehler führen zu Kundenunzufriedenheit
- Produkte benötigen bestimmte Qualität
- Entdeckte Fehler ermöglichen Analyse und Prozessverbesserung
Testziele
[Bearbeiten]Ziel des Testens ist es, Fehler zu entdecken. Somit ist ein Test erfolgreich, wenn mindestens ein Fehler entdeckt wurde.
Test Orakel:
[Bearbeiten]- Um einen Fehler erkennen zu können, benötigt man Soll – Ergebnisse
- Darf nicht das Programm sein, dass getestet wird
- Idealerweise sollten Test Orakel generiert werden
- Typischerweise sind Test Orakel jedoch Menschen
- Probleme: Auch Sollvorgaben können Fehler haben
- Regel: Weicht Ist – Wert vom Soll – Wert ab, so sollte zuerst geprüft werden, ob der Soll – Wert korrekt ist
Vorsicht: Auch Sollvorgaben können Fehler haben!
Klassifikation von Tests:
[Bearbeiten]- Laufversuch: Entwickler übersetzt und startet das Programm, Programm ist irgendwann ausführbar, Ergebnisse sind nicht offensichtlich falsch
- Wegwerf – Test: Programm ausgeführt, Daten werden eingegeben, in einigen Fällen
werden Fehler erkannt, Problem: Programm – Änderung, Nachvollziehbarkeit
- Systematischer Test: Ableitung von Testfällen aus der Spezifikation, Ausführung des
Programms, Vergleich von Ist – und Sollresultaten, Analyse der Resultate, Dokumentation der Testdaten und Ist – Situation
Fehlerbegriff
[Bearbeiten]- Fehler = Abweichung zwischen Ist – Zustand und erwartetem Soll – Zustand
- Zwei Abweichungskategorien
- Abweichung zur Spezifikation
- Abweichung zur Erwartung des Kunden (die aus Spez. nicht hervorgeht)
Fehlerkategorien
[Bearbeiten]- Wrong: Falsche Umsetzung eines Aspekts der Spezifikation
- Missing: Aspekt der Spezifikation nicht umgesetzt
- Extra „golden plate“: Aspekt in der Spezifikation nicht beschrieben Prinzipien
Vor- und Nachteile von Tests
[Bearbeiten]- Vorteile
- Objektives Prüfverfahren
- Reproduzierbarkeit von Tests
- Systemverhalten wird sichtbar gemacht
- Nachteile
- Ergebnisse oft überinterpretiert
- Nicht alle Softwareeigenschaften sind testbar
- Nicht alle Anwendungssituationen sind testbar
- keine Erkennung der Fehlerursachen
Test-Prinzipien
[Bearbeiten]- Testen erfordert Unabhängigkeit
- Entwickler sollten ihre Programme nicht selbst testen
- Qualität vs. Termindruck
- …
- Vollständiges Testen ist nicht möglich
- Vollständiges Testen ist nicht möglich
- Tests sind immer nur Stichproben
- Mit Testen kann man Fehler nur nachweisen – nicht deren Nichtexistenz
- Mit Testen kann man Fehler nur nachweisen nicht deren Nichtexistenz
beweisen
Teststrategien:
[Bearbeiten]- Top down (abstrakteste Komponente zuerst, dann konkretere Komponenten)
- Bottom up (atomare Komponenten zuerst, anschließend zusammengesetzte
Komponenten, zum Schluss Gesamtsystem)
- Thread (nur für Systeme mit mehreren parallelen Prozessen)
- Stress (Das System wird unter Extrembelastung getestet, (z.B. Funktionstest unter 100 % CPU-
Auslastung)
- Back – to back: Test von unterschiedlichen Systemversionen sowie Vergleich der Ergebnisse
Testarten:
[Bearbeiten]- Modultest (Isoliertes Testen einzelner Module, benötigt zusätzliche Software, kann
schon früh durchgeführt werden, gewährleistet, dass beim Integrationstest die Module korrekt sind
- Integrationstest (Testen des Zusammenspiels von Komponenten,testet das Zusammenspiel von Komponenten; stellt sicher, dass die Komponenten zusammenpassen und die gewünschte Funktionalität und Qualität erfüllen wird i.d.R. stufenweise durchgeführt)
- Systemtest (Testen der Systemfunktionalität, -benutzbarkeit und –qualität, Integration
mit externen Systemen)
- Akzeptanztest (akzeptiert Kunde das System, dabei werden oft
Missverständnisse bzw. in der Spezifikation fehlende Anforderungen aufgedeckt )
- Installationstest (Test des Systems in der Umgebung des Kunden, prüft korrekte
Interaktion mit anderen Systemen)
- Abnahmetest (beta test):(Endabnahme des Systems vom Kunden, Projekt abgeschlossen, wenn
Test bestanden)
Testtechniken:
[Bearbeiten]Die Unterscheidung in Black-Box-Test und White-Box-Test ist sehr verbreitet, allerdings wird die Metapher verschieden verstanden. Es gibt kein Kriterium, das eine eindeutige, vollständige und schlüssige Einordnung von Testtechniken erlaubt
- Gibt es einen Grey-Box-Test?
- Forderung nach einem No Box Test!
Spezifikationsbasierter Test (Black – Box – Test)
[Bearbeiten]- Ziel: umfassende Prüfung der spezifizierten Funktionalität / Qualität
- Motivation: es ist nicht zulässig ein Programm lediglich gegen sich selbst zu
testen
- Testfall – Auswahl aufgrund der Spezifikation
- Programmstruktur wird nicht betrachtet
- Sollwertbestimmung anhand von Spezifikation
- Nachteile: konkrete Implementierung wird nicht geeignet berücksichtigt, es
werden häufig nicht die Minimalanforderungen von White – Box – Tests erzielt
Quellcodebasierter Test (White – Box – Test)
[Bearbeiten]- Testfall – Auswahl aufgrund der Quellcodestruktur
- Sollwertbestimmung anhand von Spezifikation
- Testreferenz: Quellcode des Prüfobjekts
- Techniken: Kontrollflussbasiert, Datenflussbasiert
- Vorteil: formale Testauswahlkriterien definierbar, Techniken auch für
anforderungsbasierten Test einsetzbar
- Nachteil: Fehlende (in Spezifikation nicht beschriebene Funktionen) werden
nicht erkannt
Teststrategien:
[Bearbeiten]- Top down (abstrakteste Komponente zuerst, dann konkretere Komponenten)
- Bottom up (atomare Komponenten zuerst, anschließend zusammengesetzte
Komponenten, zum Schluss Gesamtsystem)
- Thread (nur für Systeme mit mehreren parallelen Prozessen)
- Stess (Das System wird unter Extrembelastung getestet)
- Back – to back: Test von unterschiedlichen Systemversionen sowie Vergleich der
Ergebnisse
Testarten:
[Bearbeiten]- Modultest (Isoliertes Testen einzelner Module, benötigt zusätzliche Software, kann
schon früh durchgeführt werden, gewährleistet korrekt funktionierende Module
- Integrationstest (Testen des Zusammenspiels von Komponenten, wird i.d.R.
stufenweise durchgeführt)
- Systemtest (Testen der Systemfunktionalität, -benutzbarkeit und –qualität, Integration
mit externen Systemen)
- Akzeptanztest (akzeptiert Kunde das System, dabei werden fehlende Anforderungen
aufgedeckt)
- Installationstest (Test des Systems in der Umgebung des Kunden, prüft korrekte
Interaktion mit anderen Systemen)
- Abnahmetest (Endabnahme des Systems vom Kunden, Projekt abgeschlossen, wenn
Test bestanden)
Testtechniken - Einfache Klassifikation
[Bearbeiten]Spezifikationsbasierter Test (Black – Box – Test)
[Bearbeiten]- Motivation: es ist nicht zulässig ein Programm lediglich gegen sich selbst zu
testen
- Ziel: umfassende Prüfung der spezifizierten Funktionalität / Qualität
- Testfall – Auswahl aufgrund der Spezifikation
- Programmstruktur wird nicht betrachtet
- Sollwertbestimmung anhand von Spezifikation
- Motivation: es ist nicht zulässig ein Programm lediglich gegen sich selbst zu
testen
- Vorteil: umfassende Prüfung der spezifizierten Funktionalität /
Qualität
- Nachteile: konkrete Implementierung wird nicht geeignet berücksichtigt, es
werden häufig nicht die Minimalanforderungen von White – Box – Tests erzielt
Black – Box – Tests:
[Bearbeiten]- Fehlerursache wird nicht erkannt
Prinzipien
[Bearbeiten]- Unabhängigkeit (Entwickler sollten Programme nicht selbst testen)
- Vollständiges Testen nicht möglich (Stichproben, man kann Fehler nachweisen, aber nicht deren Nichtexistenz)
- Test ist nur so gut wie die Testfälle (Testfälle müssen für gültige und ungültige Eingaben definiert sein, zu jedem Testfall gehört Soll – Ergebnis, vermeide Wegwerf – Testfälle)
Quellcodebasierter Test (White – Box – Test)
[Bearbeiten]- Testfall – Auswahl aufgrund der Quellcodestruktur
- Sollwertbestimmung anhand von Spezifikation
- Testreferenz: Quellcode des Prüfobjekts
- Techniken: Kontrollflussbasiert, Datenflussbasiert
- Vorteil: formale Testauswahlkriterien definierbar, Techniken auch für
anforderungsbasierten Test einsetzbar
- Nachteil: Fehlende (in Spezifikation nicht beschriebene Funktionen) werden
nicht erkannt
Black – Box – Tests:
[Bearbeiten]Äquivalenzklassenbildung
[Bearbeiten]- Repräsentative Menge von Eingabedaten wird durch
Äquivalenzklassenbildung der möglichen Eingaben gebildet
- Aus jeder Klasse wird ein Repräsentant ausgewählt
- Prinzip
- Zerlegung aller möglichen Eingabedaten in gültige und ungültige
Äquivalenzklassen
- Werte aus einer Äquivalenzklasse verursachen ein identisches
funktionales Verhalten (jede Äquivalenzklasse daher durch einen Repräsentanten getestet Æ Reduktion der Anzahl an Testfällen)
Vorgehen
[Bearbeiten]- Definitionsbereich für jede Eingabevariable ermitteln (1)
- Gültige und ungültige Klassen bilden (2)
- Äquivalenzklassen schrittweise weiter verfeinern
- Äquivalenzklassen identifizieren (3)
- Testfälle für gültige Äquivalenzklassen definieren (4)
- Testfälle für ungültige Äquivalenzklassen definieren (5)
- Optional: Ausgabeäquivalenzklassen bilden (6)
- Anmerkung: gültige Testfälle immer zuerst ableiten, bei ungültigen Testfällen
soll nur eine Variable als ungültig gewählt werden, alle anderen Eingaben gültig, da sonst der Fehler nicht auszumachen wäre
Bemerkungen zur Vorgehensweise
[Bearbeiten]Schritt 3: Äquival Schritt 3: Äquivalenzklassen identifizieren
- Jede gültige Äquivalenzklasse wird eindeutig identifiziert (z.B. Zahlen: 1, 2, ..)
- Jede dazu gehörende ungültige Äquivalenzklasse wird davon abgeleitet identifiziert (z.B. 1a, 1b, 2a).
Schritt 4: Testfälle für gültige Äquivalenzklassen definieren
- Testfälle werden so ausgewählt, dass die Eingaben möglichst viele bisher noch nicht abgedeckte gültige Äquivalenzklassen abdecken enzklassen identifizieren
- Jede gültige Äquivalenzklasse wird eindeutig identifiziert (z.B. Zahlen: 1, 2, ..)
- Jede dazu gehörende ungültige Äquivalenzklasse wird davon abgeleitet identifiziert (z.B. 1a, 1b, 2a).
Schritt 5: Testfälle für ungültige Äquivalenzklassen definieren
- Testfälle werden so ausgewählt, dass diese nur genau eine bisher noch nicht abgedeckte ungültige Äquivalenzklasse abdecken.
- Mit der Zuordnung von einem Testfall zu genau einer ungültigen Äquivalenzklasse wird vermieden, dass ein Programm bei der Entdeckung einer fehlerhaften Eingabe weitere fehlerhafte Eingaben
nicht mehr verarbeitet.
- Falls mehrere ungültige Äquivalenzklassen mit einem Testfall abgedeckt werden, ist nicht mehr transparent, welches falsche Testdatum die Fehlerbehandlung auslöst.
Beispiel: Bildung einer Äquivalenzklasse am 16-bit Eingabemaske
[Bearbeiten]Spezifikationn:
„Mitarbeiter erhalten ab einer Zugehörigkeit (x) zur Firma von mehr als 3 Jahren 50% des Monatsgehalts als Weihnachtsgratifikation. Mitarbeiter, die länger als fünf Jahre in der Firma tätig sind, erhalten 75%. Bei einer Firmenzugehörigkeit von mehr als 8 Jahren wird eine Gratifikation von 100% gewährt.“ „Zusätzlich wird nach Gehaltsgruppen (g) unterschieden. Für Gehaltgruppe G2 eine Gratifikation von 50% gewährt und für G3 100%. G1 erhält 0%“
Wie sehen die Äquivalenzklassen aus ?
Grenzwertanalyse
[Bearbeiten]- An Grenzen zulässiger Datenbereiche treten erfahrungsgemäß häufig Fehler
auf
- Testfälle für solche Grenzfälle werden definiert
- Problem: Annahme, dass alle Werte innerhalb einer Äquivalenzklasse zum
Auffinden von Fehlern gleich gut geeignet sind ist unrealistisch
- Heuristik
- Bei Äquivalenzklassen die Intervalle umfassen wird für jede Grenze
jeweils ein Testfall abgeleitet für
- Die exakten Grenzwerte
- Die beiden benachbarten Werte
- Fällt Grenze einer Äquivalenzklasse mit der einer anderen zusammen, so fallen auch die Testfälle zusammen
Ursache – Wirkungs – Graph:
[Bearbeiten]Testreferenz = Ursache-Wirkungs-Graph (UWG)
- UWG = kombinatorisches logisches Netzwerk
- formale, grafische Sprache zur Beschreibung der logischen Beziehungen zwischen Ursachen und Wirkungen einer Komponente [Spillner, S. 122; Myers, S.55ff.]
- Anwesenheit einer Ursache/Wirkung = 1 – „vorhanden“
- Abwesenheit einer Ursache/Wirkung = 0 – „nicht vorhanden“
- UWG wird aus textueller Spezifikation abgeleitet
- Testfälle werden aus UWG abgeleitet Testreferenz = Ursache-Wirkungs-Graph (UWG)
Ursache-Wirkungsgraph löst dieses Problem
[Bearbeiten]Problem:
Problem bei Tests auf Basis von Äquivalenzklassen (Äquivalenzklassen betrachten einzelne Eingaben, Wechselwirkungen und Abhängigkeiten daher nicht betrachtet, Anzahl Kombinationsmöglichkeiten sehr hoch)
Lösungsansatz
- systematische Auswahl von Eingabekombinationen, Ursache – Wirkungs- Graph
- Kombinationen von Eingabedaten, die zur Erzielung einer gewünschten Wirkung erforderlich sind können bestimmt werden
Vorgehensweise bei der Ursache-Wirkungsanalyse
[Bearbeiten]- Komplexitätsreduktion
- Evtl. Zerlegung der Spezifikation in kleinere Teile
- Ursachen und Wirkungen der Teilspezifikationen identifizieren
- Ursache = einzelne Eingangsbedingung
- Wirkung = Ausgangsbedingung oder Systemtransformation
- Kanten ziehen: Ursachen und Wirkungen im Graphen werden auf Grund der Bedeutung der Spezifikation entsprechend verbunden
- Graph wird in eine Entscheidungstabelle überführt
- Spalten der Entscheidungstabelle werden in Testfälle konvertiert
Die Anzahl der möglichen Kombinationen können reduziert werden, wenn man die boolesche Algebra von ODER und UND zwischen den eingehenden Ursachen und den resultierenden Wirkungen einkalkuliert. Wir gehen dabei rückwärts von den Wirkungen zu den Ursachen, um die Kombinationen zu identifizieren.
Probleme machen dabei maskierte Ursachen. Daher haben wir bei der Identifizierung von Testkombination Regeln einzuhalten.
Als Ergebnis erhält man eine Testreferenz als Referenz für die zu bildenden Testkombinationen.
Regeln gegen maskierte Ursachen
[Bearbeiten]- ODER – Verknüpfung mit Ergebnis 1 => Ursachen (1 * 1, alle anderen 0)
- ODER – Verknüpfung mit Ergebnis 0 => Ursachen (alle Ursachen 0)
- UND – Verknüpfung mit Ergebnis 1 => Ursachen (alle Ursachen 1)
- UND – Verknüpfung mit Ergebnis 0 => Ursachen (einer Ursache 0, alle anderen 1)
Vervollständigte Zusammenstellung der UWG Elemente
[Bearbeiten]- Identität: Ursache und Wirkung besitzen immer denselben booleschen Wert
- Negation: Wirkung tritt auf, falls Ursache nicht vorhanden ist.
- ODER Beziehung: Wirkung tritt auf, falls mindestens einer von (mehreren Ursachen) vorhanden ist
- UND-Beziehung: Wirkung tritt ein, falls mehrere Ursachen gleichzeitig erfüllt sind
- Exklusive Abhängigkeit: höchstens eines kann den Zustand 1 haben
- Inklusive Abhängigkeit: mindestens eines muss den Zustand 1 haben
- One-and-Only Abhängigkeit: eines und nur eines muss den Zustand 1 haben
- Requires-Abhängigkeit: für a = 1 muss b 1 sein
- Maskiert-Abhängigkeit: für a = 1 führt b = 0
Aufgabe: zähleZeichen
[Bearbeiten]Die Operation zähleZeichen liest Zeichen von der Tastatur, solange grosse Konsonanten oder grosse Vokale eingegeben werden sowie die Anzahl kleiner ist als der Maximalwert von Integer. Ist ein gelesenes Zeichen ein grosser Konsonant oder Vokal, so wird die Gesamtzahl um 1 inkrementiert. Falls das Zeichen ein grosserr Vokal ist, so wird auch die Vokalzahl um 1 inkrementiert
Legende
- U1: Zeichen ist grosser Konsonant
- U2: Zeichen ist grosser Vokal
- U3: Gesamtzahl ist kleiner als max. Integer
- W1: Gesamtzahl wird inkrementiert
- W2: Vokalzahl wird inkrementiert
- W3: Zeichen wird gelesen
- W4: Oprration wird beendet
Wie sieht dazu der Ursache-Wirkungsgraph aus ?
Aufgabe Datei ergänzen: Ursache & Wirkungen finden, Ursache-Wirkungsgraph skizzieren
[Bearbeiten]Das Zeichen in Spalte 1 muß A oder B sein. Das Zeichen in Spalte 2 muß eine Ziffer sein. Unter diesen Umständen wird die Ergänzung einer Datei durchgeführt. Ist das erste Zeichen nicht korrekt, so wird die Meldung X 12 ausgegeben. Ist das zweite Zeichen keine Ziffer, so wird die Meldung X 13 ausgegeben.
Was sind Ursachen und Wirkungen ? Wie sieht der UWG-Graph aus ?
Vorgehensweise zum Ableiten der Entscheidungstabelle
[Bearbeiten]- Auswahl einer Wirkung
- Durchsuchen des Graphen nach Kombinationen von Ursachen, die den Eintritt der Wirkung hervorrufen, bzw. nicht hervorrufen (erfolgt ausgehend von Wirkung in Richtung Ursachen)
- Erzeugung jeweils einer Spalte der Entscheidungstabelle für alle gefundenen Ursachenkombinationen und die verursachten Zustände der übrigen Wirkungen
- Eliminieren doppelter Einträge in der Entscheidungstabelle
Aufgabe: Entscheidungstabelle für das Beispiel zähleZeichen generieren
[Bearbeiten]Das Ergebnis für die Entscheidungstabelle beim Beispiel zähle Zeichen ist hier zu sehen. Skizzieren Sie den Lösungsweg und vergleichen Sie dann mit der Musterlösung
Zusatzaufgabe:
Stelle die Entscheidungstabelle für das Beispiel Datei ergänzen auf !
White – Box – Tests
[Bearbeiten]Kontrollflussgraphen
[Bearbeiten]Programm wird als Kontrollflussgraph betrachtet
- Kontrollflussgraph: gerichteter Graph G = ( N, E, , ) , wobei N die Menge von Knoten , E die Menge der gerichteten Kanten, der Startknoten und der Endknoten ist
- Knoten: Anweisungen, wobei ein Knoten mehrere ausgehende und mehrere eingehende Kanten haben kann
- Kanten: Kontrollfluss von einer Anweisung zur nächsten
- Zweig: Kante nach Bedingung
- Pfad: Weg vom Anfangs- bis zum Endknoten
Abb. einfügen von Zusammenfassung S. 26
- Bestimmung der Programmpfade: alle Kombinationen aller Programmzweige bei maximalem Durchlauf aller Schleifen (gültiger Pfad führt vom Start- bis zum Endknoten, ein Pfad kann Knoten und Kanten mehrfach durchlaufen, Pfad muss nicht alle Knoten und Kanten enthalten)
- Testabdeckung: Ableitung von Testfällen, welche Überdeckungskriterien erfüllen (verschiedene Arten: Anweisungsüberdeckung, Zweigüberdeckung,…)
- Anweisungsüberdeckung: Eine Testfallmenge T erfüllt das Testkriterium, wenn es für jede Anweisung A des Programms P einen Testfall gibt, der die Anweisung A ausführt,
- Überdeckungsgrad
in der Regel werden 60 – 70 % Anweisungsüberdeckung erreicht
- Fazit: Fehleridentifizierungsquote 18 % (am schlechtesten), Mindestanforderungen nicht erfüllt, hilft dead – code zu finden
- Zweigüberdeckung: Eine Testfallmenge T erfüllt das Testkriterium, wenn es für jede Kante k im Kontrollflussgraphen von P einen Weg in Wege (T, P) gibt, zu dem k gehört, d.h. wenn alle Entscheidungskanten ausgeführt werden,
- Überdeckungsgrad
in der Regel 80% Zweigüberdeckung erreicht
- Fazit: gilt als minimales Testkriterium, Schleifen werden nicht zuverlässig getestet, zusammengesetzte Entscheidungen werden nicht zuverlässig getestet
- Problem: bereits wenige Testfälle erzielen hohe Überdeckungsrate, mit jedem weiteren Testfall werden nur noch wenige, bisher nicht abgedeckte Zweige durchlaufen, Überdeckungsrate steigt also nur langsam weiter an, was eine falsche Sicherheit bei wenigen Testfällen
vortäuscht
- Abhilfe: Zweige nicht mitzählen, die immer dann ausgeführt werden, wenn auch ein anderer Zweig ausgeführt wird primitive (essentielle) Zweige
- Bedingungsüberdeckung: „zuverlässiges“ Testen zusammengesetzter Entscheidungen Analyse der logischen Struktur von Entscheidungen im Programmcode, mehrere Testverfahren:
- Einfache Bedingungsüberdeckung: Test aller atomaren Entscheidungen gegen true / false
Tabelle auf der Zusammenfassung ist für wikiversity zu undeutlich, S. 26
- Minimale Mehrfach – Bedingungsüberdeckung: neben atomaren Entscheidungen müssen auch Teilentscheidungen und Gesamtentscheidungen gegen true / false geprüft werden
Tabelle auf der Zusammenfassung ist für wikiversity zu undeutlich, S. 27
- Mehrfach Bedingungsüberdeckung: Test aller Testfälle aus Tabelle gegen true / false, aber hoher Aufwand
Tabelle auf der Zusammenfassung ist für wikiversity zu undeutlich, S. 27
- Allgemeines Problem: Verfahren hängen von Evaluierung der logischen Ausdrücke durch den Compiler ab
- Minimale Termüberdeckung: Jeder atomare Term einer Bedingung bestimmt wenigstens einmal mit Werten TRUE und FALSE das Gesamtergebnis der Bedingung, Beispiel: T1 = T2 AND T3, T2 bestimmt also nur dann den Wert von T1, wenn T3 den Wert TRUE besitzt
- Pfadüberdeckung: alle unterschiedlichen Pfade sollen einmal ausgeführt werden (zwei Pfade sind nur dann identisch, wenn sie exakt die gleiche Abfolge von Knoten beinhalten), d.h. alle Schleifen müssen mit jeder möglichen Anzahl von Durchläufen getestet werden
- Probleme:
- Für praktischen Einsatz nur eingeschränkt tauglich Anzahl
der Möglichkeiten kann sehr groß sein, daher extremer Aufwand
- Kontrollflussgraphen beinhalten nicht gesamte Informationen des Programmcodes (Abstraktion!)
- Testfallableitung direkt aus Programmcode evtl. komplex
- Eingeschränkte Pfadüberdeckung:
- Nicht alle Pfade durch Schleifen werden berücksichtigt, sondern nur die Pfade die neue Aspekte ansprechen
- Beschränkung auf 5 Aspekte pro Schleife: 0 Iterationen, 1 Iteration, 2 Iterationen, typische Anzahl Iterationen und maximale Anzahl Iterationen
Datenflussbasierte Techniken
[Bearbeiten]- Zwei Klassen von Anweisungen: Steuerung des Ablaufs (if, while, …) und Manipulation der Daten, bei datenflussbasierten Tests steht der Zugriff auf die Variablen im Mittelpunkt
- Begriffe:
- c – use (lesender Zugriff / computational use) Eingabewert für eine Berechnung wird gelesen: y = a * b
- p – use (lesender Zugriff / predicate use) Ermittlung des Wahrheitswertes einer Entscheidung: ( )
if ( a == b )
- def (Schreibender Zugriff) eine Variable wird definiert: a =10
o Beispiel für Programmflussgraphen:
Beispiel für datenflussattributierten Programmflussgraphen
int doIt(int a, int b) {
int hilf, res = 0;
if ( a > b )
hilf = a - b;
res = hilf;
else
res = b;
return res;
}
Defs/Uses müssen in der Reihenfolge, in der sie ausgeführt werden, annotiert werden und nicht in der Reihenfolge, in der sie im Programmcode stehen !
- Datenflussorientierte Techniken definieren Überdeckungskriterien auf dem
Kontrollflussgraph, die aus Datenflusssicht interessant sind
- Verfahren: Defs / Uses – Test, Required k – Tuples Test, Datenkontext –
Überdeckung
- Defs / Uses – Test
- globaler c-use x
- kein def x geht im selben Block einem c-use x voraus
- lokaler c-use x
- Gegenteil von globalen c-use
- p = (,...;) definitionsfrei bzgl. x
- in keinem Knoten ,...; ex. def. x
- def x in erreicht c-use in x in
- es gibt definitionsfreien Pfad p bzgl. x mit () p()
- def x in erreicht p-use in
- es gibt definitionsfreien Pfad p() bzgl. x mit p, )
- globales def x
- letztes def x in und (def x in erreicht ein globales c-use x oder def x in erreicht ein p-use x)
- lokales def x
- lokaler c-use x folgt auf def x und zwischen def x und c-use x kein weiteres def x
- weder lokales noch globales def x Fehler, da Variablenwert nie benutzt wird
- globaler c-use x
- DEF - Menge der global definierten Variablen des Knoten in
- C-USE − Menge der global berechnenden Zugriffe im Knoten in
- P-USE () − - Menge von Variablen, auf die in der Kante () prädikativ zugegriffen wird
- Menge DCU(x, )
- Menge aller Knoten mit def x in erreicht c-use x in und x C-Use()
- Menge DPU(x, )
- Menge aller Kanten , mit def x in erreicht p-use x in
Variable | Knoten | DCU(x, ) | DPU(x, ) |
a | ) | {} | {} |
b | ) | {} | |
res | {} | {} | |
res | {} |
- All – uses Kriterium: Testfälle müssen für jede Definition aller Variablen alle definitionsfreien Pfade von der Definition zu einem berechnenden oder prädikativen Zugriff auf die Variable enthalten
- Formale Beschreibung: Für jeden Knoten und jede Variable x def( muss ein definitionsfreier Pfad bezüglich x von math>n_i</math> zu allem Elemente aus DCU (x,)und DPU(x, in der Menge der getesteten Pfade enthalten sein
, , , ,
- DCU(a, )
- DCU(b, )
- DCU( , )
- DPU(a, (, ))
- DPU(b, (, ))
, , , ,
- DCU(b, )
- DCU(, )
- DCU( , )
- DPU(a, (, ))
- DPU(b, (, ))
Variable | Knoten | DCU (x, | DPU ( x, ) |
a | {} | {(, ), (, ) | |
b | ({}, {}) | {(, ), (, ) | |
res | {} | {} | |
res | { | {} |
Zusammenfassung Quellcode basierte Testverfahren:
[Bearbeiten]- Funktionstests beinhalten Methoden zur Testfallableitung aus der Spezifikation
- Strukturtests geben Testvollständigkeitskriterien auf der Basis des Programmcodes an
(beinhalten aber i.d.R. keine Methode zur Ableitung von Testeinhaben und erwarteten Ergebnissen)
- Kombination der Strukturtests mit Methoden zur Testfallableitung, mögliches Vorgehen:
- Tester definiert nach einer gewählten Methode Testfälle
- Teste führt die Testfälle aus, wobei ein Werkzeug anhand des Quellcodes die Testabdeckung ermittelt
o Tester analysiert die erreichte Testabdeckung und ergänzt bei Bedarf die Testfälle
- Strukturtests nur sinnvoll für Modultests und bedingt für Integrationstests
Systematische Testfallermittlung
[Bearbeiten]für Testobjekte mit mittlerem oder hohen Risiko
- Äquivalenzklassenanalyse
- Entscheidungstabellentest
- Grenzwertanalyse
Charakteristika
- formalisiert
- dokumentiert
- vollständig skalierbar
Testmethoden sollen zum Objekt passen
- Äquivalenzklassenbildung
- Grenzwertanalyse
- Entscheidungstabellentest Ursache-Wirkungsanalyse
- Zustandbezogener Test
- Anwendungsfallbasierter Test
Äquivalenzklassenbildung
[Bearbeiten]- Zerlegung der Eingabedaten in eine endliche Zahl von Äquivalenzklassen
- unter der Annahme: mit jedem beliebigen Repräsentanten der Klasse wird die gleiche Wirkung wie mit jedem anderen Repräsentanten der Klasse erzielt
Reduktion der Anzahl der Testfälle
Zerlegung aller möglichen Eingabedaten in
- gültige
- und ungültige Äquivalenzklassen
Die Äquivalenzklassen können ausserdem für Ausgabedaten, interne Werte, zeitbezogene Werte (z.B. vor oder nach dem Ereignis) und für Schnittstellenparameter (z.B. Integrationstest gebildet werden.
Äquivalenzklassenanalyse und Grenzwertanalyse haben eine Schwäche
- sie können keine Kombinationen von Eingabebedingungen untersuchen
Ursache-Wirkungsanalyse
- Kombinationen von Eingaben: Ursache <=> Wirkungen
- Jede Ursache wird als Bedingung geschrieben, die aus Eingabedaten besteht und die wahr oder falsch sein kann
- schwierige Aufgabe wegen Anzahl der Kombinationen
- die Darstellung erfolgt mittels eines Graphen (Ursache-Wirkungsgraph) oder einer Entscheidungstabelle (=> Entscheidungstabellentest)
Vorgehensweise bei der systematischen Testfallermittlung
[Bearbeiten]Analyse Fachkonzept
[Bearbeiten]- eingaberelevante Elemente (Dialog- oder Tabellenfenster) bestimmen
- Spezifizieren zu prüfender Wirkungen (fachliche Ausgaben bzw. Ergebnisse)
- Identifikation der Verarbeitungsregeln (wenn dann, sonst)
Elementklassen, Äquivalenzklassen bilden
[Bearbeiten]- vollständige Abdeckung des Eingabebereiches (positive und zum Fehler führende Elementklassen)
- keiine Überschneidung
- eindeutige fachliche Wirkung
Direkte Wirkung refernzieren
[Bearbeiten]Abhängigkeiten identifizieren
[Bearbeiten]- voneinander abhängige Elemente auswählen
- Kombinationen bilden
- Zusammenfassen von Kombinationen
- gleiche Wirkung UND
- Differenz in nur einer Äquivalenzklasse
Wirkung den Kombinationen zuweisen
[Bearbeiten]Testfälle erstellen
[Bearbeiten]- Testfallrümpfe generieren
- aus positiven Kombinationen
- Auffüllen mit Kombinationen anderer Abhängigkeiten
- Auffüllen mit positiven Elementklassen
- Auffüllen mit Standartkombinationen
- aus fehlerhaften Kombinationen und Elementklassen
- auffüllen mit positiven Elementklassen und Kombinationen
Endekriterien für Testfallbildung prüfen
[Bearbeiten]- jede positive Elementklasse in einen Testfallfall
- jede positive Elementklasse in eine Kombination
- alle Wirkungen abgedeckt
- vollständig spezifiziert (Standartkombination)
- je zum Fehler führende Kombination ein separater Testfall
- je zum Fehler führende Elementklasse ein separater Testfall
Review
[Bearbeiten]- Fachlich
- Kommentare vollständig