Unit Tests und Fehlersuche



Ähnliche Dokumente
Testen mit JUnit. Motivation

Java: Vererbung. Teil 3: super()

Programmierkurs Java

SEP 114. Design by Contract

Einführung in die Informatik Tools

Objektorientierte Programmierung

Programmiertechnik II

Unit Testing mit JUnit. Dr. Andreas Schroeder

Software-Engineering Software-Management

Swp08-6 Verantwortliche: Yundensuren, Baigalmaa. Testkonzept

Erstellen von x-y-diagrammen in OpenOffice.calc

Softwaretests in Visual Studio 2010 Ultimate Vergleich mit Java-Testwerkzeugen. Alexander Schunk Marcel Teuber Henry Trobisch

Komponententest. Testen von Software Systemen. Übung 02 SS 2009 Version:

Software Engineering Interaktionsdiagramme

Einführung in die Java- Programmierung

Software Engineering in der Praxis

Fortgeschrittenes Programmieren mit Java. Test Driven Development

Vorkurs C++ Programmierung

Unit Tests. Programmiermethodik. Eva Zangerle Universität Innsbruck

Übung Grundlagen der Programmierung. Übung 03: Schleifen. Testplan Testergebnisse

JUnit - Test Driven Development. Bernhard Frey, Thorsten Stratmann, Jackson Takam, Michel Müller 1

Jetzt sollt ihr von der Vorlage der Grundversion 1.0 ein eigenes Textadventure erstellen.

Das Test-Framework JUnit ETIS SS04

Große Übung Praktische Informatik 1

Testen von graphischen Benutzeroberflächen. 24. Juni 2015

Testen von graphischen Benutzeroberflächen. 26. Juni 2013

Test-Driven Design: Ein einfaches Beispiel

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

Einführung in die Java- Programmierung

Programmieren. 10. Tutorium 4./ 5. Übungsblatt Referenzen

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

Software Engineering Klassendiagramme Assoziationen

Installation und Inbetriebnahme von Microsoft Visual C Express

MORE Profile. Pass- und Lizenzverwaltungssystem. Stand: MORE Projects GmbH

Erfolgsmeldungen im Praxisbetrieb

Java-Tutorium WS 09/10

Java Kurs für Anfänger Einheit 5 Methoden

Drei-Schichten-Architektur. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 16: 3-Schichten-Architektur 1 Fachkonzept - GUI

OP-LOG

Sichere Anleitung Zertifikate / Schlüssel für Kunden der Sparkasse Germersheim-Kandel. Sichere . der

Einführung in die Programmierung

Der Aufruf von DM_in_Euro 1.40 sollte die Ausgabe 1.40 DM = Euro ergeben.

Inbetriebnahme einer Fritzbox-Fon an einem DSLmobil Anschluss Konfiguration einer PPPOE-Einwahl (DSLmobil per Funk)

Testphase. Das Testen

Visual Basic Express Debugging

Grundlagen von Python

Design by Contract with JML

Arrays von Objekten. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Kopfzeile. Inhaltsverzeichnis

Arrays von Objekten. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Programmieren I. Übersicht. Vorlesung 12. Handout S. 1. Martin Schultheiß. Hochschule Darmstadt Wintersemester 2010/2011

Es sollte die MS-DOS Eingabeaufforderung starten. Geben Sie nun den Befehl javac ein.

Einführung in die objektorientierte Programmierung mit Java. Klausur am 19. Oktober 2005

Informatik 2 Labor 2 Programmieren in MATLAB Georg Richter

Übungen Programmieren 1 Felix Rohrer. Übungen

15.3 Bedingte Wahrscheinlichkeit und Unabhängigkeit

So erstellen Sie nützliche Beschreibungen zu Ihren Tradingdaten

Kostenstellen verwalten. Tipps & Tricks

Der lokale und verteilte Fall

1 Vom Problem zum Programm

Artikel Schnittstelle über CSV

ecaros2 - Accountmanager

Leichte-Sprache-Bilder

Datenübernahme easyjob 3.0 zu easyjob 4.0

Installationsanleitungen

Windows. Workshop Internet-Explorer: Arbeiten mit Favoriten, Teil 1

Fachdidaktik der Informatik Jörg Depner, Kathrin Gaißer

Suche schlecht beschriftete Bilder mit Eigenen Abfragen

25 Import der Beispiele

CRIBMASTER TECH DOC. Störbehebung bei Ausführung des Connectivity Checkers

5. Abstrakte Klassen. Beispiel (3) Abstrakte Klasse. Beispiel (2) Angenommen, wir wollen die folgende Klassenhierarchie implementieren:

Software Engineering. Zur Architektur der Applikation Data Repository. Franz-Josef Elmer, Universität Basel, HS 2015

Professionelle Seminare im Bereich MS-Office

