Lernziele

Zentrale Konzepte in diesem Kapitel: Testen, Modultests, Fehler beseitigen, Tests automatisieren


9.1 Einführung

Ein logischer Fehler liegt vor, wenn ein Programm ohne Probleme übersetzt und aus geführt werden kann, aber nicht das gewünschte Ergebnis liefert.

Konzept
Testen dient der Überprüfung, ob ein Stück Software (eine Methode, eine Klasse oder ein Programm) das gewünschte Verhalten zeigt.

Konzept
Fehlerbeseitigung bezeichnet die Suche nach der Ursache eines Fehlers und seine Beseitigung.

Wenn Fehlerbeseitigung kommt nach dem Testen: Wenn Fehler duch Tests aufgezeigt wurden, verwenden wir Techniken zur Fehlerbeseitigung, um die Ursache dieser Fehler zu entdecken und sie zu beseitigen.

9.2 Modultests

Konzept
Modultests beziehen sich auf Tests einzelner Teile einer Anwendung, zum Beispiel auf Methoden und Klassen

Modultests können lange vor der Fertigstellung einer Anwendung durchgeführt werden. Jede einzelne Methoden kann und sollte, sobald sie geschrieben und übersetzt wurde, getestet werden.

Frühes Experimentieren und Testen hat viele Vorteile.

  • Macht das Finden und Beheben von Fehlern in einem System einfacher und billiger.
  • Auf diese Weise eine Reihe von Testfällen und Ergebnissen sammeln, die wir immer wieder einsetzen können

Ein Schlüsselelement beim Testen ist das Überprüfen von Grenzfällen, weil gerade dort häufig etwas schiefgeht.

Positves und negatives Testen

Konzept
Positives Testen ist das Test der Fälle, die funktionieren sollten.
Negatives Testen ist das Test der Fälle, die fehlschlagen sollten.

Fallstrick
Ein von Anfängern häufig gemachter Fehler ist es, auschliesslich positive Tests durchzuführen. Negatives Testen – das Prüfen, ob die Fälle, die fehlschlagen sollten, auch tatsächlich fehlschlagen, und das in möglichst organisierter Weise – ist ein wichtiger Bestandteil jedes guten Testvorgehens


9.3 Tests automatisieren

Konzept
Automatisieren von Tests vereinfacht den Prozess des Regressionstestens

Gründliches Testen wird unter anderem deshalb häufig vernachlässift, weil Testen eine zeitaufwendige und relativ langweilige Tätigkeit ist, wenn sie von HAnd ausgeführt wird.

Regressionstests

Ein Regressionstest ist ein Test, der bereits erfolgreich gelaufen ist und wiederholt wird, um eine neue Version der Software zu überprüfen.

Automatisierte Tests mit JUnit

JUnit ist ein populäres Test-Rahmenwerk zur Unterstützung von wohlstrukturierten Modultests und Regressionstests in Java.

import static org.junit.Assert.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

/**
 * Die Testklasse ProduktTest.
 *
 * @author  mik
 * @version 0.1
 */
public class ProduktTest
{
    /**
     * Standardkonstruktor für die Testklasse ProduktTest
     */
    public ProduktTest()
    {
    }

    /**
     * Setzt das Testgerüst fuer den Test.
     *
     * Wird vor jeder Testfallmethode aufgerufen.
     */
    @Before
    public void setUp()
    {
    }

    /**
     * Abschluss.
     *
     * Wird  nach jeder Testfallmethode aufgerufen.
     */
    @After
    public void tearDown()
    {
    }

    /**
     * Teste, ob ein Kommentar hinzugefügt werden kann, und ob der Kommentarzähler anschließend korrekt ist.
     */
    @Test
    public void testKommentarHinzufuegen()
    {
        Produkt produkt1 = new Produkt("Hirnchirurgie für komplette Idioten", 21998);
        assertEquals(true, produkt1.kommentarHinzufuegen("James Duckling", "Geniales Buch. Ich führe jetzt jede Woche eine Gehirn-OP durch.", 4));
        assertEquals(1, produkt1.gibAnzahlKommentare());
    }

