Folien

Werbung
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
Herunterladen