Navigation überspringen

Assertions

Eine Assertion  ist eine weitere Kontrollstruktur. Das Wort Assertion bedeutet auf deutsch so viel wie Behauptung oder Annahme. Ich kann also mithilfe von Asserstions gewisse Annahmen über den aktuellen Zustandes meines meines Programmes überprüfen. Eine Assertion sorgt dafür, dass das Programm dann nur weiterläuft, wenn die Assertion wahr ist.

Ein anschauliches Beispiel wäre folgendes:

int age = 16;
assert age  > 18 : "Zu jung. Du musst 18 oder älter sein, um fortzufahren."; // Das Programm endet in diesem Fall in dieser Zeile
print ("Herzlich Willkommen!");


Die Zeile "Herzlich Willkommen!" wird nicht ausgegeben, weil das Programm aufgrund der Assertion in der Zeile davor endet und nicht weiter läuft.  Das Programm wird - wenn die Assertion false ist - sofort beendet und der Code danach nicht mehr ausgeführt wird.

Aufbau

Eine Assertion beginnt mit dem Schlüsselwort assert, darauf folgt ein logischer Ausdruck gefolgt von einem Semikolon oder Doppelpunkt. Der Doppelpunkt ist der Anfang der optionalen Fehlermeldung bzw. Feedback-Nachricht.

assert BEDINGUNG;
 
assert BEDINGUNG : FEHLERMELDUNG; // Fehlermeldung = optional

Der logische Ausdruck kann verschiedene Formen haben:

assert true: "Das hier ist immer wahr"; // technisch korrekt, aber natürlich nicht sinnvoll, besser ...

boolean foo = false;
assert foo : "Dieser Wert kann sich ändern";
 
int a = 10;
int b = 6;
assert a > b : "Fehler: a darf nicht kleiner als b sein";
 
int c = 5;
assert a > b && a % c == 0 : "Fehler: a darf nicht kleiner als b und bzw. oder muss durch c teilbar sein!";

Verwendung

Schauen wir uns an, wozu man Assertions verwenden kann. Assertions werden verwendet, wenn eine Annahme überprüft werden soll und wenn die Annahme nicht zutrifft, das Programm (mit einer Fehlermeldung) beendet werden soll.

Assertions werden am häufigsten zum Testen von Code eingesetzt. Also schreiben wir mal eine kleines Programm, mit dem wir unseren Code testen können ...

Wir möchten eine Funktion schreiben, die überprüft, ob ein gewisser Buchstabe in einem Text enthalten ist. Sowohl der Text als auch der Buchstabe sollen als Parameter übergeben werden. Der Rückgabewert der Funktion soll ein boolean sein. Der Code für diese Funktion könnte z.B. folgendemaßen aussehen:

boolean checkChar( String txt, char c) {
   
  // Die String-Methode indexOf() liefert -1, wenn der Buchstabe nicht im String vorkommt
  boolean kommtVor = txt.indexOf(c) > 0;
  return kommtVor;
}

Nun können wir unsere Funktion testen, indem wir eine Assertion formulieren.

void setup () {
 
   // Wir gehen davon aus, dass die Buchstaben 'H' und 'i' vorkommen, 'o' aber nicht.
 
  assert  checkChar("Hi", 'i') == true : "Fehler (i)! Erwartet: true. Tatsächlich: " + checkChar("Hi", 'i');
  assert  checkChar("Hi", 'H') : "Fehler (H)! Erwartet: true. Tatsächlich: " + checkChar("Hi", 'H');   // Das == können wir auch weglassen, da wir bereits einen booleschen Wert haben
  assert !checkChar("Hi", 'o') : "Fehler(o)! Erwartet: false. Tatsächlich: " + checkChar("Hi", 'o');  // für false setzen wir einfach ein ! vor die Funktion
 
  println("Alle Tests bestanden");
}

Wenn wir diesen Code auführen wird unser Programm mit folgender Fehlermeldung beendet:

AssertionError: Fehler (H)! Erwartet: true. Tatsächlich: false

Unsere Funktion verhält sich also nicht wie erwartet. Das liegt daran, dass die Funktion indexOf() bei 0 anfängt zu zählen. Daher müssen wir in unserer Funktion aus dem > ein >= machen:

boolean checkChar( String txt, char c) {
   
  // Die String-Methode indexOf() liefert -1, wenn der Buchstabe nicht im String vorkommt
  boolean kommtVor = txt.indexOf(c) >= 0;  // So ist es korrekt
  return kommtVor;
}

Wenn wir unseren Code nun ausführen bekommen wir am Ende die  Ausgabe: Alle Tests bestanden.

In solchen Fällen ist der Einsatz von Assertions sehr sinnvoll, da das Programm in beiden Fällen "zu Ende" ist, wenn die Assertions überprüft wurden. Nur einmal Endet das Programm mit und einmal ohne Fehlermeldung. Du kannst Assertions also verwenden, um zu überprüfen, ob eine Funktion, die du geschrieben hast tatsächlich das macht, was sie soll.

Hinweis: Wenn du deine Anwendung aus dem Processing Editor heraus startest mit "Play" und dann eine Assertion ausgelöst wird, dann friert das Anwendungsfenster ein und stürzt ab. Wenn du deine Anwendung aber exportierst und daraus eine .exe machst, dann wird das Programm im Falle eine Assertion einfach beendet und friert nicht ein.

Assertions beenden das Programm sofort. Eine andere Möglichkeit das Programm zu beenden ist dei Verwendung der Funktion exit(). Allerdings beendet exit() das Programm erst nach Beendigung des aktuellen Durchlaufs von draw.


Zusammenfassung

Assertions werden verwendet, um Annahmen in der Porgrammierung zu überprüfen und das Programm zu beenden, wenn diese Annahmen nicht eintreffen. Diese Annahmen werden in Form von booleschen Ausdrücken formuliert. Einer der häufigsten Anwendungsfälle für Assertions ist das Testen von Software. Hier wird überprüft, ob eine Funktion oder ein Programm die gewünschten bzw. die erwarteten Ergebnisse liefert.

Assertions sind folgendermaßen aufgebaut:

assert LOGISCHER_AUSDRUCK;
 
assert LOGISCHER_AUSDRUCK : FEHLERMELDUNG; // Fehlermeldung = optional

Wichtig: Assertions beenden das Programm sofort, wenn der logische Ausdruck false ist. Aller Code, der danach kommt wird nicht mehr ausgeführt.

Made with eXeLearning (New Window)