• Keine Ergebnisse gefunden

Programmierprojekt: So0ware Tests

N/A
N/A
Protected

Academic year: 2022

Aktie "Programmierprojekt: So0ware Tests"

Copied!
15
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Programmierprojekt:

So0ware Tests

Anne6e Bieniusa

Sommersemester 2017

(2)

Testen

•  Kernfrage: Erfüllt die So0ware ihre Anforderungen / SpezifikaGon?

•  FunkGonale Anforderungen

– Korrekte Ergebnisse bei Berechnungen

•  Nicht-funkGonale Anforderungen

– Laufzeit von Algorithmen, Look-and-feel der GUI, Skalierbarkeit von Servern, Latenzzeiten ...

(3)

Testen

•  „Ein Test [...] ist der überprü&are und jederzeit wiederholbare Nachweis der Korrektheit eines

So0warebausteines relaGv zu vorher festgelegten Anforderungen“ (Denert, 1991)

•  WichGger Baustein der Qualitätssicherung in der So0ware-Entwicklung

•  „Program tesGng can be used to show the presence of bugs, but never show their

absence!“(Edsger W. Dijkstra)

(4)

Klassifizierung nach Umfang

•  Unit-Tests (Komponententests) für einzelne Komponenten der So0ware

•  Integra<onstests für die Zusammenarbeit von Komponenten