    /**
     * Teste, ob ein Kommentar mit illegaler Bewertung abgelehnt wird.
     */
    @Test
    public void testUngueltigeBewertung()
    {
        Produkt produkt1 = new Produkt("Java fuer komplette Idioten, Band 2", 19900);
        assertEquals(false, produkt1.kommentarHinzufuegen("Joshua Black", "Das Geld nicht wert. Die Schrift ist zu klein.", -5));
    }

    /**
     * Teste, ob ein Produkt korrekt initialisiert wird (Name und Preis).
     */
    @Test
    public void testInit()
    {
        Produkt produkt1 = new Produkt("Testname", 1000);
        assertEquals("Testname", produkt1.gibName());
        assertEquals(1000, produkt1.gibPreis());
    }
    
    @Test
    public void kommentarHinzufuegen()
    {
        Produkt produkt1 = new Produkt("Hirnchirurgie für komplette Idioten", 9899);
        assertEquals(true, produkt1.kommentarHinzufuegen("Fred", "Großartig - Ich führe jetzt jede Woche eine Gehirn-OP durch.", 4));
    }
}

Konzept
Eine Zusicherung ist eine boolescher Ausdruck für eine Bedingung, von der wir erwarten, dass sie wahr ist. Wenn sie nicht wahr ist, dann sagen wir, dass die Zusicherung fehlschlägt. Dies weist auf einen Fehler in unserem Programm hin.

Der Aufruf assertEquals überprüft, ob das von diesen MEthoden zurückgelieferte Ergebnis zum erwarteten Wert passt. Darüber hinaus sehen Sie vor der MEthode ein neues Konstrukt @Test.

Testgerüste

Konzept
Ein Testgerüst besteht aus einer Menge von Objekten in einem definierten Zustand, die als Grundlage für einen Modultest dienen.

/**
 * Setzt das Testgerüst für den Test
 * Wird vor jeder Testfallmethode aufgerufen
 *
 *
 */
 @Before
 public void setUp(){
   produkt1 = new Produkt("JavaBuch",12345);
   produkt2 = new Produkt("Testen",1234);
   produkt2.kommentarHinzufuegen("Fred","wer?",5); 
 }

Die Methode setUp wird automatisch jedes Mal aufgerufen, bevor eine Testmethode aufgerufen wird. (Die Kennzeichnung @Before über dem Methodenkopf stellt dies sicher) Dies bedeutet, dass eine individuelle Testmethode nun nicht mehr ihr eigenes Testgerüst auszubauen bruacht.

9.4 Manuelle Ausführung

Manuelle Ausführung (walktrhough) ist eine Technik, die eindeutig zu wenig eingesetzt wird. Das liegt möglicherweise daran, dass sie eine vergleichsweise “untechnische” Technik zum Testen und zur Fehlerbeseitigung ist. EIne manuelle Ausführung erfordert, dass Sie den Quelltext der zu untersuchenden Klasse ausdrucken und sich dann weit weg von Ihrem Computer mit dem Ausdruck hinsetzen.

Konzept
Eine manuelle Ausführung ist das zeilenweise Durchgehen durch einen Quelltextabschnitt, bei dem Zustandsänderungen und das Verhalten einer Anwendung beobachtet werden.

9.5 Ausgabenanweisungen

Die vermutlich am häufigsten eingesetzte Technik zum Verstehen und zur Fehlerbeseitigung in Programmen. Während der Ausführung eines Programms liefern diese zusätzliche Ausgabeanweisungen dem Benutzer informationen wie:

  • welche Methoden aufgerufen wurden
  • die Werte von Parametern
  • die Reihenfolge, in der Methoden aufgerufen wurden
  • die Werte von Datenfeldern und lokalen Variablen an strategisch wichtigen Stellen
Zuletzt bearbeitet: 21. Oktober 2022

Autor

Kommentare

Schreibe eine Antwort oder einen Kommentar

Deine EMail-Adresse wird nicht veröffentlicht.