Grundzüge der Informatik 1 Teil 4: Qualitätssicherung 4.2 Zusicherungen Prof. Dr. Max Mühlhäuser FG Telekooperation TU Darmstadt assert: Java-Unterstützung für Tests • Java 1.4+ bietet eine eigene Unterstützung für Tests • Hierzu kann an einer beliebigen Programmstelle der Befehl assert genutzt werden • Verwendung: – assert Bedingung; – assert Bedingung : Ausdruck; • Dabei ist Bedingung ein logischer Ausdruck in JavaNotation • Die Übersetzung von Klassen mit assert erfolgt mit javac –source 1.4 Klassenname.java 28.10.2003 GdI1 - Teil 4.2: Qualitätssicherung: Zusicherungen 2 assert: Java-Unterstützung für Tests • Was bewirken die Befehle? • assert Bedingung; – Prüft, ob die Bedingung true ergibt – Falls nicht, wird ein AssertionError ausgelöst • assert Bedingung : Ausdruck; – Prüft, ob die Bedingung true ergibt – Falls nicht, wird ein AssertionError ausgelöst • Zusätzlich wird als Fehlermeldung der Ausdruck ausgegeben • Beispiel: assert n>= 0 : "n must be a natural number"; 28.10.2003 GdI1 - Teil 4.2: Qualitätssicherung: Zusicherungen 3 assert: Java-Unterstützung für Tests • Aus Effizienzgründen ist die Prüfung von assert standardmäßig abgeschaltet • Sie wird aktiviert durch folgenden Aufruf: java –enableassertions Klassenname oder java –ea Klassenname • Zusätzlich können Assertions für einzelne Packages oder Klassen aktiviert / deaktiviert werden – Bitte sehen Sie für Details in die Java Dokumentation! 28.10.2003 GdI1 - Teil 4.2: Qualitätssicherung: Zusicherungen 4 Was bringen Assertions? • Sinnvolle Überprüfung wichtiger Bedingungen • Besser als manuelles Codieren per if und Exception • Vorbedingung, Nachbedingung und Invariante sind teilweise angebbar • Das Fehlen von Quantifizierung schränkt deutlich ein – Keine Aussagen der Art „alle Elemente des Arrays...“ – Allerdings: Codierung des Tests als Methode denkbar – Diese Methode ist dann in der Assertion aufrufbar • assert ist erst seit JDK 1.4 ein Schlüsselwort! – Vorherige Versionen liefern einen Syntax Error... 28.10.2003 GdI1 - Teil 4.2: Qualitätssicherung: Zusicherungen 5 Anwendungsbeispiele • Gegeben sei folgende Java-Methode: public long faculty(int n) { assert n>=0 : "n must be >= 0 for faculty(n)!"; if (n == 0) return 1; else return n * faculty(n-1); } • faculty(n) liefert für n>=0 immer das korrekte Ergebnis • Für negative n wird bei angeschalteten Assertions folgendes ausgegeben: Exception in thread "main" java.lang.AssertionError: n must be natural for faculty(n)! • Falls Assertions ausgeschaltet sind, kommt es zu einem Stack Overflow – faculty(-1) = -1 * faculty(-2) = -1 * (-2) * faculty(-3) = … – Die Grenze n==0 wird auf diese Weise nie erreicht! – Abfrage sollte daher sicherer auf „<=0“ lauten 28.10.2003 GdI1 - Teil 4.2: Qualitätssicherung: Zusicherungen 6 Anwendungsbeispiel: Grenzen von assert public int arraySum(int[] values) { assert values != null : "Array null in arraySum"; assert values.length > 0 : "Array has no elements"; return segmentSum(values, 0, values.length-1); } public int segmentSum(int[] values, int start, int end) { assert (start>=0 && start<values.length):"Start invalid"; assert (start<=end && end<values.length) : "End invalid"; int sum = 0, pos; for (pos = start; pos <= end; pos++) sum += values[pos]; // assert (sum = Σ values[start]...values[end] return sum; } • Die Nachbedingung kann hier nicht formuliert werden, da der Allquantor bzw. Summenoperator fehlt 28.10.2003 GdI1 - Teil 4.2: Qualitätssicherung: Zusicherungen 7 Grenzen von assert • Generell sollte man überlegen, wofür man assert einsetzt: 1. Zur Erkennung und Meldung von Fehlerursachen bei der Entwicklung – Sinnvoll, da auf diese Weise Entwicklerversionen leichter als „Prototyp“ an den Kunden weitergegeben werden können 2. Zur Sicherstellung, dass ein Programmabbruch vor fatalem Fehlverhalten führt – – Dafür sind bereits die Exceptions gedacht… Was passiert, wenn der Nutzer die Assertions abschaltet? 3. Als Nachbildung von pre- und post-conditions und Invarianten – – Auch hierfür eignen sich Exceptions mindestens genauso gut …es sei denn, es wird in der Regel keine Prüfung erwartet (warum?) 4. Als Beschreibung, was die Methode tun sollte – Missbrauch von Assertions als „Dokumentationswerkzeug“ – Bremst Laufzeitsystem, aber meist ohne Vorteile zu bieten 28.10.2003 GdI1 - Teil 4.2: Qualitätssicherung: Zusicherungen 8