Softwareentwicklung Fabian Birzele Genomorientiertes Praktikum WS 2008 / 2009 Fabian Birzele, LMU Institut für Informatik, Lehrstuhl für Praktische Informatik und Bioinformatik, WS 2008/2009: GoBi Praktikum 1 Prophet - Server Fabian Birzele, LMU Institut für Informatik, Lehrstuhl für Praktische Informatik und Bioinformatik, WS 2008/2009: GoBi Praktikum 2 Ziele des Praktikums • • Motivation: Arbeiten an einer aktuellen, relevanten Fragestellung in der Bioinformatik. Eure eigenen Ideen sind herzlich willkommen! Ziele: – Entwicklung eines eigenen, größeren Softwaresystems über längere Zeit hinweg im Team Î erfordert anderes Management als erstes Programmierpraktikum – Einstieg in forschungsrelevante Themen der Bioinformatik Î u. U. Umsetzung eigener Ideen und Erlernen von wissenschaftlichem Arbeiten – Spaß an der Bioinformatik, am Programmieren, am Teamwork! Fabian Birzele, LMU Institut für Informatik, Lehrstuhl für Praktische Informatik und Bioinformatik, WS 2008/2009: GoBi Praktikum 3 Ziele dieser Vorlesung • • • • • Grundlagen: Geschichtliches und anderes Zeug UML: Beschreibung objektorientierter Systeme Use Cases: Anforderungsanalyse im Speziellen Biokit Java Beispiele Fabian Birzele, LMU Institut für Informatik, Lehrstuhl für Praktische Informatik und Bioinformatik, WS 2008/2009: GoBi Praktikum 4 What next? Grundlagen Fabian Birzele, LMU Institut für Informatik, Lehrstuhl für Praktische Informatik und Bioinformatik, WS 2008/2009: GoBi Praktikum 5 Softwareentwicklung: Grundlage Rechner aus Gehirn an Fabian Birzele, LMU Institut für Informatik, Lehrstuhl für Praktische Informatik und Bioinformatik, WS 2008/2009: GoBi Praktikum 6 Softwareentwicklung: Geschichtliches • • • 1965: Softwarekrise: Umfang der Software für komplexe Anwendungen nicht mehr beherrschbar, „Programmieren im Kleinen“ nicht mehr durchführbar 1968/1969: Begriff „Software Engineering“ wird geprägt um den Einsatz ingenieurmäßiger Methoden bei der Softwareentwicklung zu charakterisieren Seitdem: Verschiedene Modelle um Softwareentwicklung zu formalisieren und Prozesse zu standardisieren mit dem Ziel den Entwicklungsprozess auch großer Projekte handhabbar zu machen Fabian Birzele, LMU Institut für Informatik, Lehrstuhl für Praktische Informatik und Bioinformatik, WS 2008/2009: GoBi Praktikum 7 Softwareentwicklung: Qualitätskriterien • • • • • • • Korrektheit: Software erfüllt die Anforderungen Zuverlässigkeit: Nur selten Fehler, wenn, dann nur geringe Auswirkungen Robustheit: Sinnvolle Reaktion bei Fehlern Benutzerfreundlichkeit Wartbarkeit: Änderungen und Erweiterungen leicht möglich Performanz Dokumentation Fabian Birzele, LMU Institut für Informatik, Lehrstuhl für Praktische Informatik und Bioinformatik, WS 2008/2009: GoBi Praktikum 8 Softwareentwicklung: Qualität von Software • • • • Großes Softwaresystem > 50.000 loc Sehr großes Softwaresystem > 1 Mio loc Beispiele: Handy: 200.000 loc, Windows95: 10 Mio loc • • • • Beispiele: Handy bis zu 600 Fehler (dh. 3 Fehler pro 1000 loc), Windows95 bis zu 200.000 Fehler (dh. 20 Fehler pro 1000 loc) Space Shuttle weniger als 1 Fehler pro 10.000 Zeilen. • • normale SW: 25 Fehlern pro 1000 loc gute SW: 2 Fehlern pro 1000 loc Fabian Birzele, LMU Institut für Informatik, Lehrstuhl für Praktische Informatik und Bioinformatik, WS 2008/2009: GoBi Praktikum 9 Softwareentwicklung: Phasen • • • • • • Anforderungsanalyse: WAS soll das System leisten Entwurf: WIE lösen wir das Problem Implementierung: Codierung des Entwurfs Test: Evaluation einzelner Komponenten (z.B. unter Verwendung von JUnit – Tests) und des gesamten Systems unter Realweltbedingungen. Wartung und Erweiterung Verschiedene Modelle, wie die einzelnen Phasen aufeinander folgen Fabian Birzele, LMU Institut für Informatik, Lehrstuhl für Praktische Informatik und Bioinformatik, WS 2008/2009: GoBi Praktikum 10 Softwareentwicklung: Wasserfallmodel Nachteile? Fabian Birzele, LMU Institut für Informatik, Lehrstuhl für Praktische Informatik und Bioinformatik, WS 2008/2009: GoBi Praktikum 11 Softwareentwicklung: Iterative Modelle Fabian Birzele, LMU Institut für Informatik, Lehrstuhl für Praktische Informatik und Bioinformatik, WS 2008/2009: GoBi Praktikum 12 Grundlagen: Softwareentwicklung ist Teamwork • • • • • • • Dokumentation für alle Mitglieder des Teams und nicht nur für einen selbst!! Standards für Namen von Klassen, Methoden und Attributen Gemeinsame Verwaltung des Codes in CVS oder anderem Versioning System Gemeinsame Entwicklung des Systems = wichtige Entscheidungen werden besprochen bevor programmiert wird Definition von Interfaces (Schnittstellen) um gemeinsame Entwicklung zu erleichtern. Verschiedene Ansätze Teamwork zu verbessern u. a. „Pairwise Programming“ Experten für verschiedene Teilbereiche finden. Fabian Birzele, LMU Institut für Informatik, Lehrstuhl für Praktische Informatik und Bioinformatik, WS 2008/2009: GoBi Praktikum 13 What next? UML Fabian Birzele, LMU Institut für Informatik, Lehrstuhl für Praktische Informatik und Bioinformatik, WS 2008/2009: GoBi Praktikum 14 Objektorientierte Softwareentwicklung • Das System besteht aus einer Menge von Objekten, die sich (gegenseitig) Nachrichten senden. Der Empfang einer Nachricht löst eine Aktion beim empfangenden Objekt aus • Ein Objekt hat eine eigene, eindeutige Identität • Eine Klasse beschreibt eine Menge von Objekten mit gemeinsamen Merkmalen (Attribute, Operationen, Beziehungen), Attributwerte bestimmen Zustand • Klassen können spezialisiert werden Î Formalismus zur Beschreibung eines objektorientierten Systems = hier UML (Unified Modeling Language) Fabian Birzele, LMU Institut für Informatik, Lehrstuhl für Praktische Informatik und Bioinformatik, WS 2008/2009: GoBi Praktikum 15 UML Basics • • • • • Modellierung in UML dient dazu ein System zu verstehen bevor es implementiert wird Abstraktion: Beschränkung auf das Wesentliche, keine Details Statisches Modell: beschreibt strukturelle, datenbezogene Eigenschaften Dynamisches Modell: beschreibt Verhalten der Objekte, deren Zustandsänderungen und Transaktionen (wird hier nicht behandelt!) UML (Booch, Rumbaugh, Jacobson) seit 1997 (Version 1.0) Standardformalismus zur Modellierung Objektorientierter Systeme Fabian Birzele, LMU Institut für Informatik, Lehrstuhl für Praktische Informatik und Bioinformatik, WS 2008/2009: GoBi Praktikum 16 UML: Klassen und Objekte Klassenname Protein attribut id: String attribut:typ aminoAcids:AminoAcid[] operation getID():String operation(Argumentliste) setID(id:String) operation(Arg):typ • • Attribute, die in allen Instanzen einer Klasse den gleichen Wert haben (= statische Variablen) werden unterstrichen. Methoden, die vom jeweiligen Objektzustand unabhängig sind (= statische Methoden) werden ebenfalls unterstrichen Fabian Birzele, LMU Institut für Informatik, Lehrstuhl für Praktische Informatik und Bioinformatik, WS 2008/2009: GoBi Praktikum 17 UML: Assoziationen und Objektbeziehungen Klasse attribute attribute operationen operationen • • • A A A Klasse Assoziationsname Eine Objektbeziehung ist eine physikalische oder konzeptionelle Verbindung zwischen Objekten Eine Assoziation beschreibt eine Menge gleichartiger Beziehungen zwischen Objekten bestimmter Klassen Beispiel: Proteine bestehen aus Aminosäuren 1 * 1..* B B 1 Multiplizität A ich und gerichtete Assoziation A k wir 1 du l B B m B Rollennamen Mehrstellige Assoziation C Fabian Birzele, LMU Institut für Informatik, Lehrstuhl für Praktische Informatik und Bioinformatik, WS 2008/2009: GoBi Praktikum 18 UML: Vererbung • • • • • A Oberklasse B Unterklasse(n) A B1 B2 B3 Zeigt eine Relation zwischen einer „allgemeineren“ (Superklasse) und einer spezielleren Klasse (Subklasse) auf Jedes Objekt der Subklasse ist auch ein Objekt der Superklasse Jede Unterklasse erbt alle Attribute und Operationen von der Oberklasse und kann eigene hinzufügen Substitutionsprinzip: Immer wenn ein Objekt vom Typ A erwartet wird kann ein Objekt vom Typ B eingesetzt werden Mehrfachvererbung in Java?? Fabian Birzele, LMU Institut für Informatik, Lehrstuhl für Praktische Informatik und Bioinformatik, WS 2008/2009: GoBi Praktikum 19 UML: Interfaces <<interface>> Sequence operation_1():String operation_2(test:String) • • • • • <<use>> <<realize>> B A Interfaces sind abstrakte Klassen, die keine Attribute und damit auch keine wegführenden bzw. bidirektionalen Assoziationen besitzen Alle ihre Methoden sind abstrakt (muss daher nicht explizit angegeben werden) Sie bieten Methoden an die von verschiedenen, mehreren Klassen implementiert werden und die dann anschließend von anderen Klassen genutzt werden können Überall wo ein Interface verwendet wird, kann eine implementierende Klasse eingesetzt werden Wichtiges Strukturierungsmittel! Fabian Birzele, LMU Institut für Informatik, Lehrstuhl für Praktische Informatik und Bioinformatik, WS 2008/2009: GoBi Praktikum 21 UML: Zugriffsrechte • • • • • • Häufig sollen nur bestimmte Merkmale einer Klasse nach außen hin sichtbar sein (Kapselung) Zur Zugriffskontrolle verwendet man Sichtbarkeitsmarkierungen für Attribute, Rollennamen und Operationen +name (”public”) -name (”private”) #name (”protected”) = innerhalb Klasse und Subklassen (in Java Subklassen und selbes Package) Attribute sollen nur über getter und setter Methoden verfügbar sein Fabian Birzele, LMU Institut für Informatik, Lehrstuhl für Praktische Informatik und Bioinformatik, WS 2008/2009: GoBi Praktikum 22 What next? Übung Fabian Birzele, LMU Institut für Informatik, Lehrstuhl für Praktische Informatik und Bioinformatik, WS 2008/2009: GoBi Praktikum 23 Übung • Ziel ist es ein biokit.align Package zu designen, das es ermöglicht beliebige Sequenzen von Objekten zu alignieren. Beschreiben Sie die dazu nötigen Klassen, Interfaces, Methoden in UML. – Was muss ein Alignmentalgorithmus von einer beliebigen Sequenz wissen = welche Informationen muss eine Sequenz bereitstellen, damit zwei Sequenzen aligniert werden können? – Wie kann man nun dieses Wissen nutzen um ein Alignmentsystem zu bauen, das beliebige Sequenzen alignierten kann (gegeben die oben geforderten Eigenschaften sind implementiert)? – Welche Interfaces, Klassen und Methoden muss man definieren um das Gewünschte zu erhalten? – Könnten Ihnen Java-„Generics“ helfen? Fabian Birzele, LMU Institut für Informatik, Lehrstuhl für Praktische Informatik und Bioinformatik, WS 2008/2009: GoBi Praktikum 24 What next? Use Cases Fabian Birzele, LMU Institut für Informatik, Lehrstuhl für Praktische Informatik und Bioinformatik, WS 2008/2009: GoBi Praktikum 25 Anforderungsanalyse: Use Cases • Ziel der Analysephase ist eine präzise und verständliche Beschreibung der Anforderungen, die an die Software gestellt werden • Ausgangspunkt: informelle, knappe Problembeschreibung • Ziel: Beschreibung der gewünschten Funktionalität • Formal gehören dazu: – Use Case – Analyse – Entwicklung des statischen und dynamischen Modells – Validierung und Überarbeitung (in mehreren Iterationen) • Formalen Teil dazu lernt man OOSE Î Hier nur informelle Beschreibung eines möglichen Szenarios Fabian Birzele, LMU Institut für Informatik, Lehrstuhl für Praktische Informatik und Bioinformatik, WS 2008/2009: GoBi Praktikum 26 Use Case: Globale Zielbeschreibung (Formal) • • • • Use Case: CASP will die Struktur eines Proteins vorhersagen Kurzbeschreibung: Die Struktur eines Proteins wird vorhergesagt. Vorbedingung: Sequenz des Proteins liegt in FASTA Format vor Nachbedingung: Die Struktur des Proteins liegt im CASPFormat (oder PDB-Format) vor. Zusätzlich liefert der Server eine Reihe zusätzlicher Features, die die Qualitätseinschätzung der Vorhersage erleichtern. Der Server ist bereit für eine neue Strukturvorhersage Fabian Birzele, LMU Institut für Informatik, Lehrstuhl für Praktische Informatik und Bioinformatik, WS 2008/2009: GoBi Praktikum 27 Protein Struktur Vorhersage Server - Struktur Interpro CATH Webinterface DSSP Swissprot SCOP CASP - Server BLAST PSIPRED PDB Webservice DB TM - Score Fabian Birzele, LMU Institut für Informatik, Lehrstuhl für Praktische Informatik und Bioinformatik, WS 2008/2009: GoBi Praktikum 28 Wichtige Fragestellungen: Server • • • Welche Methode(n) zur Proteinstrukturvorhersage wollt ihr implementieren? – Comparative Modelling – Fold Recognition – Ab Initio Welche Teile der Methode(n) wollt ihr selbst implementieren? – Algorithmen (Alignment, Seitenkettenmodellierung, Strukturrefinement…) – Datenbanksuche nach Templates – Bewertungsfunktionen (Potentiale, Matrizen,…) – Evaluationsmethoden für Benchmark Wie wird das Projekt realisiert? – Programmiersprache(n) – Experten – Codemanagement – Dokumentation CASP - Server – Design – Verteiltes Rechnen (Grid) Fabian Birzele, LMU Institut für Informatik, Lehrstuhl für Praktische Informatik und Bioinformatik, WS 2008/2009: GoBi Praktikum 29 Wichtige Fragestellungen: Datenmanagement • • • Wie werden die Daten für den Server gespeichert? – Datenbank – Flatfiles Welche Daten werden lokal gespeichert, welche werden neu erzeugt / vom Web pro Anfrage neu bezogen? – Templatedatenbank – PDB-Files für Templates – Features für die Templates (SSE, Patterns, SCOP, Swissprot, Ensembl…) Wie sieht die Kommunikation von CASP – Server und DB aus – Java MySQL Connection DB Fabian Birzele, LMU Institut für Informatik, Lehrstuhl für Praktische Informatik und Bioinformatik, WS 2008/2009: GoBi Praktikum 30 Wichtige Fragestellungen: Webinterface • • • Welche Interaktionsmöglichkeiten mit dem Server stellt ihr dem Benutzer zur Verfügung? – CGI – Webservice – Kommandozeile – GUI – Java Webstart Wie sieht die Kommunikation zwischen CASP – Server und Webinterface aus? – XML – E-Mail Wie werden die Ergebnisse dem Benutzer mitgeteilt? Welche Ergebnisse bekommt er zu sehen? – Webseite – Flatfile Webinterface – XML – 3D Struktur, Alignment, Qualitätsmaße, Visualisierung… Fabian Birzele, LMU Institut für Informatik, Lehrstuhl für Praktische Informatik und Bioinformatik, WS 2008/2009: GoBi Praktikum 31 Wichtige Fragestellungen: Tools • • Wie werden fremde Tools in den CASP - Server integriert? – Webservice von anderen Bioinformatik-Seiten – Lokale Installation – Kommunikation mit dem eurem Server? Welche Tools werden verwendet? – Was funktioniert gut? – Was bietet interessante Funktionalität? – Was gibt es schon was man nicht mehr selbst machen muss? DSSP Fabian Birzele, LMU Institut für Informatik, Lehrstuhl für Praktische Informatik und Bioinformatik, WS 2008/2009: GoBi Praktikum 32 Wichtige Fragestellungen: Externe Ressourcen • • • Welche externen Datenbanken beinhalten interessante Informationen? – Was ist interessant? – Was ist hilfreich? – Was ist verfügbar? Wie realisiert man die Kommunikation mit diesen Datenbanken? – MySQL Interface bei DB vorhanden? – HTTP-Request – Webservice Wie werden die Daten lokal gehandhabt? – DB – Flatfile – Serialisierung PDB Fabian Birzele, LMU Institut für Informatik, Lehrstuhl für Praktische Informatik und Bioinformatik, WS 2008/2009: GoBi Praktikum 33 What next? Biokit Fabian Birzele, LMU Institut für Informatik, Lehrstuhl für Praktische Informatik und Bioinformatik, WS 2008/2009: GoBi Praktikum 34 Biokit • Bereitstellung von wieder verwendbaren Basisklassen (Protein, Alignment, Gen) • Implementierung von Standardalgorithmen in Biokit (paarweises und multiples Sequenzalignment, Superposition…) • Parser für viele wichtige Dateiformate (PDB, Alignmentformate, SWISSPROT…) • Wrapperklassen für wichtige externe Tools wie BLAST, DSSP,… und Verfügbarkeit der Ergebnisse direkt in Biokit Î Verkürzung der Entwicklungszeit bei neuen Ideen Î Beschäftigungstherapie für umherirrenden Doktoranden in den ersten vier Monaten ;-) Î Ihr könnt im Praktikum auf Biokit zurückgreifen um bestimmte Probleme schneller zu lösen – E.g. Alignments, Anbindung an Standardtools Fabian Birzele, LMU Institut für Informatik, Lehrstuhl für Praktische Informatik und Bioinformatik, WS 2008/2009: GoBi Praktikum 35 Biokit: Überblick biokit.property biokit.model biokit.parser biokit.algorithms biokit.util biokit.project Biokit Fabian Birzele, LMU Institut für Informatik, Lehrstuhl für Praktische Informatik und Bioinformatik, WS 2008/2009: GoBi Praktikum 36 What next? Java Beispiele Fabian Birzele, LMU Institut für Informatik, Lehrstuhl für Praktische Informatik und Bioinformatik, WS 2008/2009: GoBi Praktikum 47 Java Property Files • Java verfügt über einen Mechanismus, der einfache Property – Files der Form PropertyName = value PropertyName2 = value2 bearbeiten kann. … Properties properties = new Properties(); properties.load(new FileInputStream(propertyFile)); String myProperty = properties.getProperty(„MyProp“); … Fabian Birzele, LMU Institut für Informatik, Lehrstuhl für Praktische Informatik und Bioinformatik, WS 2008/2009: GoBi Praktikum 48 Java HTTP Requests • Ebenso wie aus PERL lassen sich mit Java HTTP Anfragen starten und bearbeiten. StringBuffer entryText = new StringBuffer(); URL u = new URL(„http://www.expasy.org/cgibin/get-sprot-entry?KCNN2_MOUSE“); InputStream in = u.openStream(); int b; while((b=in.read()) != -1){ entryText.append((char)b); } String page = entryText.toString(); Fabian Birzele, LMU Institut für Informatik, Lehrstuhl für Praktische Informatik und Bioinformatik, WS 2008/2009: GoBi Praktikum 49 Java und SQL • Mit Java kann man leicht auf z.B. mySQL – Datenbanken zugreifen. Man muss dazu folgende Schritte ausführen: Connection erzeugen: Connection connection = null; Class.forName(„org.gtj.mm.mysql.Driver“); String conn = „jdbc:mysql://“+ serverName + „/“ + databaseName; connection = DriverManager.getConnection(conn, userName, password); Fabian Birzele, LMU Institut für Informatik, Lehrstuhl für Praktische Informatik und Bioinformatik, WS 2008/2009: GoBi Praktikum 50 Java und SQL SQL Query: Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery(„SELECT * FROM bla“); while(resultSet.next()){ int zahl = resultSet.getInt(„blaZahl“); String value = resultSet.getString(„blaString“); } Fabian Birzele, LMU Institut für Informatik, Lehrstuhl für Praktische Informatik und Bioinformatik, WS 2008/2009: GoBi Praktikum 51 Java und SQL SQL Update: Statement statement = connection.createStatement(); statement.executeUpdate(„ INSERT INTO bla(bla1, bla2) VALUES (blabla, 1)“); Fabian Birzele, LMU Institut für Informatik, Lehrstuhl für Praktische Informatik und Bioinformatik, WS 2008/2009: GoBi Praktikum 52 Java und externe Tools • Aus Java kann man externe Programme aufrufen. String processCall = „blaProg –i bla –o blabla“ Runtime rt = Runtime.getRuntime(); Process proc = rt.exec(processCall); // warte bis Process beendet ist proc.waitFor(); // mache irgendwas Fabian Birzele, LMU Institut für Informatik, Lehrstuhl für Praktische Informatik und Bioinformatik, WS 2008/2009: GoBi Praktikum 53 Java und externe Tools • • Was tun, wenn Process nur auf Standard-Out schreibt oder um Standard-Err Messages zu bekommen Scheint einfach: // input Stream des proc = stdin des Prozesses Process.getOutputStream(); // output Stream des proc = stdout des Prozesses Process.getInputStream(); // error Stream des proc = stderr des Prozesses Process.getErrorStream(); ACHTUNG: Gefahr von dead locks beim Lesen von Error und Output Stream!! Fabian Birzele, LMU Institut für Informatik, Lehrstuhl für Praktische Informatik und Bioinformatik, WS 2008/2009: GoBi Praktikum 54 Java und externe Tools • • • Lösung mit Hilfe von Klasse StreamGobbler Ließt von jedem Stream (stdout und stderr) in eigenem Thread und speichert Output. Nach Beendigung des Prozesses kann man sich den Output abholen StreamGobbler errorGobbler = new StreamGobbler(proc.getErrorStream(), "ERROR"); StreamGobbler outputGobbler = new StreamGobbler(proc.getInputStream(), "OUTPUT"); errorGobbler.start(); outputGobbler.start(); proc.waitFor(); String errorText = errorGobbler.getMessages(); String[] error Lines = errorText.split("\\n"); String outputText = outputGobbler.getMessages(); String[] outputLines = outputText.split("\\n"); outputGobbler.kill(); errorGobbler.kill(); // Streams wieder zu machen, es werden IMMER ALLE DREI Streams geöffnet // Kann zu Problemen mit FileHandling führen proc.getErrorStream().close(); proc.getInputStream().close(); proc.getOutputStream().close(); Fabian Birzele, LMU Institut für Informatik, Lehrstuhl für Praktische Informatik und Bioinformatik, WS 2008/2009: GoBi Praktikum 55 Java und externe Tools import import import import java.io.BufferedReader; java.io.IOException; java.io.InputStream; java.io.InputStreamReader; public String getMessages() { return text.toString(); } public void kill() { public class StreamGobbler extends Thread try { { br.close(); private InputStream is; } catch(Exception ex) {} private BufferedReader br; } private StringBuffer text; public StreamGobbler(InputStream is, String type){ this.is = is; text = new StringBuffer(); } public void run() { try { InputStreamReader isr = new InputStreamReader(is); br = new BufferedReader(isr); String line = null; while ((line = br.readLine()) != null) text.append(line + "\n"); } catch (IOException e) {} } Fabian Birzele, LMU Institut für Informatik, Lehrstuhl für Praktische Informatik und Bioinformatik, WS 2008/2009: GoBi Praktikum 56 Testing Java Programs: JUnit Testing • • • • Beim Unit – Testing wird jede einzelne Methode einer Klasse systematisch getestet und zwar darauf, ob sie die formale oder auch informelle Spezifikation erfüllt. Es handelt sich um sog. Blackbox Tests, d.h. die Implementierung der Methoden wird NICHT und darf auch NICHT berücksichtigt werden. (Pendant: Whitebox Testing) Für jede Methode werden nur Parameter und Datentypen betrachtet. Beispiel: für eine Methode computeSum(int one, int two) wird also getestet, ob sie die korrekte Summe für zwei Zahlen berechnet. Fabian Birzele, LMU Institut für Informatik, Lehrstuhl für Praktische Informatik und Bioinformatik, WS 2008/2009: GoBi Praktikum 57 Testing Java Programs: JUnit Testing Schritte zur Entwicklung einer Testklasse in JUnit 1. Deklariere eine Unterklasse von junit.framework.TestCase 2. Redefiniere die Methode setUp(), um die Testobjekte zu initialisieren 3. Redefiniere tearDown() um die Testobjekte zu löschen 4. Deklariere eine oder mehrere testBlaBla() – Methoden, die die Testobjekte verwenden, ihre Methoden aufrufen und die Resultate der Methodenaufrufe validieren. Fabian Birzele, LMU Institut für Informatik, Lehrstuhl für Praktische Informatik und Bioinformatik, WS 2008/2009: GoBi Praktikum 58 Testing Java Programs: JUnit Testing Beispiel für eine Test - Methode import junit.framework.*; public class Test extends TestCase { public void testProteinInitialization() { Protein protein = new Protein(„1tim“, „ABCDE“); assertTrue(protein.getProteinLength() == 5); assertEquals(protein.getSequence(), „ABCDE“); try{ throw new Exception(„e“); fail(„no Ex“); } catch(Exception ex){ // smile } } } Fabian Birzele, LMU Institut für Informatik, Lehrstuhl für Praktische Informatik und Bioinformatik, WS 2008/2009: GoBi Praktikum 59 Testing Java Programs: JUnit Testing • Zusammenfassen mehrerer TestCase Klassen in eine TestSuite: import junit.framework.*; public class AllTests { public static Test suite(){ TestSuite suite = new TestSuite(Test1.class); suite.addTestSuite(Test2.class); return suite; } public static void main(String[] args) { junit.swingui.TestRunner.run(AllTests.class); } } Fabian Birzele, LMU Institut für Informatik, Lehrstuhl für Praktische Informatik und Bioinformatik, WS 2008/2009: GoBi Praktikum 60 Testing Java Programs: JUnit Testing • • • • • In ECLIPSE ohne große Probleme zu implementieren. Bei der ersten Verwendung von junit.framework.TestCase wird junit Package automatisch dem Buildpath hinzugefügt Tests und TestSuites können einfach von ECLIPSE in RunAs laufen gelassen werden Hauptvorteil von JUnit Testing: Programmierer schreiben ihre Tests immer gemeinsam mit der Klasse. Dadurch ist das Verhalten der Methoden auch durch Beispiele und nicht nur durch die Dokumentation beschrieben. Bei Änderungen in der Klasse durch anderen Programmierer kann dieser sofort feststellen (durch Laufenlassen aller Tests) ob seine Änderungen unerwünschte Nebeneffekte haben oder nicht. Fabian Birzele, LMU Institut für Informatik, Lehrstuhl für Praktische Informatik und Bioinformatik, WS 2008/2009: GoBi Praktikum 61 Done! Fertig!! Noch Fragen? Fabian Birzele, LMU Institut für Informatik, Lehrstuhl für Praktische Informatik und Bioinformatik, WS 2008/2009: GoBi Praktikum 79