Unit Tests in der Testgetriebenen Entwicklung



Ähnliche Dokumente
Fortgeschrittenes Programmieren mit Java. Test Driven Development

Software-Engineering Software-Management

Das Test-Framework JUnit ETIS SS04

JUnit. Software-Tests

Testen mit JUnit. Motivation

Testgetriebene Entwicklung mit JUnit4

Swp08-6 Verantwortliche: Yundensuren, Baigalmaa. Testkonzept

Programmiertechnik II

Thema: Testen von objektorientierter Software

Testgetriebene Entwicklung

Einführung in die Informatik Tools

Test-Driven Design: Ein einfaches Beispiel

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

Programmieren in Java

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

Unit Tests mit Junit 4. Dario Borchers

Testen mit JUnit. Apcon Workplace Solutions Member of itelligence. Testen von Java-Code mit JUnit. ÿstruktur eines Testfalls

Klassenentwurf. Wie schreiben wir Klassen, die leicht zu verstehen, wartbar und wiederverwendbar sind? Objektorientierte Programmierung mit Java

Software - Testung ETIS SS05

Testphase. Das Testen

Probeklausur. Lenz Belzner. January 26, Lenz Belzner Probeklausur January 26, / 16

Unit Testing mit JUnit. Dr. Andreas Schroeder

SEP 114. Design by Contract

Java: Vererbung. Teil 3: super()

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

Objektorientierte Programmierung

Die Welt der SW-Qualität Ein Streifzug in 30 Minuten! Johannes Bergsmann Eigentümer

Unit Tests. Programmiermethodik. Eva Zangerle Universität Innsbruck

Test-driven development JUnit-Test. Lars Varain

Projektmanagement. Vorlesung von Thomas Patzelt 9. Vorlesung

Software-Entwicklung

Agile Vorgehensmodelle in der Softwareentwicklung: Scrum

Diplomarbeit. Konzeption und Implementierung einer automatisierten Testumgebung. Thomas Wehrspann. 10. Dezember 2008

Unit Tests und Fehlersuche

Modellbasierte Softwareentwicklung

Testplan. Hochschule Luzern Technik & Architektur. Software Komponenten FS13. Gruppe 03 Horw,

Unit-Test Theorie und Praxis. Stephan Seefeld, INGTES AG

Programmierkurs Java

Java Kurs für Anfänger Einheit 4 Klassen und Objekte

T1 - Fundamentaler Testprozess

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


Javadoc. Programmiermethodik. Eva Zangerle Universität Innsbruck

Markus Wichmann. Testen von Java Code mit. JUnit

Softwareentwicklungsprozess im Praktikum. 23. April 2015

Daniel Warneke Ein Vortrag im Rahmen des Proseminars Software Pioneers

Die Softwareentwicklungsphasen!

Qualitätsmanagement im Projekt

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...

Konzeption. und prototypische Implementierung. eines Werkzeuges. für den funktionalen Klassentest

Einführung in die Programmierung

Programmierung 2 Studiengang MI / WI

Some Software Engineering Principles

Übung: Verwendung von Java-Threads

SWT II Projekt. Chat - Anwendung. Pflichtenheft 2000 SWT

Software Engineering in der Praxis

Testen von graphischen Benutzeroberflächen. 26. Juni 2013

Neue Funktionen in Innovator 11 R5

am Beispiel von JUnit

Klausur zur Einführung in die objektorientierte Programmierung mit Java

robotron*e count robotron*e sales robotron*e collect Anmeldung Webkomponente Anwenderdokumentation Version: 2.0 Stand:

Software Entwicklung II (SS12)

Software Systems Engineering

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

Softwaretechnik (Allgemeine Informatik) Überblick

Agiles Testen. Gedankensammlung. 17. November Patrick Koglin

Prinzipien Objektorientierter Programmierung

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

Informationswirtschaft II Rational Unified Process (RUP)

Informationswirtschaft II

Java Einführung Abstrakte Klassen und Interfaces

VEDA Managed Services VEDA-SOFTWARE

Client-Server-Beziehungen

Software Engineering Klassendiagramme Assoziationen

Systematisches Testen der Funktionalität von Softwaresystemen. 17. Juni 2015

Qualität von Software - Prof. Schlingloff, Lackner - SS2013 DYNAMISCHER TEST. Whitebox Testen mit JUnit

Prozessbewertung und -verbesserung nach ITIL im Kontext des betrieblichen Informationsmanagements. von Stephanie Wilke am

Qualitätssicherung im Lebenszyklus des itcs. Anspruch und Wirklichkeit.

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

Comparison of Software Products using Software Engineering Metrics

Test Driven Development

Das System für Ihr Mitarbeitergespräche

Praktische Übung 'JUnit-Test'

Prof. Dr. Uwe Schmidt. 21. August Aufgaben zur Klausur Objektorientierte Programmierung im SS 2007 (IA 252)

Programmierung 2 Studiengang MI / WI

Große Übung Praktische Informatik 1

Anpassung einer freien SSL/TLS Implementierung an die Kertasarie VM

6. Programmentwicklung

