assert - TU Darmstadt

Werbung
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
Herunterladen