GEORG.NET Anbindung an Ihr ACTIVE-DIRECTORY

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

Barcodedatei importieren

Praktische Übung 'JUnit-Test'

Java Entwicklung für Embedded Devices Best & Worst Practices!

Python SVN-Revision 12

Software-Engineering und Optimierungsanwendungen in der Thermodynamik

Mit der Maus im Menü links auf den Menüpunkt 'Seiten' gehen und auf 'Erstellen klicken.

Serviceanweisung Austausch Globalsign Ausstellerzertifikate

Schnittstelle DIGI-Zeiterfassung

Einführung in die Programmierung für Wirtschaftsinformatik

Installation des GeoShop Redirector für Apache (Stand ) ================================================================

Grundlagen. Kapitel 1

MSDE 2000 mit Service Pack 3a

3 Wie bekommen Sie Passwortlevel 3 und einen Installateurscode?

Treckerverein Monschauer Land e.v.

2. Programmierung in C

Technische Hochschule Georg Agricola WORKSHOP TEIL 3. IKT (Informations- und Kommunikationstechnik) an einer MorseApp erklärt

6.2 Scan-Konvertierung (Scan Conversion)

Übungen für Woche 10

Einstiegshilfe für das Übersenden elektronischer Teilnahmebestätigungen an ÄrztInnen

Ihre Interessentendatensätze bei inobroker. 1. Interessentendatensätze

Markus Wichmann. Testen von Java Code mit. JUnit

Übung: Verwendung von Java-Threads

The ToolChain.com. Grafisches Debugging mit der QtCreator Entwicklungsumgebung

Transkript:

Unit Tests und Fehlersuche SE 1 - Softwareentwicklungspraktikum Test Deadline! Sinnvolle Tests kompilierbar im CVS d.h. Schnittstellen zu Strategiemethoden etc. schon erstellen Kommentieren! Besser ein Kommentar als keine/unvollständige Testimplementierung! Tests müssen nicht erfolgreich laufen!! Roter Balken (aber müssen startbar sein)! Tests an den Szenarien / Anforderungen orientieren 1 2! Regeln jetzt im Netz Turnier JUnit! Erben von TestCase! public void testxyz() Methoden anlegen! Aufrufe von assertequals( "Beschreibung", SOLL, ist() ); asserttrue( "Beschreibung", ist() ); assertfalse( "Beschreibung", ist ); assertequals( "Beschreibung", SOLL, ist(), delta ); fail(); 3 4