SCHULUNG MIT SYSTEM: E-LEARNING VON RAUM21

U08 Entwurfsmuster (II)

Testen mit JUnit. Martin Wirsing. Ziele. in Zusammenarbeit mit Michael Barth, Philipp Meier und Gefei Zhang

IKP Uni Bonn Medienpraxis EDV II Internet Projekt

Ein Blick voraus. des Autors von C++: Bjarne Stroustrup Conrad Kobsch

Code verifizieren mittels

Kapitel 2: Der Software-Entwicklungsprozess

Software-Lizenzierung und Aktivierung: Verteilen von Software mit Apple Remote Desktop

Der frühe Tester fängt den Bug

Vorstellung. Wie entsteht Architektur in Scrum

JUnit. Unit testing unter Java

Konsolidierung und Neuimplementierung von VIT. Aufgabenbeschreibung für das Software Engineering Praktikum an der TU Darmstadt

Transkript:

Unit Tests in der Testgetriebenen Entwicklung Reduzierung des Testanteils am Gesamtsoftwareentwicklungsaufwand -- neue Strategien und Tools -- Hauptseminar Systemorientierte Informatik Christian Krauß

Teil I Testen Warum? Was? Wann? Wie?

Warum? Testen Aufspüren möglichst vieler (aller) Fehler Überprüfen von (nicht)funktionalen Anforderungen Besitzt System geforderte Funktionalität? Erfüllt es Zeitanforderungen? Läuft es auf der Zielplattform? Verhinderung von Seiteneffekten Was? Code innerhalb eines Blocks Methoden Klassen funktional zusammengehörende Einheiten Gesamtsystem

Testen Wann? Wie? (am Beispiel Unit Test) parallel zur Programmierung White-Box nach Fertigstellung eines Moduls Black-Box interne Struktur bekannt (evtl. für Messungen bzw. Stimulation zugängig) Strukturtest nur Schnittstellen des Systems sind zugänglich (Ein-/Ausgänge) Funktionstest

Teil II + Direktiven Testgetriebener Entwicklung + Entwicklungszyklus + JUnit

Testen Erkenntnisse und Ideen Erfahrungen - Testen ist häufig: - die letzte Phase in wasserfallartigen Projekten - ein der Programmierung untergeordneter Prozess - das Erste, was über Bord geht, wenn es eng wird - nur ad hoc, selten systematisch. Probleme: - Fehler werden zu spät erkannt - Entwickler erhalten wenig Feedback über Qualität des Codes - Seiteneffekte nach Änderung von Design bzw. Implement. - Code ist unzureichend testbar

Testen Erkenntnisse und Ideen Anforderungen an effektive Teststrategien, Testen sollte: - möglichst zeitnah zur Programmierung erfolgen schnelles Feedback über Softwarequalität so häufig wie das Kompilieren ausführen - automatisiert wiederholbar sein - pragmatisch sein (kein Beweis der Fehlerfreiheit) - mehr bringen als kosten

Direktiven - Übersicht Die Testgetriebene Entwicklung definiert folgende Direktiven: 1. Motivieren Sie jede Änderung des Programmverhaltens zuvor durch einen automatisierten Test. 2. Bringen Sie Ihren Code immer in die einfachste Form (Refactoring). 3. Integrieren Sie Ihren Code so häufig wie nötig. Die Direktiven stehen im engen Zusammenhang mit der iterativinkrementellen Entwicklung von Software (Anwendung: XP)

Direktive I Motivieren Sie jede Änderung des Programmverhaltens zuvor durch einen automatisierten Test. Test beschreibt Anforderung Test schlägt fehl Funktionalität implementieren Idee: Test First Programming Test treibt Entwicklung voran - Test sichert Erfüllung der Anforderung - nur das programmieren, was erforderlich ist - jederzeit Kontrolle über System behalten - schnelles Feedback (Erfolgserlebnisse) Testerfolg

Direktive II: Refactoring Bringen Sie Ihren Code immer in die einfachste Form. Never change a running system? Änderungen führen zu Seiteneffekten werden auf Mindestmaß beschränkt Alterung der Software Refactoring: - ständige Anpassung der Struktur (Funktionalität unverändert) - zielorientiert (nur im Zusammenhang mit nächster Anforderung) - in kleine Refactorings zerlegen - Komponententests verhindern Seiteneffekte (Voraussetzung!!!)

Direktive III: Integration Vorteile häufiger Integration: - Änderungen anderen Entwicklern zugängig machen - kleinere Refactorings (Merge-Aufwand verringert) - Konflikte aufdecken, wenn sie klein sind Integration verpflichtet Entwickler: alle Tests des integrierten Systems laufen (Fehlschlag: Änderungen rückgängig machen) lauffähige Version jederzeit verfügbar integriertes System erfüllt mehr und mehr Akzeptanztests Prinzip der schnellen Feedbacks (bzgl. Gesamtsystem)

