Software Technik
Christian Baranowski
HTWG Konstanz
Software Testing und Qualitätssicherung
WiederhlungJava Persistence API
Disk
Data
Requirement Analysis
Testing
System Design
Coding
Delivery
Wasserfallmodell
Basic Mappings@Table(name = "Adr")@Entitypublic class Address implements Serializable { @Id @Column(name = "ADDRESS_ID") @GeneratedValue(strategy = GenerationType.SEQUENCE) private long id; @Basic private String city; @Basic private String country; @Basic private String province; @Basic @Column(name = "P_CODE") private String postalCode; @Basic private String street;
Warum sollte eine Entity die Schnittstelle Serializable implementieren?
Assoziationen / Relationen
@OneToOne(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY) @JoinColumn(name = "ADDR_ID") private Address address; @ManyToOne(fetch = FetchType.LAZY) private JobTitle jobTitle;
@ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "MANAGER_ID") private Employee manager;
@OneToMany(mappedBy = "manager") private List<Employee> managedEmployees = new ArrayList<Employee>();
@OneToMany(mappedBy = "owner", cascade = CascadeType.ALL, orphanRemoval = true) private List<PhoneNumber> phoneNumbers = new ArrayList<PhoneNumber>();
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) @JoinColumn(name="EMP_ID") private List<Degree> degrees = new ArrayList<Degree>();
@ManyToMany @JoinTable(name = "PROJ_EMP", joinColumns = @JoinColumn(name = "EMP_ID"), inverseJoinColumns = @JoinColumn(name = "PROJ_ID")) private List<Project> projects = new ArrayList<Project>();
Assoziationen / Relationen
Entity
•Entity hat immer einen eindeutigen Schlüssel (ID) dieser identifiziert die Entität
•Equals auf Basis der ID...
Entity Manager
•API bietet alle Funktion für den Datenbankzugriff:
•persist
•remove
•createQuery
•merge
•findXXX
•....
Entity Manager
•Wenn die Objekte (Entity Klassen) auch als Daten Transfer Objekte genutzt werden sollen können sie vom Entity Manager gelöst werden man spricht von detached Entities!
Detached Entities
•Managed Entities werden vom Entity Manager gelöst wenn:
•clear oder detach
•mittels rollback
•Entity Manager closed
•Erweitern Sie Ihre Aufgaben Verwaltung um eine Datenbank Anbindung mittels JPA
•Schritt 1. Domain Modell markieren mit den JPA Annotationen für das OR Mapping...
•Schritt II. Repository Funktionen zum speichern und laden einer Aufgabe umsetzen...
Übungen I
Was ist Software Qualität ?
Was ist Software Qualität ?
Funktionalität - Software sollte die spezifizierten Use-Cases / Anforderungen implementieren.
4 + 4 = 9
Was ist Software Qualität ?
Benutzbarkeit vorgegebenen Use-Cases lassen sich effektiv, effizient und zufriedenstellend bedienen.
Die Benutzbarkeit richtet sich nach dem Anwendungsfall...
Benutzbarkeit betrifft nicht nur grafische Benutzerschnittstellen z.B. auch APIs...
Was ist Software Qualität ?
Zuverlässigkeit wie verlässlich eine Anwendung in einem Zeitintervall ihr Funktionalität erfüllt
Was ist Software Qualität ?
Portabilität - der Grad der Plattformunabhängigkeit eines Computerprogramms
Portabilität - Die Anwendung läuft auf Linux, MAC und auf Ihrem Android Mobil Phone ...
Was ist Software Qualität ?
Wartbarkeit - zeigt an, mit welcher Energie und welchem Erfolg Änderungen in einem Systemzusammenhang von Applikationen durchgeführt werden können.
Was ist Software Qualität ?
Effizienz - Performance und verbrauchte Ressourcen
Was ist Software Qualität ?Funktionalität
Benutzbarkeit
Zuverlässigkeit
Portabilität
Wartbarkeit
Effizienz
Was soll sichergestellt werden?
Fehlerwirkung (Failure)Nach außen sichtbare Fehlverhalten
Fehlerzustand (Bug)Zustand in der Anwendung der zu einer Fehlerwirkung führen kann.
Fehlhandlung (Error, Misstake)Irrtum bei der Software-Entwicklung.
FehlermaskierungWirkung eines Fehlers (Fehlerzustand) ist nach außen nicht sichtbar, weil er durch einen weiteren Fehler verborgen (überlagert / maskiert) wird.
Wege zu guter Software
analytische Qualitätssicherung
konstruktive Qualitätssicherung
Methoden die dazu dienen eine Anwendung strukturiert (analytisch) nach Fehlerwirkungen, Fehlerzuständen und Fehlermaskierung zu untersuchen. Die Qualität wird gemessen. Anzahl der Fehlerwirkungen, Fehlerzuständen und Fehlermaskierung bestimmt.
Methoden die dazu dienen die Wahrscheinlichkeit für Fehlhandlungen zu minimieren. D.h. die Methoden führen dazu dass es zu einer geringeren Fehlerwahrscheinlichkeit im Projekt kommt.
Kosten zur Fehlerbehebung
Anforderungsanalyse Systementwurf Umsetzung Integrationstest Systemtest Betrieb
Kosten (€)
Fehler frühzeitig in einem Projekt (Entwicklungsprozess) zu finden spart Geld !!!
Komponententests (Modultests) und Testabdeckung
Komponententest Charakter •Was wird getestet ? (Testobjekt)
-Klasse / Komponente (mehre Klassen mit definierter Schnittstelle)
•Wer testet? (Tester)
-Entwickler (White-Box / Gray-Box) / Tester (Black-Box)
•Welche Qualitätseigenschaft (ISO9126) wird geprüft?
-Funktionalität, Robustheit, Effizienz
•Mit welchen Werkzeugen wird getestet?
-xUnit Frameworks und Coverage Messung z.B. Cobertura, Emma
Test Design Pattern vier Phasen Test
Setup SUT in einen definierten Zustand bringen.
ExerciseSUT aufrufen mit Test Parametern (Daten).
Verify Prüfen ob das SUT im erwarteten Zustand ist.
Teardown SUT und Testumgebung aufräumen.
JUnitpublic class QuicksortTest {
! Quicksort<Integer> quicksortSUT;
! @Before! public void setUp() {! ! quicksortSUT = new Quicksort<Integer>(new IntComperator());! }
! @Test! public void testSort() throws Exception {! ! quicksortSUT.sort(new Integer[] { 5, 8, 2, 4, 7 });! ! assertArrayEquals(new Integer[] { 2, 4, 5, 7, 8 }, values);! }
! @After! public void tearDown() {! ! quicksortSUT = null;! }
}
Phase 1: Setup
Phase 2: Exercise
Phase 3: Verify
Phase 4: tearDown
Test CoverageTestabdeckung
Testabdeckung
„Als Testabdeckung bezeichnet man das Verhältnis an tatsächlich getroffenen Aussagen eines Tests gegenüber den theoretisch möglich treffbaren Aussagen bzw. der Menge der gewünschten treffbaren Aussagen.“ - Wikipedia
Testabdeckung (100 %)public boolean aAndbOrC(boolean A, boolean B, boolean C) {! return (A && B) || C;}
Erwartet A B Cfalse false false falsetrue false false truefalse false true falsetrue false true truefalse true false falsetrue true false truetrue true true falsetrue true true true
vollständige Testabdeckung
„Eine vollständige Testabdeckung stellt eine Ausnahme dar, weil die Anzahl möglicher Testfälle sehr schnell ungeheuer groß wird (durch kombinatorische Explosion). Ein vollständiger Funktionstest für eine einfache Funktion, die zwei 16-Bit-Werte als Argument erhält, würde schon 2^(16+16), also ca. 4 Milliarden Testfälle bedeuten, um die Spezifikation vollständig zu testen.“ - Wikipedia
Testabdeckung beim White-Box Testen
Statement Coverage (Anweisungsüberdeckung)
public static boolean aAndBOrC(boolean A, boolean B, boolean C) { if(A && B){ return true; } else if(C) { return true; } else { return false; } }
Statement Coverage (Anweisungsüberdeckung)
A && B true
C true
false
Statement Coverage (Anweisungsüberdeckung)
A && B true
C true
false
Erwartet A B C
true true true false
1.
1.
Statement Coverage (Anweisungsüberdeckung)
A && B true
C true
false
Erwartet A B C
true true true false
true false false true
1.
2. 1.
2.
Statement Coverage (Anweisungsüberdeckung)100 %
A && B true
C true
false
Erwartet A B C
true true true false
true false false true
false false false false
1.
2.3.
1.
2.
3.
Statement Coverage (Anweisungsüberdeckung)
public static boolean aAndBOrC(boolean A, boolean B, boolean C) { if(A && B || C){ return true; } else { return false; } }
Statement Coverage (Anweisungsüberdeckung)100%
A && B || C true
false
Erwartet A B C
true false false true
false false false false
1.
2.
1.
2.
Statement Coverage (Anweisungsüberdeckung)
public static int sum(int values[], int offset){ int result = 0; for (int value : values) { if(offset > 0){ if(offset < value) result += offset; } result += value; } return result; }
Statement Coverage (Anweisungsüberdeckung)100%
result = 0
for (value : values)
offset > 0 offset < value
result += value
return result
result += offset
Erwartet values offset
3 [2] 1
Statement Coverage (Anweisungsüberdeckung)100 %
result = 0
for (value : values)
offset > 0 offset < value
result += value
return result
result += offset
Erwartet values offset
3 [2] 1
Branch Coverage 100 % (Zweigabdeckung)
result = 0
for (value : values)
offset > 0 offset < value
result += value
return result
result += offset Erwartet values offset
3 [2] 1
2 [2] 0
2 [2] 2
100% Pfadabdeckung
100 % Pfadabdeckung wird in der Regel nicht erreicht (halting problem)
Testabdeckung automatisiert bestimmen
Übung 1I
•Erstellen Sie einen Unit Test für die JPA Implementierung zum speichern der Aufgabe
•Messen Sie die Code Abdeckung in Eclipse
Statische TestverfahrenCode Reviews
Walkthrough
•Autor stellt seinen Code Dokument vor.
•Autor ist der Moderator
•Vorteile:
•Wenig Vorbereitungsaufwand
•Prüfung findet durch spontane Fragen statt.
Inspektion•Formalste Form eines Review
•oft formale Vorprüfung
•Gutachter bekommen die Dokumente vorab
•Gutachter prüfen erst einzeln
•Anschließende Sitzung mit Autor, Gutachtern und Moderator
Technisches Review•Autor nimmt am Review nicht teil
•Gutachter stimmen ab
•Prüfen gegen Spezifikation
•Gutachter prüfen einzeln vorab
Informelles Review
•Gutachter bekommt Dokument zum lesen und gibt schriftliche Rückmeldung
Zusammenfassung Reviews
Grad der Formalisierung
geringster höchsten mittel gering
AnwesendAutorPrüfer
AutorGutachterModerator
GutachterModerator
einzelne Gutachter
AnwendbarkeitCode
DokumenteLernen
Dokumente Dokumente CodeDokumente
Vorbereitung kaum Formale Prüfung Formale Prüfung kaum
Walkthrough Inspektion TechnischesReview
InformellesReview
Statische TestverfahrenNamens Konventionen
Namens Konventionen
• Klassennamen • beginnt mit einem Großbuchstaben, danach in Kleinbuchstaben
weiter • beginnt ein neuer wesentlicher Teil des Klassennamens, wird er
mit einem Großbuchstaben verdeutlicht
• Beispiele• Color, Button, TextField, String
Namens Konventionen
• Methodennamen • beginnt mit einem Kleinbuchstaben, weiter klein geschrieben• beginnt ein neuer wesentlicher Teil wird er mit einem
Großbuchstaben verdeutlicht
• Beispiele• equals(), setColor(), drawOval()...
Namens Konventionen
• Konstantennamen • komplett in Großbuchstaben
• Beispiele• LEFT, PI, BLOD
Integrationsstrategien
Test A Test B
Test C
Test D Test E
Test F
Test G Test A- G
Big-bang
Integrationsstrategien
Test C Test E Test F Test G
Test A- G
Test B, E, F
Test D, G
Bottom-up
Integrationsstrategien
Test A
Test A, B, C, D
Test A- G
Top-down
Integrationsstrategien
Backbone Integration
IntegrationsstrategienContinuous Integration
betrachten wir noch in einer der folgendenVorlesung
Integrationstests
Test Charakterisierung
•Was wird getestet ? (Testobjekt)
•Wer testet? (Tester)
•Welche Qualitätseigenschaft (ISO9126) wird geprüft?
•Mit welchen Werkzeugen wird getestet?
Integrationstest Charakter •Was wird getestet ? (Testobjekt)
-Zusammenspiel von zwei oder mehrere Module.-Passen die Schnittstellen?
•Wer testet? (Tester)
-Entwickler (White-Box / Gray-Box) / dezidierte Tester (Black-Box)
•Welche Qualitätseigenschaft (ISO9126) wird geprüft?
-Robustheit, Portabilität,Funktionalität, Wartbarkeit, Effizienz
•Mit welchen Werkzeugen wird getestet?
-JUnit, DBunit, Mocking Frameworks
Systemtests und Akzeptanztests
Systemtests Charakter •Was wird getestet ? (Testobjekt)
-komplettes System (vollständiger Integrationstest)-bis zur Systemgrenze
•Wer testet? (Tester)
- dezidierte Tester (Black-Box)
•Welche Qualitätseigenschaft (ISO9126) wird geprüft?
-Funktionalität, Effizienz, Benutzbarkeit, Robustheit, Portabilität
•Mit welchen Werkzeugen wird getestet?
-JUnit, FIT, Selenium ... HP Test Runner, GUIdancer ...
funktionale Systemtest / Akzeptanztests mit FIT
Überblick Fit Framework for Integrated Tests
FIT wurde entwickelt von Ward Cunningham WIKI-Erfinder...
Motivation von Fit Tests
• Automatisierung von Akzeptanztests mittels Tabellen.
• Framework für Datengetriebene Tests – Data-Driven-Test (xUnit Test Patterns - Gerard Meszaros)
Testen mit Fit TabellenFit Tests für einen Beispiel Zinsrechner
Betrag
10
Testen mit Fit TabellenFit Tests als Column Test Tabelle
Betrag Zinssatz
10 2,5
Testen mit Fit TabellenFit Tests als Column Test Tabelle
Betrag Zinssatz Laufzeit
10 2,5 2
Testen mit Fit TabellenFit Tests als Column Test Tabelle
Betrag Zinssatz Laufzeit Summe
10 2,5 2 10,51
Testen mit Fit TabellenFit Tests als Column Test Tabelle
Testen mit Fit TabellenFit Tests als Column Test Tabelle
Betrag Zinssatz Laufzeit Summe()
10 2,5 2 10,51
Eingehende - Werte Prüfung eines Ergebnis
Testfall
Testen mit Fit TabellenFit Tests als Column Test Tabelle
Betrag Zinssatz Laufzeit Summe()
10 2,5 2 10,51
10 10 3 25,94
10 10 10 100000
... ... ... ...
Testfälle
Testen mit Fit TabellenFit Tests als Column Test Tabelle
Gelb =Ausnahme - Fehler im Test
Grün = erfolgreicher Test
Rot = Fehler in der Anwendung
Testen mit Fit TabellenFit Test als Action Tabelle
fit.Ac?onFixturefit.Ac?onFixturefit.Ac?onFixture
start ZinsenAc(onFixtureZinsenAc(onFixture
enter Betrag 10
enter Zinssatz 2,5
enter Laufzeit 2
press SubmitSubmit
check Summe 10,51
Anbindung an die Applikation (Java)
Argumente
Objekt / Auswahl / Target
Testfall
Befehle / Kommandos
Testen mit Fit TabellenFit Test als Action Tabelle
Prüfung
Eingaben
Aktion - Zinsen Berechnen
Anwendung Starten
Fit Designdrei Klassen Framework
Fit Tabellen und Applikation verknüpfen
Fit Tabellen und Applikation verknüpfen
onlinerechner.ZinsenFixtureonlinerechner.ZinsenFixtureonlinerechner.ZinsenFixtureonlinerechner.ZinsenFixtureBetrag Zinssatz Laufzeit Summe()10 2,5 2 10,5110 10 3 25,9420 10 10 100000... ... ... ...
Fit Tabellen und Applikation verknüpfen
SUTAnbindung an SUT
Fit Tabellen und Applikation verknüpfen
public class ZinsenFixture extends ColumnFixture {
private Zinsen zinsen = new Zinsen();
public double betrag; public double zinsatz; public double laufzeit;
public double summe() { zinsen.setBetrag(betrag); zinsen.setLaufzeit(laufzeit); zinsen.setZinssatz(zinsatz); return zinsen.berechneZinsen(); } }
Eingehende - Werte
SUT
Prüfung - Ausgabe
Basis Klasse für Fit Extension
Anbindung an SUT
Fit Tabellen und Applikation verknüpfen
fit.Ac?onFixturefit.Ac?onFixturefit.Ac?onFixture
start onlinerechner.ZinsenAc(onFixtureonlinerechner.ZinsenAc(onFixture
enter Betrag 10
enter Zinssatz 2,5
enter Laufzeit 2
press berechneZinsenberechneZinsen
check Summe 10,51
GOF - Dekorierer-Muster
Fit Tabellen und Applikation verknüpfen
Fit Tabellen und Applikation verknüpfen
public class ZinsenActionFixture extends Fixture { Zinsen zinsen = new Zinsen(); double summe; public void betrag(double betrag) { zinsen.setBetrag(betrag); }… public void berechneZinsen() { summe = zinsen.berechneZinsen(); } public double summe() { return summe; }}
Eingaben / Enter
Aktion / Press
Ausgabe Prüfung / Check
OberflächentestsEinführung in Selenium
Selenium Core
Selenium IDE
Selenium RC
Selenium Core
open /JugsBase/zinsrechner.jsp
type betrag 20.0
type zinsatz 22.0
type laufzeit 100.0
clickAndWait submit
assertTextPresent 8649939365.27 Euro
Action - TabelleSelenium Befehl
Target
Argumente
am Beispiel eines Zinsrechner
Selenium IDECapture & Replay Tests mit Selenium
Action Tabelle
Selenium Remote ControlAnbindung Selenium in Java Code als Test Treiber
JAVA, PHP...
Selenium Server
Selenium Core
HTTP Proxy SUTWebapplikation
BrowserFirefox, IE