13.07.2015 Aufrufe

Systematisches Testen

Systematisches Testen

Systematisches Testen

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

Informatiker: bleibt ander Uni, oder ihr müsst(so) testen.http://www.constructionphotography.com<strong>Systematisches</strong> <strong>Testen</strong>OOPM, Ralf Lämmel


Naives vs. systematisches <strong>Testen</strong>(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau733


“Naiver Testfall”primitiv-rekursive Additionpublic class PrimitiveRecursive {}public static int add(int m, int n) {}return m==0 ? n : add(m-1,n)+1;public static void main(String[] args) {}System.out.println(add(42,46)); // prints 88Sind damit alleFälle getestet?Wie wird dieskontrolliert?(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau734


Naives <strong>Testen</strong>Ausführen von Tests in main() Methode.Ausgabe der Ergebnisse auf System.out.„Manuelles“ Begutachten der Ergebnisse.Unsystematische Auswahl der Testdaten.Überschreibung der Testfälle für neue Tests.(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau735


Grundsätzliche Begriffe zum <strong>Testen</strong>SUT: System Under TestTestfall = Eingabedaten + erwartete Ausgabe (e)TestfallausführungErmittlung der tatsächliche Ausgabe (t)Erfolgreicher Testfall: t und e stimmen überein.Gescheiterter Testfall: t und e stimmen nicht überein.Orakel: Mechanismus zum Vorhersagen von e.DokumentationReferenzimplementation...(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau736


Danksagung: Teile dieser Vorlesung gehen auf Dr. Volker Riediger’s OOPM 2008 Vorlesung zum <strong>Testen</strong> zurück.<strong>Systematisches</strong> <strong>Testen</strong>mit dem JUnit-Frameworkhttp://junit.orgAutomatisierung von Unit-Tests in JavaSehr gute Tool-Unterstützung beiErstellungKent BeckAusführungProtokollierungTest auf KnopfdruckErich Gamma(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau737


“Systematischer Testfall”primitiv-rekursive AdditionMarkierungder Testfall-Methodeimport org.junit.Test;import static org.junit.Assert.*;public class TestPrimitiveRecursive {}@Testpublic void testAdd42and46() {}Import der JUnit-FunktionalitätHilfsklasse zurAufbewahrungvon TestfällenassertEquals(88,PrimitiveRecursive.add(42,46));ErwartetesErgebnisZu testendeBerechnung(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau 738


Ausführen von JUnit-Tests“Grün” bedeutet,dass alle Testserfolgreich waren.(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau739


Danksagung: Teile dieser Vorlesung gehen auf Dr. Volker Riediger’s OOPM 2008 Vorlesung zum <strong>Testen</strong> zurück.Was kann <strong>Testen</strong> leisten?Erhöhung des Vertrauens in KorrektheitVerbindliche Form von DokumentationAusführen aller ProgrammteileAufdeckung problematischer Änderungen(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau741


Danksagung: Teile dieser Vorlesung gehen auf Dr. Volker Riediger’s OOPM 2008 Vorlesung zum <strong>Testen</strong> zurück.Was kann <strong>Testen</strong> nicht leisten?Beweis funktionaler Korrektheit.Beweis der Abwesenheit von Fehlern.Beweis der Übereinstimmung zwischenerwartetem Verhalten undgetestetem VerhaltenEdsger Wybe Dijkstra*1930 †2002„Program testing can be used toshow the presence of bugs, butnever to show their absence“(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau742


Danksagung: Teile dieser Vorlesung gehen auf Dr. Volker Riediger’s OOPM 2008 Vorlesung zum <strong>Testen</strong> zurück.Test-Driven Development (TDD)Eine Idee des „Extreme Programming“Tests sind genau so wichtig wie Funktionalität.Testfälle zuerst, danach die Implementation.„Constantly testing“„Daily Build“<strong>Testen</strong> muss einfach sein. Sonst wird esnicht akzeptiert und auch nicht durchgeführt!(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau743


Granularitätsstufen für das <strong>Testen</strong>Unit-TestIntegrationstestAnwendungstesthttp://www.goethe-verlag.com/book2/EN/ENDE/ENDE070.HTM(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau744


Danksagung: Teile dieser Vorlesung gehen auf Dr. Volker Riediger’s OOPM 2008 Vorlesung zum <strong>Testen</strong> zurück.Granularitätsstufen für das <strong>Testen</strong>Unit-TestTest einzelner Module (“Test im Kleinen”)PaketKlasseMethodeVerantwortlich: EntwicklerIntegrationstestAnwendungstestMittels JUnit-Werkzeugund -Methode gutunterstützt für Java.(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau745


Danksagung: Teile dieser Vorlesung gehen auf Dr. Volker Riediger’s OOPM 2008 Vorlesung zum <strong>Testen</strong> zurück.Blackbox-<strong>Testen</strong>Funktionales <strong>Testen</strong>Ableiten der Testfälle aus der Spezifikation.Überdeckung vonNormalfällenFehlerfällenWas ist das?GrenzfällenCodeüberdeckung nicht notwendig vollständig.(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau746


Danksagung: Teile dieser Vorlesung gehen auf Dr. Volker Riediger’s OOPM 2008 Vorlesung zum <strong>Testen</strong> zurück.Glassbox-<strong>Testen</strong>Struktur-<strong>Testen</strong>Ableiten der Testfälle aus dem Code.Überdeckung (Coverage) vonallen Anweisungenallen Alternativenhttp://en.wikipedia.org/wiki/Code_coverageallen Teilbedingungenallen Pfaden(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau747


Danksagung: Teile dieser Vorlesung gehen auf Dr. Volker Riediger’s OOPM 2008 Vorlesung zum <strong>Testen</strong> zurück.Blackbox Unit-Tests(<strong>Testen</strong> „im Kleinen“)Spezifikation des VerhaltensWAS tut eine Methode?TestfälleEingabewerteErwartete AusgabewerteTest-TreiberProgramm zum Ausführen der TestfälleProtokollierung der Testergebnisse(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau748


Methode zur Additionmit “Spezifikation”/*** @param m first operand of addition (non-negative)* @param n second operand of addition (non-negative)* @return the sum of the two operands*/public static int add(int m, int n) {return m==0 ? n : add(m-1,n)+1;}Was passiert für negative Operanden?(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau749


Danksagung: Teile dieser Vorlesung gehen auf Dr. Volker Riediger’s OOPM 2008 Vorlesung zum <strong>Testen</strong> zurück.Anforderungen an SpezifikationNatürlichsprachlich, semiformal oder formalEindeutigPräziseKorrektVollständigIn der Praxis sind dieseAnforderungen möglicherweise zu“teuer”. Allerdings helfen Tests auchdann als indirekte Spezifikation.Widerspruchsfrei(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau750


Methode zur Additionmit geänderter “Spezifikation”/*** @param m first operand of addition (non-negative)* @param n second operand of addition* @return the sum of the two operands* @throws java.lang.StackOverflowError if m is negative*/public static int add(int m, int n) {return m==0 ? n : add(m-1,n)+1;}Negative Operanden sind nun erklärt.(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau751


Danksagung: Teile dieser Vorlesung gehen auf Dr. Volker Riediger’s OOPM 2008 Vorlesung zum <strong>Testen</strong> zurück.Bestandteile einer MethodenspezifikationVorbedingungNachbedingungz.B.: Argument amount ist positiv.z.B.: balance ist um amount erhöht.EingabeparameterErgebnisAusnahmen / FehlerSeiteneffekte...(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau752


Danksagung: Teile dieser Vorlesung gehen auf Dr. Volker Riediger’s OOPM 2008 Vorlesung zum <strong>Testen</strong> zurück.Granularitätsstufen für das <strong>Testen</strong>Unit-TestIntegrationstestTest des Zusammenspiels von Modulen einer AnwendungTeile der Umgebung simuliertVerantwortlich: EntwicklerAnwendungstest(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau753


Danksagung: Teile dieser Vorlesung gehen auf Dr. Volker Riediger’s OOPM 2008 Vorlesung zum <strong>Testen</strong> zurück.Granularitätsstufen für das <strong>Testen</strong>Unit-TestIntegrationstestAnwendungstest<strong>Testen</strong> der vollständigen Anwendung in der ZielumgebungAkzeptanztest zur Erfüllung aller AnforderungenRegressionstest zum Vergleich zwischen zwei VersionenLast-Test zum (Zeit-) Verhalten unter einer gewissen LastVerantwortlich: Auftraggeber, Entwickler(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau754


Danksagung: Teile dieser Vorlesung gehen auf Dr. Volker Riediger’s OOPM 2008 Vorlesung zum <strong>Testen</strong> zurück.Welche Testfälle braucht man?Normalfälle Grenzfälle Fehlerfälleeinige alle alle<strong>Testen</strong> aller Fälle ist typischerweise nicht möglich.Man muss dann Äquivalenzklassen bilden.Man kann ebenfalls zufällige Testdaten anwenden.(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau755


Fehlerfall zur AdditionDokumentation der erwartetenAusnahme für den Fehlerfall@Test(expected=java.lang.StackOverflowError.class)public void testAdd1stNegative() {PrimitiveRecursive.add(-1,0);}(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau756


Fehlerfall zum MergeSortDokumentation der erwartetenAusnahme für den Fehlerfall@Test(expected=java.lang.NullPointerException.class)public void testMergeSortWithNull() {mergeSort(null);}(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau757


Fehlerfälle zum ggTDokumentation der erwartetenAusnahme für den Fehlerfall@Test(expected=java.lang.ArithmeticException.class)public void testGcdOf1and0() {IterativeMod.gcd(1,0);}@Test(expected=java.lang.ArithmeticException.class)public void testGcdOf0and1() {IterativeMod.gcd(0,1);}(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau758


Danksagung: Teile dieser Vorlesung gehen auf Dr. Volker Riediger’s OOPM 2008 Vorlesung zum <strong>Testen</strong> zurück.GrenzfälleOperationen am Anfang/am Ende von Listen und Feldern„Ein wenig“ größer/kleiner als der erlaubte Bereich“Null” falls dies nicht ohnehin ein Fehlerfall istGrenzen des DefinitionsbereichsEinzelnes ElementLeere Eingabe(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau759


Grenzfälle für lineare Suchepublic class TestLinear {public static int[] a = {1,2,3,4,5,6,7,9,10};@Testpublic void testFirst() {assertEquals(0,Program.linear(a, 1));}@Testpublic void testLast() {assertEquals(8,Program.linear(a, 10));}...}(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau760


Normalfälle für lineare Suchepublic class TestLinear {public static int[] a = {1,2,3,4,5,6,7,9,10};@Testpublic void testSecond() {assertEquals(1,Program.linear(a, 2));}@Testpublic void testMissing() {assertEquals(-1,Program.linear(a, 8));}...}(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau761


Danksagung: Teile dieser Vorlesung gehen auf Dr. Volker Riediger’s OOPM 2008 Vorlesung zum <strong>Testen</strong> zurück.Einschub: JUnit-Assert-MethodenassertEquals(Object expected, Object actual)assertTrue()assertFalse()assertNull (Object o)assertNotNull(Object o)assertSame(Object expected, Object actual)assertNotSame(Object expected, Object actual)...Reihenfolgebeachten!(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau762


Fakultätsfunktion/*** @param n non-negative operand* @return factorial (1 * ... * n)*/public static int factorial(int n) {int r = 1;for (int i=1; i


Normalfälle für Fakultätsfunktion@Testpublic void testFactorialOf1to4() {assertEquals(1, factorial(1));assertEquals(2, factorial(2));assertEquals(6, factorial(3));assertEquals(24, factorial(4));}(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau764


Grenzfall oder Normalfall?@Testpublic void testFactorialOf0() {assertEquals(1, factorial(0));}Aus einer mathematischen Sichtweisewürde dies als Normalfall gelten. Aus einereher programmiertechnischen Sicht würdedies als Grenzfall gelten.(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau765


Fehlerfall zur Fakultätsfunktion@Testpublic void testFactorialForNegativeOperand() {assertEquals(1, factorial(-1));}Beachte: Fehlerfälle können auf verschiedene Artenund Weisen behandelt werden: Ausnahmen,Boolesche Werte oder normale Ergebnisrückgabe.(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau766


Potenzierung(Ineffiziente Referenzimplementation)public static int power(int x, int n) {int result = 1;for (int i=1; i


Potenzierung(Effizientere Implementation)public static int power(int x, int n) {int k = n;int p = x;int y = 1;while (k>0)if (k % 2 == 0) {p = p * p;k = k / 2;}else {y = y * p;k = k - 1;}return y;}(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau770


<strong>Testen</strong> mittels Referenzimplementationpublic class TestEfficient {@Testpublic void testNormal() {assertEquals(Inefficient.power(2,1),Efficient.power(2,1));assertEquals(Inefficient.power(2,2),Efficient.power(2,2));assertEquals(Inefficient.power(2,3),Efficient.power(2,3));assertEquals(Inefficient.power(2,4),Efficient.power(2,4));assertEquals(Inefficient.power(3,1),Efficient.power(3,1));assertEquals(Inefficient.power(3,2),Efficient.power(3,2));assertEquals(Inefficient.power(3,3),Efficient.power(3,3));assertEquals(Inefficient.power(3,4),Efficient.power(3,4));}}(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau771


<strong>Testen</strong> der Taylor-Reihe für sin@Testpublic void testSinNormal() {assertTrue(Math.abs(Math.sin(3.1415/2)- Efficient.sin(3.1415/2))< 1e-6);}Beachte: Der Vergleich der Ausgaben mitden Erwartungen muss eventuell akzeptableAbweichungen einplanen.(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau773


Wie testet man Hanoi?public static void move(int n, String from, String temp, String to) {if (n == 0)return;move(n - 1, from, to, temp);System.out.println("Move disc " + n + " from " + from + " to " + to);move(n - 1, temp, from, to);}Man könnte die Ausgabe unmittelbar in einer Dateisichern und eine Baseline zum Vergleich mit derAusgabe vereinbaren. Allerdings ist generell einestrukturierte Darstellung der Ausgabe vorzuziehen.Warum?(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau774Für dasSelbststudiumbzw. für dieBesprechung inÜbung/Praktikum.


Türme von Hanoi mitstrukturiertem Ergebnispublic static List move(int n, String from, String temp, String to) {}List l = new LinkedList();move(l, n, from, temp, to);return l;private static void move(List l, int n, String from, String temp, String to) {}if (n == 0)return;move(l, n - 1, from, to, temp);Move m = new Move(n, from, to);l.add(m);move(l, n - 1, temp, from, to);(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau775Für dasSelbststudiumbzw. für dieBesprechung inÜbung/Praktikum.


Strukturierte Darstellungvon Turmbewegungenpublic final class Move {public int disc;public String from;public String to;public Move(int disc, String from, String to) {this.disc = disc;this.from = from;this.to = to;}}Der Konstruktor ist vollkommen optional.Er ermöglicht etwas kompakteren Code.Warum?(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau 776Für dasSelbststudiumbzw. für dieBesprechung inÜbung/Praktikum.


<strong>Testen</strong> des Normalfallsfür die Türme von Hanoi@Testpublic void testNormal() {Iterator i = ListBased.move(3,"A","B","C").iterator();assertEquals(new Move(1,"A","C"),i.next());assertEquals(new Move(2,"A","B"),i.next());assertEquals(new Move(1,"C","B"),i.next());assertEquals(new Move(3,"A","C"),i.next());assertEquals(new Move(1,"B","A"),i.next());assertEquals(new Move(2,"B","C"),i.next());assertEquals(new Move(1,"A","C"),i.next());assertFalse(i.hasNext());}Wann sind zweiBewegungen gleich?(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau 777Wie können wirtrotzdem Text erzeugen?Für dasSelbststudiumbzw. für dieBesprechung inÜbung/Praktikum.


Einschub: Strukturelle Gleichheitpublic final class Move {...public boolean equals(Object o) {if (!(o instanceof Move))return false;Move m = (Move)o;return this.disc == m.disc&& this.from.equals(m.from)&& this.to.equals(m.to);}}Diese Methode kannfür jeden Klassentypimplementiert werden.Der Default ist “==”.(C) Ralf Lämmel, OOPM, Universität Koblenz-LandauWir vergleichen Bewegungen komponentenweise.Dabei fallen Typtest und Down-Cast an, um denParameter von equals(...) anzupassen.778Für dasSelbststudiumbzw. für dieBesprechung inÜbung/Praktikum.


Der Kontrakt von equalshttp://java.sun.com/j2se/1.4.2/docs/api/java/lang/Object.htmlpublic boolean equals(Object obj)Indicates whether some other object is "equal to" this one.The equals method implements an equivalence relation on non-null object references:• It is reflexive: for any non-null reference value x, x.equals(x) should return true.• It is symmetric: for any non-null reference values x and y, x.equals(y) should returntrue if and only if y.equals(x) returns true.• It is transitive: for any non-null reference values x, y, and z, if x.equals(y) returnstrue and y.equals(z) returns true, then x.equals(z) should return true.• It is consistent: for any non-null reference values x and y, multiple invocations ofx.equals(y) consistently return true or consistently return false, provided noinformation used in equals comparisons on the objects is modified.• For any non-null reference value x, x.equals(null) should return false.Nurbeiläufigerwähnt.The equals method for class Object implements the most discriminating possibleequivalence relation on objects; that is, for any non-null reference values x and y, thismethod returns true if and only if x and y refer to the same object (x == y has the valuetrue).Note that it is generally necessary to override the hashCode method whenever thismethod is overridden, so as to maintain the general contract for the hashCode method,which states that equal objects must have equal hash codes.(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau779Für dasSelbststudiumbzw. für dieBesprechung inÜbung/Praktikum.


Einschub: toString() per Datentyppublic final class Move {}...public String toString() {}return "Move(" + disc + "," + from + "," + to + ")";Diese Methode kann für jedenKlassentyp implementiertwerden. Es gibt keinenbrauchbaren Default.Testanwendung(C) Ralf Lämmel, OOPM, Universität Koblenz-Landaupublic static void main(String[] args) {List l = move(3, "A", "B", "C");System.out.println(l);}[Move(1,A,C), Move(2,A,B), Move(1,C,B), Move(3,A,C), ...]780Für dasSelbststudiumbzw. für dieBesprechung inÜbung/Praktikum.


<strong>Testen</strong> von Sortieralgorithmen4 SortieralgorithmenBubbleSortInsertionSortMergeSortSelectionSortWas sind relativ erschöpfende Testdaten?Betrachte alle möglichen Listen der Länge 0..n.(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau781Für dasSelbststudiumbzw. für dieBesprechung inÜbung/Praktikum.


Testdaten für das Sortieren@Beforepublic void setUp() throws Exception {input0 = new int[0];}output0 = new int[0];input1 = new int[] { 42 }; // array of length 1output1 = new int[] { 42 }; // array of length 1input2a = new int[] { 1, 2 }; // sorted array of length 2input2b = new int[] { 2, 1 }; // unsorted array of length 2output2 = new int[] { 1, 2 }; // sorted array of length 2input3a = new int[] { 1, 2, 3 }; // sorted array of length 3input3b = new int[] { 2, 3, 1 }; // unsorted array of length 3input3c = new int[] { 3, 1, 2 }; // unsorted array of length 3input3d = new int[] { 1, 3, 2 }; // unsorted array of length 3input3e = new int[] { 3, 2, 1 }; // unsorted array of length 3input3f = new int[] { 2, 1, 3 }; // unsorted array of length 3output3 = new int[] { 1, 2, 3 }; // sorted array of length 3Die Testdaten sind Attribute derTestklasse damit alle Testmethodendarauf zugreifen können.Die Testdaten werden neuaufgebaut vor jedem Testfall.Für dasSelbststudiumbzw. für dieBesprechung inÜbung/Praktikum.(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau782


Danksagung: Teile dieser Vorlesung gehen auf Dr. Volker Riediger’s OOPM 2008 Vorlesung zum <strong>Testen</strong> zurück.Einschub: JUnit-AnnotationenMarkierung von Methoden durch Java-Annotations@TestTestmethode mit Assertions@BeforeAusführung vor jeder Testmethode(z.B. zum Erstellen von Testdaten)@AfterAusführung nach jeder Testmethode...Ausführung der markierten Methoden über Java-Reflection(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau783Für dasSelbststudiumbzw. für dieBesprechung inÜbung/Praktikum.


Testfälle zum Sortierenpublic void testIsSorted();public void testIsPermutation();public void testBubbleSort();public void testInsertionSort();public void testMergeSort();Korrektheit der Eingabedaten undder Kontrakteigenschaften für dasSortierenNormalfälle und Grenzfälle desSortierens mit kombinatorischeErschöpfung bis zu gewisser Längepublic void testSelectionSort();public void testBubbleSortWithNull();public void testInsertionSortWithNull();public void testMergeSortWithNull();public void testSelectionSortWithNull();(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau784Fehlerfälle mit “null”Für dasSelbststudiumbzw. für dieBesprechung inÜbung/Praktikum.


<strong>Testen</strong> des Sortiertheitstestes@Testpublic void testIsSorted() {// Sorted inputassertTrue(isSorted(input0));assertTrue(isSorted(input1));assertTrue(isSorted(input2a));assertTrue(isSorted(input3a));// Sorted outputassertTrue(isSorted(output0));assertTrue(isSorted(output1));assertTrue(isSorted(output2));assertTrue(isSorted(output3));(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau}// Unsorted inputassertFalse(isSorted(input2b));...785Für dasSelbststudiumbzw. für dieBesprechung inÜbung/Praktikum.


<strong>Testen</strong> des Permutationstestes@Testpublic void testIsPermutation() {assertTrue(isPermutation(input0,output0));assertTrue(isPermutation(input1,output1));assertTrue(isPermutation(input2a,output2));assertTrue(isPermutation(input2b,output2));...}(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau786Für dasSelbststudiumbzw. für dieBesprechung inÜbung/Praktikum.


<strong>Testen</strong> von BubbleSort(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau@Testpublic void testBubbleSort() {bubbleSort(input0);assertTrue(Arrays.equals(input0,output0));bubbleSort(input1);assertTrue(Arrays.equals(input1,output1));bubbleSort(input2a);assertTrue(Arrays.equals(output2,input2a));bubbleSort(input2b);assertTrue(Arrays.equals(output2,input2b));bubbleSort(input3a);assertTrue(Arrays.equals(output3,input3a));...}787Mutation der@BeforevorbereitetenDaten.Für dasSelbststudiumbzw. für dieBesprechung inÜbung/Praktikum.


<strong>Testen</strong> eines KellersAbleitung von Testfällen aus folgenden GeschichtenInitialer (leerer) KellerNichtleerer KellerAus leerem Keller durch push(...) entstanden.Keller mit verbleibenden Elementen nach pop().Anwendung der Operationen in diesen Situationen.(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau788Für dasSelbststudiumbzw. für dieBesprechung inÜbung/Praktikum.


** A newly created stack is empty.*/@Testpublic void testEmpty() {Stack s = new UnboundedStack();assertTrue(s.isEmpty());}(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau 789Für dasSelbststudiumbzw. für dieBesprechung inÜbung/Praktikum.


** An empty stack throws on pop.*/@Test(expected=java.lang.NullPointerException.class)public void testPopWhenEmpty() {Stack s = new UnboundedStack();s.pop();}/** An empty stack throws on top.*/@Test(expected=java.lang.NullPointerException.class)public void testTopWhenEmpty() {}Stack s = new UnboundedStack();s.top();(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau 790Für dasSelbststudiumbzw. für dieBesprechung inÜbung/Praktikum.


** A stack is non-empty after push.* Also, top returns the pushed item.*/@Test()public void testPush() {}Stack s = new UnboundedStack();String item = "item";s.push(item);assertFalse(s.isEmpty());assertSame(item,s.top());(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau 791Für dasSelbststudiumbzw. für dieBesprechung inÜbung/Praktikum.


** When an item is popped off the stack,* then the previously pushed item becomes top-of-stack.*/@Test()public void testPop() {}Stack s = new UnboundedStack();String item1 = "1";String item2 = "2";s.push(item1);s.push(item2);assertNotSame(item1,s.top());s.pop();assertSame(item1,s.top());(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau 792Für dasSelbststudiumbzw. für dieBesprechung inÜbung/Praktikum.


Vergleiche Testfällemitalgebraischen Spezifikationen.(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau 793


Danksagung: Teile dieser Vorlesung gehen auf Dr. Volker Riediger’s OOPM 2008 Vorlesung zum <strong>Testen</strong> zurück.Hinweise zur VerständlichkeitSprechende Testnamen(Vergl. testAddUserWithoutPasswd() vs. test1().)Einfacher und kurzer Code für Testmethoden(Komplexe Tests testen oft mehr als ein Testszenario.)Nähe zwischen Eingaben und erwartetem Ergebnis(Damit sind Tests besser nachvollziehbar.)(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau794


ZusammenfassungUnit-<strong>Testen</strong> der funktionalen KorrektheitNicht behandelt:Last-<strong>Testen</strong> zu RessourcenAkzeptanz-<strong>Testen</strong>GUI-<strong>Testen</strong>...AusblickMehr OO(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!