Prof. Dr. Stephan Kleuker Hochschule Osnabrück Fakultät Ing.-Wissenschaften und Informatik - Software-Entwicklung - Software-Qualität Sommersemester 2011 6. Aufgabenblatt Aufgabe 6 (3 Punkte) Gegeben sei folgende Klasse Schadensevaluator (auch auf der Web-Seite), deren Methode abzug getestet werden soll. Überprüfen Sie Ihre Ergebnisse mit CodeCover. (Methodenergebnisse dürfen vereinfachend ignoriert werden). public enum Waffe { Uzzi, Volksmusik, Wumme, Mine, Handgranate, Gebabbel } public class Schadensevaluator { public int abzug(Waffe links, Waffe rechts){ int ergebnis=0; if(links==Waffe.Gebabbel & rechts==Waffe.Wumme) ergebnis+=40; else ergebnis+=10; if(links==Waffe.Gebabbel | rechts==Waffe.Volksmusik) ergebnis+=100; if(links==rechts) ergebnis*=2; else ergebnis+=10; return ergebnis; } } a) Geben Sie eine Menge von Testfällen zur C0-Überdeckung von abzug an, die keine C1Überdeckung ist. b) Geben Sie eine Menge von Testfällen zur C1-Überdeckung von abzug an, die keine C2Überdeckung ist. Begründen Sie, warum keine C2-Überdeckung vorliegt. c) Geben Sie eine Menge von Testfällen zur C2-Überdeckung von abzug an, die keine C1Überdeckung ist. Begründen Sie, warum keine C1-Überdeckung vorliegt. Aufgabe 7 (5 Punkte) Um beliebige Objekte in Java sortieren zu können, muss eine Klasse X nur das Interface Comparable, besser Comparable<X> implementieren. Dieses Interfaces beinhaltet eine Methode public int compareTo(X x) die, falls this kleiner als x sein soll, einen beliebigen negativen Wert, für größer einen beliebigen positiven Wert und bei Gleichheit den int-Wert Null zurückliefern muss. Die Methode muss eine Halbordnung definieren, was anschaulich bedeutet, dass für zwei Objekte a und b, nur einer der drei Fälle, a kleiner b, a gleich b, a größer b, gelten darf. Weiterhin muss aus a kleiner b immer b größer a folgen. Für die aus der Vorlesung bekannte Klasse Mitarbeiter sehen die Ergänzungen wie folgt aus. public class Mitarbeiter implements Serializable, Comparable<Mitarbeiter>{ //... @Override public int compareTo(Mitarbeiter o) { return o.id-id; } Um in Java echte Kopien von Objekten erzeugen zu können, muss eine Klasse X das Interface Cloneable implementieren. Dazu gehört, dass es eine Methode clone() gibt, die eine echte Kopie des Objekts herstellt. Sollten in den Exemplarvariablen Objekte stehen, muss clone() rekursiv für diese Variablen angewandt werden. Ausnahme sind hier Strings, da Konstanten generell immer kopiert werden. Die Ergänzungen für die Klasse Mitarbeiter sehen wie folgt aus. public class Mitarbeiter implements Serializable, Comparable<Mitarbeiter>, Cloneable{ //... @Override Seite 1 von 2 Prof. Dr. Stephan Kleuker Hochschule Osnabrück Fakultät Ing.-Wissenschaften und Informatik - Software-Entwicklung - Software-Qualität Sommersemester 2011 6. Aufgabenblatt public Mitarbeiter clone(){ Mitarbeiter m = new Mitarbeiter(vorname, nachname); m.setId(id); return m; } Studierende wurden aufgefordert, eigene Sortieralgorithmen zu implementieren. Um diese flexibel vergleichbar zu machen, wurde ein Interface definiert, dass von den eigenen Sortierklassen realisiert werden soll. Das Interface sieht wie folgt aus und kann generisch beliebige Klassen T sortieren, die das Interface Comparable<T> realisieren. package hilfsklassen; import java.util.List; public interface MeinSortierer <T extends Comparable<T>>{ public List<T> sortieren(List<T> list); } Die Methode sortieren erhält eine Liste übergeben und soll eine sortierte Liste mit den gleichen Objekten zurückgeben. Eine Klasse ohne Implementierung muss damit wie folgt aussehen. package hilfsklassen; import java.util.ArrayList; import java.util.List; public class Sortierer1<T extends Comparable<T>> implements MeinSortierer<T> { @Override public List<T> sortieren(List<T> list) { // hier sortieren } } Von der Webseite der Lehrveranstaltung können acht Beispielimplementierungen des Interfaces in einem Projekt geladen werden. Mit der Klasse MainSortierer zeigen die Studierenden vermeintlich, dass zumindest sieben ihrer Ideen funktionieren. a) Überlegen Sie sich zunächst genau, wie man formalisieren kann, dass eine Liste mit beliebigen Elementen, die geordnet werden können, durch eine Methode geordnet wird. Schreiben Sie diese Kriterien zunächst als Text auf. b) Überlegen Sie sich anschaulich verschiedene Szenarien, also anschauliche Äquivalenzklassen, die eine Überprüfung des Sortierverhaltens einer Liste erlauben. Um die Aufgabe einzuschränken, sollten Sie mindestens fünf Szenarien benennen. c) Formulieren Sie die in b) gefundenen Testfälle für die verschiedenen Sortierer als JUnit4Testfälle. Ergänzen Sie gegebenenfalls Testfälle, um mit CodeCover eine 100% Statementund Brachüberdeckung zu erreichen. Welche Sortierer scheitern an welchen Testfällen? Beachten Sie, dass man langweilige Testkopien durch parametrisierte Testklassen vermeiden kann. d) [ohne Punkte, freiwillig] Die meisten der fehlerhaften Sortierer lassen sich recht einfach korrigieren. Führen Sie diese Korrekturen, z. B. in einem eigenen Eclipse-Projekt, durch und testen Sie diese Lösungen. Außer zu d) müssen Sie nebenbei den genauen Programmcode nicht verstehen. Seite 2 von 2