•  Systemtest für die IntegraGon in die Anwendungspla`orm

•  Abnahmetests für die InterakGon mit dem Benutzer / Kunden

(5)

Klassifizierung von InformaGonsstand

•  White-Box-Tests inspizieren auch den inneren Auaau einer Komponente, häufig vom

Entwickler durchgeführt

•  Black-Box-Tests agieren mit einer

wohldefinierten Schni6stelle, ohne Kenntnis über den tatsächlichen Auaau einer

Komponente, häufig von unabhängigen Instanzen auf Basis der DokumentaGon durchgeführt

(6)

Methodik

•  Ziel: Möglichst hohe Abdeckung des Java-Codes durch Tesgälle

–  Möglichst jede Methode einer Klasse sollte getestet werden

–  Jede Methode sollte mit verschiedenen Parametern getestet werden

–  Randfälle sind wichGg!

•  [ Randomisierte Tests erzeugen zufällige Tesgälle -> verringert die Chance, dass der Programmierer Randfälle übersehen hat ]

(7)

Junit4

•  Framework zum Unit-TesGng von Java-Klassen

•  Einfache Möglichkeit Tests zu spezifizieren und diese automaGsiert auszuführen

•  Reihenfolge der Ausführung ist nicht spezifiziert

•  Tesgälle müssen daher unabhängig von einander sein

(8)

Auaau eines Tests

•  Bei Hinzufügen eines neuen JUnit4- Tests wird folgender Stub erzeugt (und das Junit4 Package zum Build-Pfad hinzugefügt):

import sta<c org.junit.Assert.*;

import org.junit.Test;

public class ProjektTest { @Test

public void test() {

fail("Not yet implemented");

} }

(9)

AsserGons - Booleans

•  AsserGons testen, ob eine Bedingung erfüllt ist, andernfalls wird der Test nicht bestanden

•  Um den Fehler zu beschreiben, kann man einen kurze Erklärung hinzufügen

@Test

public void testAssertFalse() {

org.junit.Assert.assertFalse("failure - should be false", false);

}

@Test

public void testAssertTrue() {

org.junit.Assert.assertTrue("failure - should be true", true);

}

(10)

AsserGons - Objekte

@Test

public void testAssertNotNull() {

org.junit.Assert.assertNotNull("should not be null", new Object());

}

@Test

public void testAssertNull() {

org.junit.Assert.assertNull("should be null", null);

}

@Test

public void testAssertNotSame() {

org.junit.Assert.assertNotSame("should not be same Object", new Object(), new Object());

}

@Test

public void testAssertSame() {

Integer aNumber = Integer.valueOf(768);

org.junit.Assert.assertSame("should be same", aNumber, aNumber);

}

(11)

AsserGons - Equals

@Test

public void testAssertArrayEquals() { byte[] expected = "trial".getBytes();

byte[] actual = "trial".getBytes();

org.junit.Assert.assertArrayEquals("failure - byte arrays not same", expected, actual);

}

@Test

public void testAssertEquals() {

org.junit.Assert.assertEquals("failure - strings are not equal", "text", "text");

}

(12)

Testen von ExcepGons

@Test(expected= IndexOutOfBoundsExcepGon.class) public void empty() {

new ArrayList<Object>().get(0);

}

(13)

Test fixtures

import org.junit.*;

public class TestFoobar { @BeforeClass

public sta<c void setUpClass() throws ExcepGon { // wird zu Beginn einmal ausgeführt

}

@Before

public void setUp() throws ExcepGon { // wird vor jedem Test ausgeführt }

@Test

public void test1() { // ein Test

}

@A0er

public void tearDown() throws ExcepGon { // wird nach jedem Test ausgeführt }

@A0erClass

public sta<c void tearDownClass() throws ExcepGon { // wird ganz am Schluss einmal ausgeführt

} }

•  Manchmal ist es sinnvoll, dass sich

mehrere Tesgälle eine Testumgebung teilen

•  Um die Unabhängigkeit zu gewährleisten, muss vor/nach dem Test die Umgebung

wiederhergestellt werden (setUp / tearDown)

(14)

Junit für den Stundenverwaltung

•  Tests für Anwendungslogik

–  Ist die Berechnung von Überstunden/fehlenden Stunden/ etc.

korrekt?

•  Tests für das Lesen und Schreiben von Daten

–  Sind nach einem Update alle neuen und alten Einträge vorhanden?

–  WichGg: Regressionstests, wenn Formate geändert werden!

•  Tests für das Erstellen von Übersichten

–  Summe aller Einnahmen / Ausgaben, pro Kategorie

•  NICHT TESTEN mit Junit:

–  Datenbank funkGoniert

–  GUI / Moustache / HTML Seiten etc. lassen sich nur schwer automaGsiert testen

(15)

Strategien zur Testbarkeit

•  Modularisierung

– Testbare Einheiten idenGfizieren – Interfaces nutzen

– Berechnung und Modell von GUI trennen!!!

•  Einfache Tests mit guter Testabdeckung

– Randfälle! (leere CollecGons)

•  DokumentaGon von Verhalten in ÜbereinsGmmung mit Tests

Referenzen

ÄHNLICHE DOKUMENTE

During this analysis we classified tests into unit and integration tests according to the definitions of the Institute of Electrical and Electronics Engineers (IEEE) and

Most obvious difference to doctest: test cases are not defined inside of the module which has to be tested, but in a separate module just for testing. In that

• heute: jeder Gruppe wird eine Gruppe zugeordnet, deren Server und Client getestet wird.. • Testbericht bis Montag, 24.01., 12:00 erstellen und an

sein, um Intelligenz zu simulieren. „situatedness“) meint, dass sich ein Roboter aktiv in seiner Umwelt bewegen sollte; Verkörperung (engl. „embodiment“) bedeutet, dass

Die Quantifizierung hämatopoietischer Stammzellen (CD34-positive Stammzellen) bei Patienten im Stammzell-Transplantationsprogramm erfolgt aus dem peripheren Blut während

JUnit Test Infected: Programmers Love Writing Tests, JUnit: a Cook's Tour, JUnit FAQ, JUnit JavaDoc.

Auf  der Homepage  finden  Sie  vorgegebene  Klassen  für  die  Implementierung.  Viele  Klassen sind  für  diese  Übung  noch  nicht  nötig,  sondern  werden 

This study finds evidence supportive of Fisher hypothesis in East Asian economies using panel unit root tests, which allow for cross-country variations in the estimation.. Among