Komponententests mit JUnit - Tool (Framework) zur Durchführung von automatisierten Unit Tests - Sprache: Java - aktuelle Version: 3.8.1 - Autoren: Kent Beck, Erich Gamma - Lizenz: Open Source, IBM CPL - Test: Softwareeinheiten in Isolation zu anderen Einheiten (Methoden, Klassen) - Testfälle in Java kodiert (in Testklassen zusammengefasst) - Integration in IDEs (z.b. als Eclipse-Plugin) - Unterstützung der iterativ-inkrementellen testgetriebenen Entwicklung

Iterativ-inkrementelle Entwicklung Grundprinzipien: Entwicklungszyklus kleine Schritte Vorgehensweise: Vorbereitung: Anforderungen an Softwareeinheit definieren ToDo-Liste 1. zu realisierende Anforderung auswählen 2. Anforderungen in Testklasse integrieren (Testfall) Daumenregel: je Klasse eine Testklasse nur ein Test zu jedem Zeitpunkt (jeder Test muss seinen Wert beweisen) 3. Testklasse in Testsuite integrieren (einmalig)

Iterativ-inkrementelle Entwicklung Vorgehensweise (Fortsetzung): 4. Kompilieren Fehlschlag Feedback: neue Klasse/Methode tatsächlich erforderlich 5. Klasse mit leeren Operationsrümpfen versehen 6. Kompilieren Erfolg, Test Fehlschlag Feedback: Testklasse korrekt in Suite integriert 7. Methode implementieren nur soviel Code, dass Test erfüllt wird 8. Test Erfolg/Misserfolg der gerade geschriebene Code macht den Unterschied Rückschritte zur letzten funktionierenden Version klein 9. Refactoring durch Tests absichern Seiteneffekte verhindern

Teil III + Entwicklungszyklus am Beispiel + Testen mit JUnit

Beispiel: Klasse Euro Klasse Euro: - stellt Wertbeträge dar - Operation auf Euro-Objekt neues Euro-Objekt (Wertsemantik) Anforderungen definieren: - Konstruktur mit Betragsparameter - Addieren von Beträgen - Runden auf Cent genau - 100 Cent = 1 Euro

Testklasse EuroTest import junit.framework.*; public class EuroTest1 extends TestCase { private Euro1 two; protected void setup() { two = new Euro1(2.00); } public void testamount() { asserttrue(2.00 == two.getamount()); } public static void main(string[] args) { junit.swingui.testrunner.run(eurotest1.class); } }

Analyse der Testklasse - Paket: junit.framework - Testklassen sind von Klasse TestCase abgeleitet - Erzeugung eines Test-Fixture: Methode setup() - Testfälle: Methoden mit Signatur public void test...() - Annahmen/Forderungen/Zusicherungen: assert...() (Klasse Assert) asserttrue(), assertfalse() assertnull(), assertnotnull() assertequals(expected, actual) Vielzahl von Datentypen: Object, String, int,... assertsame(), assertnotsame () (Referenzvgl.) - Darstellung: GUI (Swing), weitere: GUI (AWT), Konsole

Klasse Euro public class Euro1 { private double amount; public Euro1(double amount) { //this.amount = amount; } public double getamount() { //return this.amount; return 0.0; } }

Lebenszyklus eines Testfalls

Lebenszyklus eines Testfalls Grundsatz beim Testlauf: jeder Testfall muss isoliert ausgeführt werden Vorgehensweise von JUnit: - Erzeugung: für jeden Testfall ein eigenes Objekt - Testlauf: Testfälle getrennt ausgeführt (Reihenfolge undef.) abhängige Testfälle in eine test...()-methode integrieren Ausführung eines Testfalls: 1. setup(): Test-Fixture erzeugen (Ressourcen binden) 2. test...(): Test durchführen 3. teardown(): Ressourcen freigeben

TestSuite import junit.framework.*; public class AllTests { public static Test suite() { TestSuite suite = new TestSuite(); suite.addtestsuite(customertest.class); suite.addtestsuite(eurotest.class); suite.addtestsuite(movietest.class); return suite; } public static void main(string[] args) { junit.swingui.testrunner.run(alltests.class); } }

Teil IV Zusammenfassung / Bewertung

Einsatz Testgetriebener Entwicklung Ansatz iterativ-inkrementeller Vorgehensmodelle: - reines Nachdenken über Architektur schwierig - Softwareentwicklung ist Lernprozess - Schwächen am laufenden System entdecken Einsatz testgetriebener Entwicklung ist Grundvoraussetzung Grundsatz Make it run Make it right Make it fast Tests beschreiben fkt. Anforderungen und sichern deren Erfüllung Refactoring vereinfacht Design Tests verhindern Seiteneffekte

Bewertung Qualitätssteigerung - Programmierfehler frühzeitig entdeckt - Entwürfe einfacher Einfach zu beschreibende automatische Tests Testklassen unterstützen Dokumentation des Systems - exemplarische Spezifikation Dokumentation des Testens - Sicherheit/Erweiterungsgrundlage für Anwendungsentwickler (Bibliotheken, Frameworks) Testdisziplin bei jedem Mitarbeiter - Aussetzen von Tests bedingt riesigen Aufwand, um Testabdeckung wieder zu erreichen Erhöhter Aufwand bei Implementierung