JUnit Einfacher Test! Robot anlegen (eigene Strategie instanzieren)! Methode aufrufen! Ergebnis Kontrollieren public class SimpleStrategyMethodTest extends TestCase { public void testarithmethicmethod() { Corners robot = new Corners(); double result = robot.normalrelativeangle( 182 ); assertequals( "norm angle", -178, result, 0.00001 ); JUnit Komplexerer Test! Battle und einen RobotPeer anlegen! Robot anlegen (eigene Strategie instanzieren)! Peer und Robot verlinken! Strategie auf einen zu testenden Zustand setzen! Methode aufrufen! Ergebnis Kontrollieren evtl. unter Verwendung von Peer und Battle 5 6 JUnit Komplexerer Test public void testadvancedmethod() { Battle battle = new Battle( new DefaultBattleField( 500, 500 ), new RobocodeManager( false, null ) ); RobotClassManager classmanager = new RobotClassManager( new RobotSpecification( new File("irrelevant-string.class"), new File(""), "", false ) { ); battle.addrobot( classmanager ); RobotPeer peer = battle.getrobots().lastelement(); Crazy robot = new Crazy(); peer.setrobot( robot ); robot.setpeer( peer ); JUnit setup und teardown! Jeder TestCase kann einen methode setup haben (public, ohne Parameter)! Wird vor jeder testxy methode aufgerufen! Zusammenfassen von Szenarios mit ähnlicher Anfangssituation peer.setenergy( 100 ); robot.movingforward = true; robot.reversedirection(); assertfalse( "not moving forward any more", robot.movingforward ); assertequals( "distance remaining", -40000, peer.getdistanceremaining(), 1d );! teardown analog nach jedem Test 7 8

setup Beispiel setup Beispiel public void testadvancedmethod() { Battle battle = new Battle( new DefaultBattleField( 500, 500 ), new RobocodeManager( false, null ) ); RobotClassManager classmanager = new RobotClassManager( new RobotSpecification( new File("irrelevant-string.class"), new File(""), "", false ) { ); battle.addrobot( classmanager ); RobotPeer peer = battle.getrobots().lastelement(); Crazy robot = new Crazy(); peer.setrobot( robot ); robot.setpeer( peer ); peer.setenergy( 100 ); robot.movingforward = true; robot.reversedirection(); assertfalse( "not moving forward any more", robot.movingforward ); assertequals( "distance remaining", -40000, peer.getdistanceremaining(), 1d ); public void setup() { Battle battle = new Battle( new DefaultBattleField( 500, 500 ), new RobocodeManager( false, null ) ); RobotClassManager classmanager = new RobotClassManager( new RobotSpecification( new File("irrelevant-string.class"), new File(""), "", false ) { ); battle.addrobot( classmanager ); peer = battle.getrobots().lastelement(); robot = new Crazy(); peer.setrobot( robot ); robot.setpeer( peer ); private RobotPeer peer; private Crazy robot; public void testadvancedmethod() { peer.setenergy( 100 ); robot.movingforward = true; 9 10 JUnit Framework Test JUnit 3 JUnit 4! Hier vorgestellt: JUnit 3 Namenskonventionen zur Markierung der setupund test-methoden, etc.! Siehe Unit test im CVS Repository! JUnit 4 Verwendet Java 5 Annotations zur Markierung Man braucht nicht von TestCase erben 11 12

Debugging! Leif Eclipse Demo 13 14 Debugging Methodische Fehlersuche! zum Einkreisen eines Fehlers! Breakpoints an spannenden Stellen setzen! Variablenbelegung / Objekstruktur überprüfen mit dem Variables View mit edobs! Methode schrittweise ausführen! in interessante Methoden reinsteppen! Vorraussetzungen: Möglichst umfassenden Verständnis des Systems Nicht irgendwas ändern, sondern Arbeitsschritte merken Möglichst zeitnah nach den Änderungen testen 15 16

! Vorgehen Methodische Fehlersuche Nach Änderungen/Neuerungen Tests durchführen (Automatisch oder notfalls manuell) Art des Fehlers feststellen Falls möglich Schlussfolgerungen für Ursachen ziehen Mögliche Ursachen (in Reihenfolge der Wahrscheinlichkeit) überprüfen Falls nicht erfolgreich kleinschrittiger vorgehen!! NullPointerException Fehlerarten Direkte Ursache: Variable/Feld mit null belegt Problematische(s) Feld/Variable über erste Stacktrace- Zeile festzustellen (draufklicken!) Wahrscheinliche mittelbare Ursachen:! Initialisierung von Objekt oder Schleife nicht durchgeführt! Falsche Parameter wurden übergeben! zweite/folgende Stacktrace-Zeile anschauen! Am Anfang/Ende einer Liste/Menge angekommen! Logikfehler? Beseitigung! Recht offensichtlich nach bekannter Ursache 17 18! Andere Exceptions Fehlerarten Grund für die Exception nachschlagen! Teilweise abhängig von der aufgerufenen Methode (im Stacktrace nachgucken) Exception cause nachschauen z.b. wichtig bei InvocationTargetException Erste eigene Codezeile im Stacktrace suchen und überprüfen ob der Aufruf so korrekt sein sollte (evtl. mit Debugger die Parameter überprüfen) Falls Ursache immer noch unbekannt in Methode steppen (Debugger) und nachvollziehen, warum die Exception geworfen wird Stacktrace de.tu_bs.xmlreflect.util.errors.accessorexception: Could not find setter at de.tu_bs.xmlreflect.util.accessormethodsutilizer.setfield(accessormethodsutilizer.java:224) at de.tu_bs.coobra.objectchangeawarehelper.redo(objectchangeawarehelper.java:339) at de.tu_bs.coobra.objectchangeawarehelper.redo(objectchangeawarehelper.java:894) at de.tu_bs.coobra.localrepository.update(localrepository.java:3881) at de.uni_paderborn.fujaba.coobra.actions.checkoutaction.connect(checkoutaction.java:312) at de.uni_paderborn.fujaba.ant.cxrcheckoutgentask.executeimpl(cxrcheckoutgentask.java:120) at de.uni_paderborn.fujaba.ant.abstractgentask.execute(abstractgentask.java:165) at org.apache.tools.ant.unknownelement.execute(unknownelement.java:275) at org.apache.tools.ant.task.perform(task.java:364) at org.apache.tools.ant.target.execute(target.java:341) at org.apache.tools.ant.target.performtasks(target.java:369) at org.apache.tools.ant.project.executesortedtargets(project.java:1216) Caused by: java.lang.nosuchmethodexception: settarget( String ) at de.tu_bs.xmlreflect.util.accessormethodsutilizer.setfield(accessormethodsutilizer.java:234)... 19 more 19 20

Fehlerarten! Unerwartete Ergebnisse Ursache eingrenzen z.b. durch divide and conquer An problematischer Stelle steppen und einzelne Eingabe- und Ausgabewerte überprüfen und Operationen nachvollziehen Fazit! Test zum Fehler Bemerken! Im Fehlerfall Fehler eingrenzen Debugging! Immer: Kopf benutzen! 21 22