Testen von serviceorientierten Architekturen: Teststrategie und ...
Testen von serviceorientierten Architekturen: Teststrategie und ... Testen von serviceorientierten Architekturen: Teststrategie und ...
Gottfried Wilhelm Leibniz Universität Hannover Fakultät für Elektrotechnik und Informatik Institut für Praktische Informatik Fachgebiet Software Engineering Testen von serviceorientierten Architekturen: Teststrategie und Implementierung Masterarbeit im Studiengang Informatik von Dennis Hardt Prüfer: Prof. Dr. Kurt Schneider Zweitprüfer: Prof. Dr.-Ing. Christian Grimm Betreuer: Dr. Jan-Mirko Maczewski Betreuer: Dipl.-Wirt.-Inform. Daniel Lübke Hannover, 29. Oktober 2007
- Seite 2 und 3: Zusammenfassung Serviceorientierte
- Seite 4 und 5: Inhaltsverzeichnis 4.1.2. Webservic
- Seite 6 und 7: 1. Einführung 1.1. Motivation Serv
- Seite 8 und 9: 1. Einführung Vorgehen zur Findung
- Seite 10 und 11: 2. Grundlagen • Tester: Wer führ
- Seite 12 und 13: 2. Grundlagen Zahlenwerte aufstelle
- Seite 14 und 15: 2. Grundlagen Einheit über Nachric
- Seite 16 und 17: 2. Grundlagen für eine Hotelreserv
- Seite 18 und 19: 2. Grundlagen (WSDL) [W3C07]. Die K
- Seite 20 und 21: 3. Ableitung einer Teststrategie f
- Seite 22 und 23: 3. Ableitung einer Teststrategie f
- Seite 24 und 25: 3. Ableitung einer Teststrategie f
- Seite 26 und 27: 3. Ableitung einer Teststrategie f
- Seite 28 und 29: 3. Ableitung einer Teststrategie f
- Seite 30 und 31: 3. Ableitung einer Teststrategie f
- Seite 32 und 33: 4. Testaspekte für SOA, Webservice
- Seite 34 und 35: 4. Testaspekte für SOA, Webservice
- Seite 36 und 37: 4. Testaspekte für SOA, Webservice
- Seite 38 und 39: 4. Testaspekte für SOA, Webservice
- Seite 40 und 41: 4. Testaspekte für SOA, Webservice
- Seite 42 und 43: 5. Werkzeugunterstützung für die
- Seite 44 und 45: 5. Werkzeugunterstützung für die
- Seite 46 und 47: 5. Werkzeugunterstützung für die
- Seite 48 und 49: 5. Werkzeugunterstützung für die
- Seite 50 und 51: 5. Werkzeugunterstützung für die
Gottfried Wilhelm<br />
Leibniz Universität Hannover<br />
Fakultät für Elektrotechnik <strong>und</strong> Informatik<br />
Institut für Praktische Informatik<br />
Fachgebiet Software Engineering<br />
<strong>Testen</strong> <strong>von</strong> <strong>serviceorientierten</strong><br />
<strong>Architekturen</strong>: <strong>Teststrategie</strong> <strong>und</strong><br />
Implementierung<br />
Masterarbeit<br />
im Studiengang Informatik<br />
<strong>von</strong><br />
Dennis Hardt<br />
Prüfer: Prof. Dr. Kurt Schneider<br />
Zweitprüfer: Prof. Dr.-Ing. Christian Grimm<br />
Betreuer: Dr. Jan-Mirko Maczewski<br />
Betreuer: Dipl.-Wirt.-Inform. Daniel Lübke<br />
Hannover, 29. Oktober 2007
Zusammenfassung<br />
Serviceorientierte <strong>Architekturen</strong> (SOA) haben sich zu einem bekannten Paradigma zur<br />
Strukturierung <strong>von</strong> Applikationen entwickelt. An ihre aktiven Einheiten, die Services,<br />
werden hohe qualitative Ansprüche gestellt, um sie in einem beliebigen Umfeld einsetzen<br />
zu können. Dabei wird in der Forschung <strong>und</strong> Entwicklung oftmals speziell das<br />
<strong>Testen</strong> <strong>von</strong> Webservices betrachtet; die Beschreibung einer <strong>Teststrategie</strong> bleibt jedoch<br />
aus.<br />
Diese Arbeit stellt nicht nur eine Auswahl <strong>von</strong> potentiellen Problemen vor, die in einer<br />
SOA auftreten können, sondern ermöglicht auch diese Probleme als Gr<strong>und</strong>lage<br />
zur Formulierung einer <strong>Teststrategie</strong> zu nehmen. Dazu werden die Artefakte, die eine<br />
<strong>Teststrategie</strong> für eine SOA beschreiben, identifiziert <strong>und</strong> präsentiert. Die Definition<br />
einer allgemeinen Vorgehensweise zur Findung einer konkreten <strong>Teststrategie</strong> erlaubt<br />
<strong>Teststrategie</strong>n für beliebige SOA-Projekte zu bestimmen.<br />
Ein im Rahmen dieser Arbeit entwickeltes Werkzeug erlaubt nicht nur die Umsetzung<br />
einer <strong>Teststrategie</strong>, sondern ermöglicht auch die Realisierung <strong>von</strong> Teststufen exemplarisch<br />
für in .NET implementierte Webservices. Dazu stellt diese Arbeit eine neue<br />
Sichtweise auf Komponenten vor <strong>und</strong> trennt diese klar <strong>von</strong> Kompositionen ab. Erfahrungen<br />
mit dem Werkzeug <strong>und</strong> einer konkret entwickelten <strong>Teststrategie</strong> wurden im<br />
Rahmen einer Fallstudie bei einem Unternehmen gesammelt.<br />
ii
Inhaltsverzeichnis<br />
1. Einführung 1<br />
1.1. Motivation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1<br />
1.2. Problemstellung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2<br />
1.3. Struktur dieser Arbeit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2<br />
2. Gr<strong>und</strong>lagen 4<br />
2.1. <strong>Testen</strong> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4<br />
2.1.1. Gr<strong>und</strong>begriffe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4<br />
2.1.2. Ausgewählte Testmethoden . . . . . . . . . . . . . . . . . . . . . 5<br />
2.1.3. Teststufe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7<br />
2.1.4. <strong>Teststrategie</strong> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8<br />
2.2. Serviceorientierte <strong>Architekturen</strong> . . . . . . . . . . . . . . . . . . . . . . . 8<br />
2.2.1. Gr<strong>und</strong>begriffe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8<br />
2.2.2. Konsequenzen . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10<br />
2.3. Plattformen für Unternehmensanwendungen . . . . . . . . . . . . . . . 12<br />
2.4. Webservices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12<br />
2.4.1. Gr<strong>und</strong>begriffe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12<br />
2.4.2. Webservice Standards . . . . . . . . . . . . . . . . . . . . . . . . 14<br />
2.5. Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14<br />
3. Ableitung einer <strong>Teststrategie</strong> für serviceorientierte <strong>Architekturen</strong> 15<br />
3.1. Einordnung der <strong>Teststrategie</strong> . . . . . . . . . . . . . . . . . . . . . . . . 15<br />
3.2. Einflüsse auf die <strong>Teststrategie</strong> . . . . . . . . . . . . . . . . . . . . . . . . 16<br />
3.2.1. Idee, Plattform <strong>und</strong> Technologie . . . . . . . . . . . . . . . . . . 16<br />
3.2.2. Projektumfeld . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18<br />
3.3. <strong>Teststrategie</strong> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18<br />
3.3.1. Serviceumgebung . . . . . . . . . . . . . . . . . . . . . . . . . . 18<br />
3.3.2. Vorgehensweise . . . . . . . . . . . . . . . . . . . . . . . . . . . 19<br />
3.3.3. Testszenario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21<br />
3.4. Komponententests für eine SOA . . . . . . . . . . . . . . . . . . . . . . 22<br />
3.4.1. Vorgehen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22<br />
3.4.2. Identifikation der Komponente bei Services . . . . . . . . . . . . 23<br />
3.4.3. Austauschen <strong>von</strong> Komponenten in Services . . . . . . . . . . . . 23<br />
3.5. Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26<br />
4. Testaspekte für SOA, Webservices <strong>und</strong> .NET 27<br />
4.1. Identifikation <strong>von</strong> Testaspekten . . . . . . . . . . . . . . . . . . . . . . . 28<br />
4.1.1. SOA als Idee . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28<br />
iii
Inhaltsverzeichnis<br />
4.1.2. Webservices als Technologie . . . . . . . . . . . . . . . . . . . . 32<br />
4.1.3. .NET als Plattform . . . . . . . . . . . . . . . . . . . . . . . . . . 33<br />
4.2. Analogien zu Java EE . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35<br />
4.3. Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35<br />
5. Werkzeugunterstützung für die <strong>Teststrategie</strong> 36<br />
5.1. Überblick . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36<br />
5.1.1. Anforderungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36<br />
5.1.2. Konsequenzen . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38<br />
5.1.3. Prozess . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38<br />
5.2. Testmöglichkeiten in .NET . . . . . . . . . . . . . . . . . . . . . . . . . . 39<br />
5.3. Architektur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40<br />
5.3.1. Grobarchitektur . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40<br />
5.3.2. Testablauf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41<br />
5.3.3. Adapter zu einem Unit Test Framework . . . . . . . . . . . . . . 42<br />
5.3.4. Interaktion mit externen Systemen . . . . . . . . . . . . . . . . . 44<br />
5.4. Implementierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46<br />
5.5. Realisierung <strong>von</strong> harten Mocks . . . . . . . . . . . . . . . . . . . . . . . 47<br />
5.5.1. Identifikation <strong>von</strong> auszutauschenden Teilen . . . . . . . . . . . . 47<br />
5.5.2. Verarbeitung <strong>und</strong> Austauschen <strong>von</strong> Code . . . . . . . . . . . . . 47<br />
5.6. Realisierung <strong>von</strong> weichen Mocks . . . . . . . . . . . . . . . . . . . . . . 49<br />
5.7. Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52<br />
6. Fallstudie 53<br />
6.1. Projektumfeld . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53<br />
6.1.1. Betrachtete Webservices . . . . . . . . . . . . . . . . . . . . . . 54<br />
6.1.2. Bisheriges Vorgehen beim <strong>Testen</strong> der Webservices . . . . . . . 55<br />
6.2. Eine konkrete <strong>Teststrategie</strong> . . . . . . . . . . . . . . . . . . . . . . . . . 56<br />
6.2.1. Annahmen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56<br />
6.2.2. Testmatrix <strong>und</strong> Testszenarien . . . . . . . . . . . . . . . . . . . . 56<br />
6.3. Anwendung der <strong>Teststrategie</strong> . . . . . . . . . . . . . . . . . . . . . . . . 59<br />
6.3.1. Umsetzung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59<br />
6.3.2. Gef<strong>und</strong>ene Fehler . . . . . . . . . . . . . . . . . . . . . . . . . . 62<br />
6.4. Lektionen <strong>und</strong> Bewertung . . . . . . . . . . . . . . . . . . . . . . . . . . 64<br />
6.5. Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65<br />
7. Kritische Würdigung 66<br />
7.1. Kritischer Rückblick auf den Erarbeitungsprozess . . . . . . . . . . . . . 66<br />
7.2. Stärken <strong>und</strong> Schwächen einer <strong>Teststrategie</strong> . . . . . . . . . . . . . . . . 66<br />
7.3. Stärken <strong>und</strong> Schwächen der entwickelten Erweiterungen . . . . . . . . 67<br />
7.4. Kritischer Rückblick auf die Fallstudie . . . . . . . . . . . . . . . . . . . 68<br />
8. Verwandte Arbeiten 70<br />
8.1. Andere Ansätze <strong>und</strong> Werkzeuge . . . . . . . . . . . . . . . . . . . . . . 70<br />
8.2. Testaspekte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71<br />
8.3. <strong>Testen</strong> <strong>von</strong> Kompositionen . . . . . . . . . . . . . . . . . . . . . . . . . . 71<br />
iv
Inhaltsverzeichnis<br />
9. Zusammenfassung <strong>und</strong> Ausblick 73<br />
9.1. Rückblick . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73<br />
9.2. Ausblick . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74<br />
9.3. Fazit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75<br />
Literaturverzeichnis 76<br />
A. Testszenarien 79<br />
v
1. Einführung<br />
1.1. Motivation<br />
Serviceorientierte <strong>Architekturen</strong> (SOA) sind längst mehr als nur ein Schlagwort oder<br />
Werbeträger. Das zentrale Ziel einer SOA besteht in der Reduktion <strong>von</strong> Abhängigkeiten<br />
zwischen Softwarelösungen [Sta06a]. Aber Dienste in heterogenen, dynamischen<br />
<strong>und</strong> verteilten Umgebungen anzubieten, fordert neue Sichtweisen beim <strong>Testen</strong> eines<br />
Services. So sind viele bekannte Testverfahren <strong>und</strong> -werkzeuge nicht mehr anwendbar<br />
[CP06].<br />
Webservices sind nur eine mögliche Implementierung <strong>von</strong> Services [Sta06a]. Dennoch<br />
hat sich diese Technologie als die dominierende <strong>und</strong> am weitesten verbreitete<br />
Realisierung für SOA etabliert. Nicht zuletzt unterstützen viele Applikationsserver <strong>und</strong><br />
Entwicklungsumgebungen aus dem Java- oder Microsoft .NET-Umfeld die Bereitstellung<br />
<strong>von</strong> Webservices [MTSM03][GP06]. Selbst Unternehmen, unter anderem zu nennen<br />
seien Amazon 1 <strong>und</strong> Ebay 2 , lagern Teile ihrer Dienste in Webservices aus. Folglich<br />
können K<strong>und</strong>en <strong>von</strong> überall auf der Welt ohne Benutzeroberfläche mit einem Geschäft<br />
interagieren <strong>und</strong> es sogar in ihre eigenen Geschäftsprozesse einbinden.<br />
Ein Kernkonzept <strong>von</strong> SOA ist die Komposition oder Zusammenschaltung <strong>von</strong> Services,<br />
um eine Applikation zu bilden [HS05]. Infolgedessen führen Fehler in einem einzelnen<br />
Service zu fehlerhaftem Gesamtverhalten. <strong>Testen</strong> wird somit unabdingbar, um die qualitativ<br />
hochwertige Implementierung <strong>von</strong> jedem Service sicher zu stellen. Insbesondere<br />
in den letzten Jahren wurden viele neue Ansätze <strong>und</strong> Werkzeuge entwickelt, um das<br />
<strong>Testen</strong> <strong>von</strong> SOA zu verbessern. Dennoch beruhen alle Entwicklungen auf denselben<br />
Ansätzen <strong>und</strong> betrachten Services als eine abgeschlossene Einheit, so dass sich das<br />
<strong>Testen</strong> selbst mitunter als sehr schwierig erweist.<br />
Durch die Verfügbarkeit <strong>von</strong> einfach zu handhabenden Werkzeugen [BG98] haben<br />
Komponententests zunehmend an Bedeutung gewonnen. Für nahezu jede Plattform<br />
ist ein „xUnit Test Framework“ [Ham04] verfügbar <strong>und</strong> erlaubt die einheitliche Formulierung<br />
<strong>von</strong> Komponententests . Auch die Integration in Entwicklungsumgebungen hat<br />
sich stetig verbessert [GP06], so dass Komponententests zu einer entwicklernahen<br />
<strong>und</strong> praktikablen Lösung geworden sind. Auch wenn für eine SOA Werkzeuge wie<br />
z.B. BPELUnit [May06] oder WSUnit [WSU] existieren, so nehmen sie eine bestimmte<br />
Sichtweise bei Komponententests ein. Oft werden jedoch bekannte Bibliotheken <strong>und</strong><br />
objektorientierte Programmiersprachen eingesetzt, um einen Service zu realisieren.<br />
Speziell in diesem Umfeld versagen beim <strong>Testen</strong> Konzepte, die für objektorientierte<br />
1 http://www.amazon.com<br />
2 http://www.ebay.com<br />
1
1. Einführung<br />
Software zur täglichen Praxis geworden sind. Sowohl die Interaktion mit einem Service,<br />
als auch das Austauschen <strong>von</strong> Komponenten, erfordert neue Sichtweisen <strong>und</strong><br />
Ideen.<br />
Das <strong>Testen</strong> <strong>von</strong> Webservices <strong>und</strong> Kompositionen hat in der Forschung viel Aufmerksamkeit<br />
erfahren. Insbesondere die Eigenschaften, die bei einem Webservice funktional<br />
zu testen sind, sind wohl bekannt. Dennoch bleibt beim <strong>Testen</strong> die genaue Vorgehensweise<br />
unklar. Es fehlt eine Strategie, die Aktivitäten den Teststufen zuordnet <strong>und</strong><br />
z.B. festlegt welche Tests zu automatisieren sind. Mitunter benötigt auch diese <strong>Teststrategie</strong><br />
weitere Unterstützung durch Werkzeuge, um erst praktikabel umsetzbar zu<br />
sein.<br />
1.2. Problemstellung<br />
Diese Arbeit befasst sich im Allgemeinen mit dem <strong>Testen</strong> <strong>von</strong> <strong>serviceorientierten</strong> <strong>Architekturen</strong>.<br />
Im Einzelnen sind dazu die folgenden Punkte gezielt zu adressieren:<br />
• Ziel dieser Arbeit ist eine <strong>Teststrategie</strong> für serviceorientierte <strong>Architekturen</strong> bereit<br />
zu stellen, so dass beim Einsatz einer SOA die Vorgehensweise beim <strong>Testen</strong><br />
bekannt ist. Beginnen soll die <strong>Teststrategie</strong> bei Komponententests, aber auch<br />
höhere Teststufen sind zu berücksichtigen.<br />
• Falls erforderlich ist ein Werkzeug zu erstellen, das die Umsetzung der <strong>Teststrategie</strong><br />
praktisch ermöglicht. Speziell die Realisierung <strong>von</strong> Komponententests ist<br />
dabei zu berücksichtigen.<br />
• Im Rahmen einer Fallstudie ist zu prüfen, ob die vorgeschlagene <strong>Teststrategie</strong><br />
umsetzbar ist <strong>und</strong> erstellte Werkzeuge praktikabel sind. Als Testobjekte werden<br />
Webservices dienen, die <strong>von</strong> einem Unternehmen entwickelt wurden <strong>und</strong><br />
<strong>von</strong> ihren K<strong>und</strong>en genutzt werden. Hierbei sollen insbesondere die notwendigen<br />
Schritte zur Erzeugung <strong>von</strong> Testdaten nachvollziehbar sein. Zur Entwicklung wird<br />
vom Unternehmen das Microsoft .NET Framework <strong>und</strong> die Microsoft Visual Studio<br />
Team Edition [GP06] eingesetzt, so dass alle erstellten Werkzeuge <strong>und</strong> Tests<br />
dort anwendbar sein müssen.<br />
1.3. Struktur dieser Arbeit<br />
Diese Arbeit untergliedert sich in die folgenden Kapitel:<br />
• In Kapitel 2 werden einige Gr<strong>und</strong>lagen über <strong>Testen</strong> <strong>und</strong> serviceorientierte <strong>Architekturen</strong><br />
unabhängig <strong>von</strong>einander eingeführt. Aufgr<strong>und</strong> unterschiedlicher Definitionen<br />
im SOA-Umfeld, werden die verwendete Terminologie <strong>und</strong> das Verständnis<br />
<strong>von</strong> einer SOA definiert.<br />
• Aufgr<strong>und</strong> bestimmter Einflüsse ist es nicht möglich direkt eine <strong>Teststrategie</strong> für<br />
SOA anzugeben. Kapitel 3 wird alle Einflüsse analysieren <strong>und</strong> ein allgemeines<br />
2
1. Einführung<br />
Vorgehen zur Findung einer <strong>Teststrategie</strong> präsentieren.<br />
• Kapitel 4 wird konkret für Webservices <strong>und</strong> dem Microsoft .NET Framework potentielle<br />
Probleme nach dem Vorgehen aus Kapitel 3 vorstellen. Webservices<br />
<strong>und</strong> das Microsoft .NET Framework werden aufgr<strong>und</strong> der Relevanz in der Fallstudie<br />
in Kapitel 6 betrachtet.<br />
• Kapitel 5 stellt ein Werkzeug vor, mit dem Teststufen für Webservices umgesetzt<br />
werden können <strong>und</strong> eine nach Kapitel 3 angegebene <strong>Teststrategie</strong> realisierbar<br />
wird.<br />
• In Kapitel 6 werden die Ergebnisse aus den Kapiteln 3, 4 <strong>und</strong> 5 in einer Fallstudie<br />
zusammengeführt, um die Webservices eines Unternehmens zu testen.<br />
• Die Stärken <strong>und</strong> Schwächen der <strong>Teststrategie</strong> <strong>und</strong> des Werkzeugs werden in<br />
einer kritischen Würdigung in Kapitel 7 beleuchtet.<br />
• Kapitel 8 zeigt verwandte Arbeiten, um die Einordnung dieser Arbeit in den wissenschaftlichen<br />
Kontext zu erleichtern.<br />
• Diese Arbeit schließt in Kapitel 9 mit einer Zusammenfassung <strong>und</strong> einem Ausblick<br />
ab.<br />
3
2. Gr<strong>und</strong>lagen<br />
Während der Entwicklung durchlebt Software einen Lebenszyklus, der sich in mehrere<br />
Aktivitäten unterteilt. Von der Analyse der Anforderungen, über die Programmierung,<br />
bis zum <strong>Testen</strong>, arbeiten in jeder Aktivität verschiedene Persönlichkeiten zusammen.<br />
Oftmals wird dieses Vorgehen definiert, sei es durch das V-Modell [Boe79] oder durch<br />
agile Entwicklungsmethoden, z.B. Extreme Programming (XP) [Bec00].<br />
<strong>Testen</strong> ist eine Aktivität, deren Durchführung die Qualität eines Produktes bewertet<br />
[IEE04]. Hierbei ist ein Test die Ausführung <strong>und</strong> Beobachtung <strong>von</strong> Teilen des Produktes.<br />
Die sich anschließende Behebung <strong>von</strong> identifizierten Mängeln <strong>und</strong> Fehlern verbessert<br />
das Produkt. Sowohl das V-Modell, als auch XP, sehen Tests als durchzuführende<br />
Aktivität vor. Dabei hat jedes Projekt ein individuelles Vorgehen <strong>und</strong> unterschiedliche<br />
Kapazitäten zur Realisierung <strong>von</strong> Tests. Speziell in XP testen nur Entwickler ihren Code<br />
durch automatisierte Komponententests.<br />
Serviceorientierte <strong>Architekturen</strong> (SOA) sind ein Stil zur Strukturierung <strong>von</strong> Applikationen.<br />
Durch viel Aufmerksamkeit in der Industrie sind sehr unterschiedliche Definitionen<br />
einer SOA entstanden [OAS06]. Besonders die Trennung zu Webservices ist verschwommen,<br />
weil sich Webservices zur verbreitetsten <strong>und</strong> bekanntesten Umsetzung<br />
<strong>von</strong> Services etabliert haben.<br />
Dieses Kapitel wird alle für den Verlauf dieser Arbeit wichtigen Begriffe bezüglich des<br />
<strong>Testen</strong>s <strong>und</strong> SOA definieren. In den Folgekapiteln werden beide Themengebiete dann<br />
langsam einander angenährt, um eine <strong>Teststrategie</strong> für SOA zu formen.<br />
2.1. <strong>Testen</strong><br />
2.1.1. Gr<strong>und</strong>begriffe<br />
Tester sind die Scheinwerfer in einem Projekt, die die Straße für Programmierer <strong>und</strong><br />
Manager erleuchten [KBP02]. Sie zeigen, ob man sich nahe am Abgr<strong>und</strong> bewegt oder<br />
auf sicherer Spur fährt.<br />
Im Allgemeinen ist das Produkt der Programmierung ein ausführbares Kompilat. Beim<br />
<strong>Testen</strong> sind es Testfälle, die letztendlich genutzt werden, um Aspekte einer Software<br />
in einem bestimmten Umfeld zu testen. Ein Testfall besteht dabei aus Eingabedaten,<br />
Ausführungsbedingungen <strong>und</strong> erwarteten Ergebnissen [IEE90]. Die Ableitung<br />
oder Auswahl <strong>von</strong> Testfällen ist durch Testmethoden [SLS06] möglich.<br />
Im Allgemeinen lässt sich jeder Test über fünf Dimensionen beschreiben [KBP02]:<br />
4
2. Gr<strong>und</strong>lagen<br />
• Tester: Wer führt einen Test durch? Neben Testern, können auch andere Benutzergruppen<br />
Tests durchführen:<br />
– Entwickler testen ihren Code z.B. durch automatisierte Komponententests<br />
in XP.<br />
– Endnutzer testen ein Produkt im Rahmen eines Betatests.<br />
• Abdeckung: Was wird getestet? Zum <strong>Testen</strong> wird immer ein Testobjekt benötigt,<br />
das durch konkrete Testfälle geprüft wird. Hierbei kann es sich z.B. um die<br />
Methode einer Klasse handeln oder die Oberfläche einer Applikation.<br />
• Potentielle Probleme: Warum wird getestet? Welche Fehler können im Produkt<br />
auftreten?<br />
• Aktivitäten: Wie wird getestet?<br />
• Auswertung: Wann ist ein Test erfolgreich <strong>und</strong> wann fehlgeschlagen? Tritt der<br />
gewünschte Effekt bei Ansteuerung des Testobjekts ein, d.h. sind resultierende<br />
Werte korrekt oder wird eine erwartete Fehlermeldung geliefert.<br />
Beispiel 2.1<br />
Bei der Testmethode „<strong>Testen</strong> <strong>von</strong> Funktionen“ („function testing“) wird jede Funktion<br />
einzeln nacheinander getestet. Demzufolge wird nur eine Aussage über die Abdeckung<br />
getroffen, aber wer den Test durchführt (Tester) oder was für Fehler (Potentielle<br />
Probleme) gesucht werden, bleibt unbekannt. [KBP02]<br />
Testmethoden sind formal anwendbare Methoden, die noch nicht in allen Dimensionen<br />
eine Ausprägung besitzen.<br />
Definition 2.1<br />
Ein Testaspekt ist eine Ausprägung über der Dimension: Potentielle Probleme. Zusätzlich<br />
beschreibt ein Testaspekt die Vorgehensweise zur Herleitung <strong>von</strong> Testfällen<br />
unter Einbezug <strong>von</strong> Testmethoden.<br />
Ein Testaspekt beschreibt somit eine Klasse <strong>von</strong> Fehlern, die in einem Testobjekt auftreten<br />
können. Insbesondere ist aber auch das Vorgehen zur Findung dieses Fehlers<br />
zu beschreiben. Wenn bekannte Testmethoden existieren, sind diese anzugeben, ansonsten<br />
ist eine allgemeine Beschreibung zur Ableitung <strong>von</strong> Testfällen zu definieren.<br />
Im Verlauf dieser Arbeit werden ausschließlich Testaspekte benutzt, um potentielle<br />
Probleme in einer SOA zu definieren <strong>und</strong> die Vorgehensweise zum Auffinden dieser<br />
Probleme festzuhalten.<br />
2.1.2. Ausgewählte Testmethoden<br />
In dieser Arbeit werden potentielle Probleme über Testaspekte beschrieben. Dabei<br />
stützt sich die Beschreibung der Vorgehensweise zur Identifikation <strong>von</strong> repräsentierten<br />
Fehlern auf Testmethoden, <strong>von</strong> denen eine benutzte Auswahl im Folgenden kurz<br />
5
2. Gr<strong>und</strong>lagen<br />
vorgestellt sei. Jede Testmethode ist durch ihren englischen Namen benannt <strong>und</strong> für<br />
weitere Informationen sei auf die angegebene Literatur verwiesen:<br />
• Equivalence partitioning ([IEE04], [KBP02]): Unterteilung <strong>von</strong> Testdaten in Äquivalenzklassen,<br />
d.h. alle Testdaten aus einer Äquivalenzklasse führen bei einem<br />
Test zu äquivalentem Verhalten. So genügt es für ausgewählte Elemente einer<br />
Äquivalenzklasse zu testen.<br />
• Regression testing ([IEE04], [KBP02], [SLS06]): Erneutes <strong>Testen</strong> eines Systems<br />
nach einer Modifikation, um zu verifizieren, dass durch Änderungen keine unbeabsichtigten<br />
Effekte im System entstanden sind. Dazu werden vorhandene<br />
Testfälle erneut verwendet.<br />
• Statement and branch coverage ([IEE04], [KBP02]): Man erreicht 100% statement<br />
and branch coverage, wenn ein Test jede Anweisung <strong>und</strong> jeden Zweig im<br />
Programm ausführt. Tests werden so gestaltet, dass sie eine möglichst hohe<br />
statement and branch coverage erzielen.<br />
• Function testing ([KBP02]): <strong>Testen</strong> <strong>von</strong> jeder Funktion einzeln <strong>und</strong> nacheinander.<br />
White-Box Ansätze testen dabei jede Funktion wie man sie im Code sieht. Black-<br />
Box Ansätze testen jede Funktion wie sie ein Benutzer im System nutzt.<br />
• Specification testing ([KBP02]): Verifizierung sachbezogener Anforderungen, die<br />
in Spezifikationen, Handbüchern oder anderen Dokumenten an das Produkt gestellt<br />
werden.<br />
• Load testing ([KBP02]): An ein System werden viele Anfragen gestellt. Bei einer<br />
hohen Auslastung wird das System wahrscheinlich ausfallen, so dass Schwachstellen<br />
offensichtlich werden.<br />
• Performance testing ([IEE04], [KBP02]): Verifiziert, ob ein System Anforderungen<br />
an die Leistung erfüllt, z.B. an den Durchsatz oder an Antwortzeiten. Erhebliche<br />
Leistungseinbrüche gegenüber einer vorherigen Version des Systems<br />
können auf Fehler in der Programmierung hinweisen.<br />
• Long sequence testing ([KBP02]): Über Nacht, Tage oder Wochen werden Anfragen<br />
an ein System gestellt.<br />
• Smoke testing ([KBP02]): Testet gr<strong>und</strong>legende Eigenschaften, <strong>von</strong> denen erwartet<br />
wird, dass sie im System funktionsfähig sind. Ziel ist es zu prüfen, ob eine<br />
neue Version des Systems würdig ist getestet zu werden. Diese Tests sind oftmals<br />
automatisiert.<br />
• Path testing ([KBP02]): Ein Pfad beinhaltet alle Schritte, die ein Tester ausführt,<br />
oder alle Anweisungen, die ein Programm ausführt, um einen bestimmten Zustand<br />
zu erreichen. Dabei ist es nicht möglich alle Pfade eines nicht trivialen<br />
Programms zu testen.<br />
• Configuration testing ([IEE04], [KBP02]): Analyse <strong>von</strong> Software unter Einsatz<br />
verschiedener spezifizierter Konfigurationen.<br />
• Bo<strong>und</strong>ary-value analysis ([IEE04], [KBP02]): Lassen sich Äquivalenzklassen für<br />
6
2. Gr<strong>und</strong>lagen<br />
Zahlenwerte aufstellen, so sind die Grenzen der kleinste <strong>und</strong> größte Wert dieser<br />
Klasse. Testfälle nutzen diese Grenzen <strong>und</strong> Werte nahe den Grenzen.<br />
2.1.3. Teststufe<br />
Die Ursache eines Mangels in einem großen <strong>und</strong> komplexen System zu finden, ist<br />
mitunter ein schwieriges Unterfangen. In der objektorientierten Programmierung interagieren<br />
am Ende eines Projekts Tausende <strong>von</strong> Objekten miteinander, um eine Applikation<br />
zu formen. Existiert in einem dieser vielen Objekte ein Fehler, so lässt er sich<br />
nur schwer identifizieren. Eine Abschwächung dieses Problems ist durch den Einsatz<br />
<strong>von</strong> drei Teststufen möglich:<br />
1. Komponententests (unit test [IEE04]): Eine Komponente sei die kleinste kompilierbare<br />
Einheit in einer Applikation [Tam02], so sind es z.B. in der objektorientierten<br />
Programmierung die Klassen [SLS06]. Komponententests verifizieren<br />
jede einzelne Komponente isoliert <strong>von</strong> allen anderen Komponenten durch den<br />
Einsatz <strong>von</strong> künstlichen Umgebungen [Tam02]. Praktisch werden dazu Mocks 1<br />
eingesetzt, die das Verhalten einer Komponente simulieren [TH02]. Dabei haben<br />
Mocks das Ziel so einfach wie möglich umgesetzt zu sein <strong>und</strong> nicht die Logik der<br />
ersetzten Komponente nachzubilden [MFC01].<br />
Verfasst werden Komponententests z.B. mit Unit Test Frameworks, die für eine<br />
Vielzahl <strong>von</strong> Sprachen zur Verfügung stehen [Ham04]. Dennoch setzen Komponententests<br />
voraus, dass alle <strong>von</strong> einer Komponente benutzten Komponenten<br />
austauschbar sind. In der objektorientierten Programmierung kann dies durch<br />
einen Programmierstil erreicht werden, der z.B. auf geringe Komplexität setzt<br />
<strong>und</strong> <strong>von</strong> globalen Objekten unabhängig ist [Goo06]. Zusätzlich haben sich über<br />
die Jahre Werkzeuge entwickelt, die bei der Erstellung <strong>von</strong> Mocks unterstützen<br />
[FMP + ] oder auch die Anforderungen an die Testbarkeit reduzieren [Typ].<br />
2. Integrationstests (integration test [IEE04]): Als Folgestufe nach Komponententests<br />
werden bei Integrationstests Komponenten zu größeren Teilsystemen integriert<br />
[SLS06]. Ziel ist es durch schrittweise Integration sicherzustellen, dass alle<br />
Komponenten korrekt zusammenarbeiten.<br />
3. Systemtests (system test [IEE04]): Systemtests verifizieren bzw. validieren das<br />
gesamte Produkt, nachdem alle Teile einer Software integriert wurden [Tam02].<br />
Insbesondere sind andere Sichtweisen testbar als dies auf niedrigeren Stufen<br />
der Fall ist - z.B. Performance- <strong>und</strong> Lasttests.<br />
Der Einsatz <strong>von</strong> Teststufen erleichtert das <strong>Testen</strong>, indem nicht immer mit einem evtl.<br />
großem <strong>und</strong> unübersichtlichem Produkt gearbeitet wird. Das <strong>Testen</strong> <strong>von</strong> einzelnen<br />
Komponenten <strong>und</strong> deren Zusammenspiel erweist sich oftmals als einfacher. Für diese<br />
Arbeit sind Abnahmetests unerheblich <strong>und</strong> seien daher nicht angeführt.<br />
1 Auch: Stub oder Dummy<br />
7
2. Gr<strong>und</strong>lagen<br />
2.1.4. <strong>Teststrategie</strong><br />
Bisher wurde eine kleine Auswahl an Gr<strong>und</strong>begriffen aus dem Bereich des <strong>Testen</strong>s<br />
vorgestellt. Dennoch beschreiben all diese Ansätze <strong>und</strong> Methoden noch nicht wie ein<br />
Produkt zu testen ist. Es fehlt eine Darlegung der Vorgehensweise, genauer die <strong>Teststrategie</strong>.<br />
Eine <strong>Teststrategie</strong> ist mehr als nur eine Sammlung <strong>von</strong> Testmethoden, aber auch noch<br />
kein Testkonzept [KBP02]. Ziel ist die Festlegung eines einheitlichen Ansatzes für die<br />
zukünftige Testplanung. Eine <strong>Teststrategie</strong> legt den Umfang durchzuführender Tests<br />
fest <strong>und</strong> adressiert nur Probleme mit kritischem Risiko [SLS06].<br />
Definition 2.2<br />
Eine <strong>Teststrategie</strong> ist die „(1) Abstrakte Beschreibung der Teststufen <strong>und</strong> der zugehörigen<br />
Ein- <strong>und</strong> Ausgangskriterien . . . (2) Aufteilung <strong>von</strong> Testaufwand über die zu testenden<br />
Teile <strong>und</strong>/oder zu erfüllende Qualitätsmerkmale des Testobjekts. Auswahl <strong>und</strong><br />
Bestimmung der Reihenfolge <strong>von</strong> einzelnen Testmethoden <strong>und</strong> der Reihenfolge ihrer<br />
Anwendung auf die verschiedenen Testobjekte . . . “ [imb]<br />
Eine <strong>Teststrategie</strong> ist in der Regel in mehreren Projekten anwendbar [imb]. Sie beschreibt<br />
den Einsatz <strong>von</strong> Teststufen <strong>und</strong> legt das Vorgehen beim <strong>Testen</strong> fest, wenn<br />
möglich unter Angabe <strong>von</strong> Testmethoden.<br />
Beispiel 2.2<br />
Testgetriebene Entwicklung ist eine <strong>Teststrategie</strong>, die ein iteratives Vorgehen nahe<br />
legt. Bevor Code geschrieben wird, ist immer ein Test zu verfassen, der zunächst fehlschlagen<br />
muss. Als Idee wird jede Methode einzeln mit Komponententests getestet,<br />
mit der Besonderheit, dass ein Testfall vor der Implementierung formuliert wird. Höhere<br />
Teststufen werden nicht betrachtet. Insbesondere ist der Testaufwand festgelegt,<br />
weil kein Code ohne Test existiert.<br />
Testaspekte beschreiben ein konkretes Problem <strong>und</strong> bilden eine Sammlung <strong>von</strong> Testmethoden,<br />
um das Problem ausfindig zu machen. Folglich kann eine <strong>Teststrategie</strong><br />
über Testaspekte beschrieben werden.<br />
2.2. Serviceorientierte <strong>Architekturen</strong><br />
2.2.1. Gr<strong>und</strong>begriffe<br />
Im Folgenden wird ein einheitlich in dieser Arbeit verwendeter Sprachschatz für SOA<br />
eingeführt. Dabei liegt der Fokus auf Einfachheit, so dass für weitere Informationen<br />
auf [OAS06], [Sta06a] <strong>und</strong> [W3C04] verwiesen sei.<br />
Definition 2.3<br />
Eine Schnittstelle ist ein Dokument, das beschreibt wie mit einem Objekt zu interagieren<br />
ist <strong>und</strong> was <strong>von</strong> einer Einheit angeboten wird. Erfolgt die Interaktion mit dieser<br />
8
2. Gr<strong>und</strong>lagen<br />
Einheit über Nachrichten, so legt die Schnittstelle das Format der Nachrichten fest.<br />
Zur Auswertung <strong>und</strong> Interpretation einer Schnittstelle ist eine einheitliche <strong>und</strong> öffentliche<br />
Beschreibung notwendig. Die Beschreibung ist auch in der Lage mögliche Kommunikationsformen<br />
zu realisieren.<br />
Definition 2.4<br />
Eine Dokumentation ist ein Dokument, das die semantischen Eigenschaften, Randbedingungen<br />
<strong>und</strong> den Effekt einer Einheit beschreibt.<br />
Die Schnittstelle <strong>und</strong> die Dokumentation einer Einheit sind Artefakte, durch die eine<br />
Interaktion mit der Einheit möglich wird.<br />
Definition 2.5<br />
Ein Service ist eine aktive Einheit, die Anderen seine Dienste anbietet. Jeder Service<br />
hat eine Schnittstelle, die Serviceschnittstelle, eine Beschreibung, die Servicebeschreibung<br />
<strong>und</strong> optional eine Dokumentation, die Servicedokumentation. Die Kommunikation<br />
zwischen Services erfolgt durch den Austausch <strong>von</strong> Nachrichten. Das Resultat<br />
einer Interaktion mit einem Service ist ein Effekt.<br />
Ein Service wird in der Fachliteratur <strong>und</strong> im allgemeinen Gebrauch immer abstrakt als<br />
ein Anbieter <strong>von</strong> Diensten betrachtet. Die gegebene Definition stützt sich auf den Austausch<br />
<strong>von</strong> Nachrichten, um Kopplungen an die Kommunikationsform zu reduzieren.<br />
Eine SOA hat zum Ziel die Abhängigkeiten zwischen „Softwareinseln“ zu reduzieren<br />
[Sta06a]. Dabei befasst sich SOA jedoch nicht nur mit Services, sondern stellt auch<br />
die Beziehungen zwischen zunächst drei Rollen her [Pap03]:<br />
• Serviceanbieter (service provider): Stellt einen Service zur Verfügung <strong>und</strong> verwaltet<br />
die notwendige Infrastruktur.<br />
• Servicekonsument (service consumer): Möchte Dienste in Anspruch nehmen<br />
<strong>und</strong> sucht einen entsprechenden Service.<br />
• Serviceregister (service registry): Stellt ein Verzeichnis <strong>von</strong> Services bereit.<br />
Jeder Service verwendet das „Bridge“-Entwurfsmuster [GHJV95], um die Serviceschnittstelle<br />
<strong>von</strong> der Implementierung zu trennen [Sta06a]. Deshalb muss der Serviceanbieter<br />
nicht immer zwangsläufig auch der Ersteller des Services sein, so dass<br />
die Rolle des Serviceentwicklers ebenfalls <strong>von</strong> Bedeutung ist. Diese Arbeit betrachtet<br />
eine nach Abbildung 2.1 entsprechend erweiterte Darstellung des klassischen SOA-<br />
Dreiecks [Pap03].<br />
Definition 2.6<br />
Die <strong>von</strong> einem Serviceentwickler erstellte Implementierung eines Services heißt Serviceimplementierung.<br />
Durch die Kenntnis <strong>von</strong> Services ist es möglich eine serviceorientierte Architektur zu<br />
definieren. Diese stützt sich auf Abbildung 2.1 <strong>und</strong> das erweiterte SOA-Dreieck. Genauer<br />
ist das Zusammenspiel aller beteiligten Rollen die Kerneigenschaft einer SOA.<br />
9
2. Gr<strong>und</strong>lagen<br />
Serviceregister<br />
Veröffentlichen<br />
Finden<br />
Servicekonsument<br />
Binden <strong>und</strong><br />
Aufrufen<br />
Bereitstellen<br />
Serviceanbieter<br />
Serviceentwickler<br />
Abbildung 2.1.: Erweitertes SOA-Dreieck<br />
Definition 2.7<br />
Eine serviceorientierte Architektur (SOA) ist die Strukturierung einer Lösung nach<br />
dem erweiterten SOA-Dreieck.<br />
2.2.2. Konsequenzen<br />
Zum Verständnis dieser Arbeit ist es notwendig, einige Besonderheiten <strong>und</strong> Konsequenzen<br />
aus dem Einsatz einer SOA zu kennen. Dabei ergibt sich eine Konsequenz<br />
nicht immer unmittelbar aus vorhergehenden Definitionen, sondern entsteht durch den<br />
praktischen Einsatz einer SOA.<br />
Das erweiterte SOA-Dreieck trifft keine Aussagen darüber wie die Serviceimplementierung<br />
umgesetzt wird. Insbesondere beim Serviceanbieter wird sie wie eine Black-Box<br />
behandelt. Wenn ein Service jedoch wieder selbst zu einem Servicekonsument wird,<br />
entsteht ein Verb<strong>und</strong> <strong>von</strong> Services.<br />
Konsequenz 2.1<br />
Eine Serviceimplementierung kann Services nutzen. Ein Szenario, indem ein Service<br />
durch das Zusammenschalten <strong>von</strong> Services entsteht, wird als Komposition bezeichnet<br />
[Yan03]. SOA begünstigt dadurch Flexibilität, indem auf Änderungen durch den<br />
Einsatz <strong>von</strong> alternativen Services reagiert werden kann [GP06]. Kompositionen werden<br />
häufig bei der Realisierung <strong>von</strong> Geschäftsprozessen eingesetzt [ACD + 03].<br />
Beispiel 2.3 zeigt ein Szenario aus [KBL06], um den Einsatz <strong>von</strong> Services <strong>und</strong> Kompositionen<br />
zu motivieren.<br />
Beispiel 2.3<br />
Ein Reisebüro bucht einen Ausflug für einen K<strong>und</strong>en. Als Erstes sucht das Reisebüro<br />
Flüge bei verschiedenen Fluggesellschaften für das gewünschte Datum. Danach bucht<br />
das Reisebüro den preisgünstigsten Flug. Ähnliche Aktivitäten führt das Reisebüro<br />
10
2. Gr<strong>und</strong>lagen<br />
für eine Hotelreservierung durch <strong>und</strong> mietet ein Auto. Eigentlich muss das Reisebüro<br />
diesen Vorgang für 25 K<strong>und</strong>en zur selben Zeit durchführen.<br />
Die Aktivitäten des Reisebüros aus Beispiel 2.3 bilden den Geschäftsprozess des Unternehmens.<br />
Während der Geschäftsprozess abgearbeitet wird, ist das Reisebüro ein<br />
Servicekonsument <strong>und</strong> Fluggesellschaften, Hotels, . . . sind Serviceanbieter. Dabei will<br />
das Reisebüro die einzelnen Aktivitäten im Geschäftsprozess automatisiert ausführen.<br />
Zur Interaktion mit einem Service muss der Servicekonsument den Aufbau der Nachrichten<br />
kennen, die ein Service erwartet. Folglich muss der Servicekonsument auch<br />
die Servicebeschreibung des Services kennen.<br />
Konsequenz 2.2<br />
Auf der Seite des Servicekonsumenten kommt häufig, wenn auch nicht zwingend notwendig,<br />
das „Proxy“-Entwurfsmuster [GHJV95] zum Einsatz [Sta06a]. Ein generierter<br />
Proxy findet, bindet <strong>und</strong> benutzt dabei einen Service [MTSM03].<br />
Der Einsatz eines Proxy auf Seiten des Servicekonsumenten vereinfacht die Kommunikation<br />
mit dem Service, wenn dieser Proxy automatisch generiert wird. Dazu ist unter<br />
Anwendung der Servicebeschreibung gezielt die Serviceschnittstelle auszuwerten.<br />
Konsequenz 2.3<br />
In der objektorientierten Programmierung müssen Objekte erst instanziiert werden bevor<br />
man mit ihnen interagieren kann. Hingegen interagiert der Servicekonsument mit<br />
einem bereits existierenden Service. [OAS06]<br />
Durch die Unkenntnis der Serviceinstanz hat der Servicekonsument keine direkte Kontrolle<br />
über einen Service, sondern kann nur mit ihm interagieren.<br />
Konsequenz 2.4<br />
Erst durch die Bereitstellung in einem Container, kann mit einem Service interagiert<br />
werden. D.h. der Vorgang der Bereitstellung macht aus einer Serviceimplementierung<br />
einen Service.<br />
Insbesondere verwaltet ein Container die Serviceinstanz.<br />
Konsequenz 2.5<br />
Die SOA Infrastruktur ist zunächst zustandslos [Sta06a]. Folglich ist zwischen mehreren<br />
Interaktionen mit einem Service nicht garantiert, dass es sich um die selbe Serviceinstanz<br />
handelt. Auf Seiten des Serviceanbieters sind z.B. Wechsel der Serviceinstanz<br />
durch den Einsatz <strong>von</strong> Service-Pools denkbar [Sta06a].<br />
Servicekonsumenten können an einen Service nahezu beliebige Nachrichten mit beliebigem<br />
Inhalt senden. Entweder wird die Nachricht verworfen oder aber ausgewertet<br />
<strong>und</strong> erhaltene Daten an die Serviceimplementierung weitergereicht.<br />
11
2. Gr<strong>und</strong>lagen<br />
Konsequenz 2.6<br />
SOA minimiert Annahmen an das Vertrauen [OAS06]. Daher benötigt ein Service eine<br />
qualitativ hochwertige Implementierung <strong>und</strong> Dokumentation, um Wiederverwendbarkeit<br />
<strong>und</strong> Unabhängigkeit zu garantieren.<br />
2.3. Plattformen für Unternehmensanwendungen<br />
Eine SOA wird häufig unter Einsatz einer Plattform zur Realisierung <strong>von</strong> serverseitigen<br />
Anwendungen umgesetzt. Bei der Betrachtung mehrerer Plattform wird ein einheitlicher<br />
Sprachschatz notwendig. Zur Herleitung sei zunächst die Java Enterprise Edition<br />
(Java EE) herangezogen <strong>und</strong> die Begriffe nach [JBC + 07] mit neutraler Namensgebung<br />
kurz vorgestellt:<br />
• Applikationen werden aus Enterprise Komponenten aufgebaut.<br />
• Ein Container bildet die Schnittstelle zwischen einer Enterprise Komponente<br />
<strong>und</strong> einer plattformspezifischen Implementierung zur Unterstützung der Enterprise<br />
Komponente. D.h. erst durch einen Container wird eine Enterprise Komponente<br />
nutzbar. Ein Web Container verwaltet die Enterprise Komponenten, die<br />
öffentlich in einem Netz angeboten werden. Ein Applikationsserver ist die äußere<br />
Verwaltungseinheit <strong>von</strong> mindestens einem Container.<br />
• Der Vorgang zur Übertragung einer Enterprise Komponente in einen Container<br />
heißt Bereitstellung.<br />
Serverseitige Anwendungen sind mit der Java EE oder dem Microsoft .NET Framework<br />
(.NET ) realisierbar. Java EE <strong>und</strong> .NET heißen Enterprise Plattformen. Als Versionen<br />
seien in dieser Arbeit Java EE 5.0 <strong>und</strong> .NET 2.0 angenommen.<br />
Im Folgenden sei eine Auswahl <strong>von</strong> verfügbaren Web Containern bzw. Applikationsservern<br />
angegeben:<br />
• Java EE: Apache Tomcat (Web Container), JBOSS (Applikationsserver).<br />
• .NET: ASP.NET Development Server (Web Container), Internet Information Services<br />
(Applikationsserver)<br />
2.4. Webservices<br />
2.4.1. Gr<strong>und</strong>begriffe<br />
Webservices sind eine Möglichkeit eine SOA zu realisieren. Sie sind so entworfen,<br />
dass eine plattformunabhängige Kommunikation zwischen Maschinen möglich wird<br />
[W3C04]. Deshalb stützen sich Webservices auf die Extensible Markup Language<br />
(XML) [W3C], einem Standard zur textbasierten Repräsentation <strong>von</strong> Daten.<br />
Eine Serviceschnittstelle wird definiert mit der Web Service Description Language<br />
12
2. Gr<strong>und</strong>lagen<br />
(WSDL) [W3C07]. Die Kommunikation erfolgt über Nachrichten, die mit dem Simple<br />
Object Access Protocol kodiert sind (SOAP). Das verwendete Protokoll zur Übertragung<br />
dieser Nachrichten wird in der Serviceschnittstelle festgelegt. Sowohl die WSDL,<br />
als auch SOAP basieren auf XML <strong>und</strong> sind somit auf mehreren Plattformen einsetzbar.<br />
Das Protokoll zum Auffinden <strong>von</strong> Webservices ist für den Verlauf dieser Arbeit<br />
unerheblich <strong>und</strong> wird daher nicht angeführt.<br />
Dienste bietet ein Webservice über Operationen an, die ein Servicekonsument nutzt.<br />
In der Serviceschnittstelle sind dazu die Eingabeparameter <strong>und</strong> der Rückgabewert<br />
jeder Operation definiert.<br />
Heutzutage werden Webservices oftmals mit Enterprise Plattformen durch Erstellung<br />
einer Enterprise Komponente implementiert. Dabei verbirgt die eingesetzte Entwicklungsumgebung<br />
<strong>und</strong> Enterprise Plattform die Komplexität bei der Erstellung eines<br />
Webservices. In Java EE <strong>und</strong> analog in .NET erstellt der Entwickler einen Webservice<br />
mit Klassen, die durch zusätzliche Metainformationen so annotiert werden [JBC + 07],<br />
dass ein Web Container automatisch die Serviceschnittstelle generiert. Zur Kommunikation<br />
<strong>und</strong> Interaktion wird ein Proxy eingesetzt, der den Austausch <strong>von</strong> SOAP-<br />
Nachrichten versteckt [MTSM03]. Abbildung 2.2 zeigt eine typische Architektur <strong>von</strong><br />
Enterprise Komponenten, die einen Webservice implementieren.<br />
Konsument<br />
Dienstschnittstellenschicht<br />
Servicevertrag<br />
Kommunikation<br />
Betriebsmanagement<br />
Sicherheit<br />
Geschäftsschicht<br />
Geschäftslogik<br />
Serviceadapter<br />
Geschäftsworkflow<br />
Geschäftselemente<br />
Ressourcenzugriffsschicht<br />
Datenzugriffslogik<br />
Dienstagenten<br />
Service<br />
Datenquellen<br />
Services<br />
Abbildung 2.2.: Webservice Referenzarchitektur [Sko06]<br />
13
2. Gr<strong>und</strong>lagen<br />
Webservices stellen die Konkretisierung einer SOA dar, so dass neue Konsequenzen<br />
entstehen.<br />
Konsequenz 2.7<br />
Viele Unternehmen setzen Webservices ohne Serviceregister ein [MTSM03], d.h. die<br />
Vollständigkeit bei der Implementierung einer SOA variiert.<br />
Ein Serviceregister erlaubt z.B. den Serviceanbieter zu wechseln, ohne dass ein Servicekonsument<br />
Änderungen in seiner Applikation vornehmen muss. Dennoch erhalten<br />
K<strong>und</strong>en oft direkt die Endpunkte <strong>von</strong> Webservices.<br />
Konsequenz 2.8<br />
Webservices werden in verteilten Anwendungen eingesetzt, d.h. die Interaktion mit<br />
einem Webservice ist entfernt.<br />
Jeder Webservice repräsentiert mehrere entfernte Prozeduren. Dabei erfolgt nach Definition<br />
2.5 die Interaktion mit einem Webservice über Nachrichten.<br />
2.4.2. Webservice Standards<br />
Neben Standards, die gr<strong>und</strong>legende Eigenschaften für Webservices festlegen, erfordern<br />
bestimmte Anforderungen an die Kommunikation Erweiterungen des SOAP <strong>und</strong><br />
der WSDL. Webservice Standards zur interoperablen Realisierung <strong>von</strong> z.B. Sicherheit<br />
oder Transaktionen adressieren dieses Problem. Für den Verlauf dieser Arbeit ist<br />
nur die Kenntnis <strong>von</strong> Webservice Standards relevant, spezielle Eigenschaften sind zu<br />
vernachlässigen.<br />
2.5. Zusammenfassung<br />
In diesem Kapitel wurden alle notwendige Gr<strong>und</strong>lagen <strong>und</strong> Begriffe vorgestellt, die für<br />
den weiteren Verlauf dieser Arbeit <strong>von</strong> Bedeutung sind:<br />
• Eine <strong>Teststrategie</strong> als Zuordnung <strong>von</strong> Testaspekten zu Teststufen.<br />
• Serviceorientierte <strong>Architekturen</strong> als ein Stil Anwendungen zu strukturieren.<br />
• Die häufige Umsetzung einer SOA mit Enterprise Plattformen.<br />
• Webservices als dominierende Realisierung einer SOA.<br />
In den folgenden Kapiteln sind die vorgestellten Begriffe aus dem Bereich des <strong>Testen</strong>s<br />
<strong>und</strong> SOA zu vereinen, um eine <strong>Teststrategie</strong> für eine SOA zu definieren. Im Allgemeinen<br />
präsentieren die folgenden Kapitel alle Konzepte, Ergebnisse <strong>und</strong> Werkzeuge, die<br />
im Rahmen dieser Arbeit entstanden sind.<br />
14
3. Ableitung einer <strong>Teststrategie</strong> für<br />
serviceorientierte <strong>Architekturen</strong><br />
Bevor man eine <strong>Teststrategie</strong> für eine SOA formulieren kann, sind alle Einflüsse gezielt<br />
zu identifizieren. Besonders die möglichen Variationen zur Realisierung einer SOA<br />
erfordern zunächst ein allgemeines Vorgehen zur Findung der <strong>Teststrategie</strong>. Abschnitt<br />
3.1 beschreibt das genaue Umfeld, das durch eine gef<strong>und</strong>ene <strong>Teststrategie</strong> abgedeckt<br />
wird <strong>und</strong> welche Besonderheiten zu ignorieren sind.<br />
Services bilden als aktive Einheiten den Kern einer SOA, indem sie Funktionalitäten<br />
zur Verfügung stellen. Die Betrachtung <strong>von</strong> Teststufen in einer <strong>Teststrategie</strong> erfordert<br />
neue Sichtweisen aufgr<strong>und</strong> der in Kapitel 2 vorgestellten Natur <strong>von</strong> Services.<br />
Alle Überlegungen berücksichtigen die folgenden vier Anforderungen an eine <strong>Teststrategie</strong><br />
[KBP02]:<br />
• Produktspezifisch: Eine produkt- <strong>und</strong> technologiespezifische <strong>Teststrategie</strong> ist<br />
besser als eine allgemeine <strong>Teststrategie</strong>.<br />
• Risikospezifisch: Die <strong>Teststrategie</strong> adressiert die wichtigsten Probleme.<br />
• Vielfältig: Eine vielfältige <strong>Teststrategie</strong> setzt auf mehrere Testmethoden, um<br />
Fehler zu finden, die eine andere Testmethode übersehen hat.<br />
• Praktikabel: Die <strong>Teststrategie</strong> ist einsetzbar <strong>und</strong> schlägt nichts vor, dass jenseits<br />
der Ressourcen eines Projekts liegt oder technisch nicht umsetzbar ist.<br />
3.1. Einordnung der <strong>Teststrategie</strong><br />
Kapitel 2 hat das Testumfeld einer SOA aufgezeigt. Durch die vielfältigen Einheiten<br />
in einer SOA entstehen Fehlerquellen, die es gezielt zu identifizieren gilt. Die beiden<br />
Hauptmerkmale einer SOA sind das SOA-Dreieck <strong>und</strong> als Konsequenz der Verb<strong>und</strong><br />
<strong>von</strong> Services zu Kompositionen.<br />
Das erweiterte SOA-Dreieck aus Abbildung 2.1 hat vier Rollen aufgezeigt, <strong>von</strong> denen<br />
jede Einfluss auf die <strong>Teststrategie</strong> nehmen kann. Die einzelnen Aktivitäten <strong>und</strong> Interessen<br />
beim <strong>Testen</strong> stellen sich für jede Rolle wie folgt dar:<br />
• Servicekonsument: Ein Servicekonsument prüft, ob das Finden eines Services<br />
<strong>und</strong> die Interaktion mit ihm korrekt arbeiten.<br />
• Serviceanbieter: Ein Serviceanbieter testet, ob die angebotene Infrastruktur den<br />
Anforderungen zur Bereitstellung des Services genügt.<br />
15
3. Ableitung einer <strong>Teststrategie</strong> für serviceorientierte <strong>Architekturen</strong><br />
• Serviceentwickler: Ein Serviceentwickler testet, ob der Service den funktionalen<br />
Anforderungen genügt, qualitativ hochwertig ist <strong>und</strong> Fehler durch eingesetzte<br />
Technologien vermieden werden.<br />
Das Serviceregister wird in dieser Arbeit nicht betrachtet, weil<br />
• es oftmals <strong>von</strong> Drittanbietern verwaltet wird. Ein Unternehmen, das Funktionalitäten<br />
über einen Service anbietet, wird diesen Service solch einem Register<br />
hinzufügen.<br />
• Unternehmen setzen nach Konsequenz 2.7 oftmals kein Serviceregister ein <strong>und</strong><br />
stellen ihren K<strong>und</strong>en direkt den Endpunkt eines Services zur Verfügung.<br />
In dieser Arbeit betrachtete <strong>Teststrategie</strong>n beschränken sich auf die Sicht des Serviceentwicklers<br />
<strong>und</strong> Serviceanbieters, so dass als Testobjekte ein Service selbst <strong>und</strong> die<br />
Serviceimplementierung betrachtet werden. Letztendlich wird ein Unternehmen, das<br />
seine Leistungen über Services anbietet, genau diese zwei Sichten einnehmen.<br />
Die <strong>Teststrategie</strong> verfolgt die folgenden Ziele:<br />
• Eine qualitativ hochwertige Implementierung des Services sicherstellen. Es ist<br />
nicht bekannt in welchem Umfeld <strong>und</strong> <strong>von</strong> wem eine Serviceimplementierung<br />
genutzt wird. Insbesondere zielen Services auf Wiederverwendbarkeit <strong>und</strong> sollten<br />
daher möglichst wartungsarm sein.<br />
• Finden <strong>von</strong> Fehlern, die sich speziell durch SOA <strong>und</strong> Webservices ergeben.<br />
Das <strong>Testen</strong> <strong>von</strong> Kompositionen hat in der Forschung <strong>und</strong> Entwicklung viel Aufmerksamkeit<br />
erhalten. Hauptaugenmerk dieser Arbeit liegt nicht auf dem <strong>Testen</strong> <strong>von</strong> Kompositionen.<br />
In Kapitel 8 werden Arbeiten <strong>und</strong> Werkzeuge angeführt, die sich ausschließlich<br />
mit dieser Thematik befassen. Zusätzlich wird der Einfluss auf die <strong>Teststrategie</strong><br />
aufgezeigt <strong>und</strong> kurz angedeutet, wie diese entsprechend zu erweitern ist.<br />
3.2. Einflüsse auf die <strong>Teststrategie</strong><br />
3.2.1. Idee, Plattform <strong>und</strong> Technologie<br />
Diese Arbeit schlägt drei Ebenen vor, die in einer SOA eigene Testaspekte beitragen:<br />
1. Idee: Als festlegender Stil beginnen Auswirkungen auf die <strong>Teststrategie</strong> direkt<br />
bei der Idee <strong>von</strong> SOA. Neben den verschiedenen Rollen, prägen auch die Konsequenzen<br />
einer SOA die Idee.<br />
2. Technologie: Webservices sind die bekannteste Technologie, um eine SOA zu<br />
realisieren. Im Allgemeinen führen die technischen Besonderheiten <strong>und</strong> Konsequenzen<br />
einer Technologie zu unterschiedlichen Problemen.<br />
3. Plattform: Die Realisierung eines Effekts setzt eine Serviceimplementierung<br />
voraus. In Abschnitt 2.3 wurden bekannte Plattformen eingeführt, mit denen eine<br />
Serviceimplementierung realisiert werden kann. Jede Plattform hat seine eige-<br />
16
3. Ableitung einer <strong>Teststrategie</strong> für serviceorientierte <strong>Architekturen</strong><br />
nen Besonderheiten, die zu neuen Problemen führen.<br />
Abbildung 3.1 illustriert die drei Ebenen als ein Baukasten. Die konkrete Festlegung einer<br />
einzelnen Ebene durch ein Produkt, das diese Ebene umsetzt, heißt Ausprägung<br />
einer Ebene. Werden für eine SOA alle drei Ebenen durch eine Ausprägung festgelegt,<br />
so heißt dieser Baukasten Ausprägung einer SOA. Auch wenn für die Technologie<br />
mehrere Möglichkeiten denkbar sind, dominieren Webservices diese Ebene. Die<br />
Idee einer SOA kann durch verschiedene Definitionen variieren, im weiteren Verlauf<br />
dieser Arbeit sei jedoch die in Definition 2.7 definierte Idee angenommen <strong>und</strong> diese<br />
Idee als SOA bezeichnet. Die Abgrenzung zwischen den Ebenen ist bewusst verzahnt<br />
dargestellt, weil eine klare Abgrenzung oftmals nicht möglich ist.<br />
Plattform<br />
BPEL<br />
Technologie<br />
.NET<br />
Webservice<br />
Idee<br />
Java EE<br />
Serviceorientierte<br />
Architektur<br />
Abbildung 3.1.: Drei Ebenen <strong>von</strong> SOA<br />
Die drei Ebenen nehmen auf die Anforderungen an eine <strong>Teststrategie</strong> Einfluss <strong>und</strong><br />
bilden Gr<strong>und</strong>voraussetzungen:<br />
• Produktspezifisch: Eine in der Praxis umgesetzte SOA wird in allen drei Ebenen<br />
Ausprägungen vorweisen. Umso mehr Ebenen berücksichtigt werden, um<br />
so produktspezifischer ist eine <strong>Teststrategie</strong>.<br />
• Risikospezifisch: Jede Ebene hat eigene Testaspekte, also eigene potentielle<br />
Probleme, die auftreten können. Die <strong>Teststrategie</strong> muss eine Auswahl berücksichtigen,<br />
um wichtige Probleme schnell zu identifizieren.<br />
• Vielfältig: In jeder Ebene sind mehrere Testmethoden einzusetzen, um Fehler zu<br />
finden.<br />
• Praktikabel: Eine <strong>Teststrategie</strong> wird erst anwendbar, wenn sie eine Idee, Technologie<br />
<strong>und</strong> Plattform aufweist. Kapitel 8 wird Ansätze aufzeigen, die eine eigene<br />
Plattform schaffen <strong>und</strong> daher nur <strong>von</strong> der Technologie abhängig sind.<br />
17
3. Ableitung einer <strong>Teststrategie</strong> für serviceorientierte <strong>Architekturen</strong><br />
3.2.2. Projektumfeld<br />
Das Projektumfeld in dem ein Service entwickelt wird, beeinflusst die <strong>Teststrategie</strong><br />
maßgeblich. Im Speziellen handelt es sich um die folgenden Faktoren:<br />
• Personal: Wer steht für Tests zur Verfügung? Setzen sich Teams nur aus Entwicklern<br />
zusammen oder gibt es eine Testabteilung, deren Aufgabe nur im Finden <strong>von</strong><br />
Fehlern liegt? Auch Experten in bestimmten Fachbereichen, z.B. Performance<br />
oder Sicherheit, sind bei einer <strong>Teststrategie</strong> schon zu berücksichtigen.<br />
• Werkzeuge: Welche Werkzeuge stehen zur Testdurchführung, -auswertung <strong>und</strong><br />
-verwaltung zur Verfügung. Sind neue Werkzeuge notwendig?<br />
• Kapazitäten: Wie sieht die zeitliche Verteilung <strong>und</strong> Belastung des Teams aus?<br />
Kapazitäten schränken den Umfang des <strong>Testen</strong>s ein.<br />
• Vorgehensweise: Entstehen während der Entwicklung Dokumente, die bei der<br />
Ableitung <strong>von</strong> Testfällen <strong>von</strong> Interesse sind? Welchem Prozess folgt die Software<br />
in ihrem Lebenszyklus. Viele Vorgehensweisen sehen Tests vor, aber mit<br />
unterschiedlichen Ausprägungen <strong>und</strong> Motivationen.<br />
Wird das Projektumfeld bei der Formulierung einer <strong>Teststrategie</strong> vernachlässigt, läuft<br />
man Gefahr, dass die <strong>Teststrategie</strong> nicht praktikabel ist.<br />
3.3. <strong>Teststrategie</strong><br />
3.3.1. Serviceumgebung<br />
Zur Reduktion <strong>von</strong> Kopplungen stützt sich SOA auf verteilte Systeme [Sta06a], wobei<br />
der Ort eines Services durch den Serviceanbieter festgelegt wird. Jeder Test muss<br />
diesen Ort kennen, um praktisch umsetzbar zu sein. Denn ein Test übernimmt die<br />
Sicht eines Servicekonsumenten <strong>und</strong> interagiert nach Konsequenz 2.3 immer mit einer<br />
bereits existierenden Instanz eines Services.<br />
Beispiel 3.1<br />
Sei als Technologie Webservices angenommen <strong>und</strong> als Plattform Java EE, so wird ein<br />
Webservice als Klasse implementiert <strong>und</strong> mit Metadaten annotiert. Ein Web Container,<br />
z.B. der Apache Tomcat mit der Apache AXIS Erweiterung, erstellt für diese Klasse<br />
eine Serviceschnittstelle <strong>und</strong> ermöglicht die Interaktion mit dem Webservice.<br />
Ein Service existiert immer in einer Serviceumgebung. In dieser Arbeit werden insgesamt<br />
vier Serviceumgebungen definiert. Dazu sei zunächst eine Umgebung betrachtet,<br />
die unabhängig <strong>von</strong> SOA ist <strong>und</strong> durch die Plattform festgelegt wird:<br />
• lokal: Ein Service liegt nur in seiner Serviceimplementierung vor <strong>und</strong> kann nach<br />
Konsequenz 2.4 noch nicht als Service genutzt werden. Ist der Service mit einer<br />
Enterprise Plattform implementiert, so liegt er in der Regel als Klasse vor.<br />
18
3. Ableitung einer <strong>Teststrategie</strong> für serviceorientierte <strong>Architekturen</strong><br />
Die Bereitstellung in einer Umgebung erzeugt einen Service. Es existieren drei verschiedene<br />
Varianten:<br />
• lokal/entfernt: Ein Container wird lokal auf der Entwicklermaschine gestartet<br />
<strong>und</strong> der Service wird für einen Test in dieser bereitgestellt. Ziel dieser Umgebung<br />
ist entwicklungsnah einen Service zu testen.<br />
• entfernt/test: Ein Container liegt auf einem Server entfernt in einem Netzwerk<br />
<strong>und</strong> wird dort für einen Test bereitgestellt. Diese Serviceumgebung sollte der<br />
späteren Produktivumgebung schon nahezu vollständig entsprechen. Es wird<br />
versucht die Infrastruktur des Serviceanbieters zu Testzwecken nachzubilden<br />
oder falls möglich direkt zu nutzen.<br />
• entfernt/live: Ein Service wird über die letztendliche Produktivumgebung bereitgestellt.<br />
Diese Serviceumgebung eignet sich im Allgemeinen nur bedingt zum<br />
<strong>Testen</strong>.<br />
Auch wenn die Serviceumgebung eine Voraussetzung zum <strong>Testen</strong> eines Services ist,<br />
so nimmt sie auch direkten Bezug zur Teststufe:<br />
• Komponententests: Komponententests sind Tests, die sehr nahe am Code agieren<br />
<strong>und</strong> während oder kurz nach der Entwicklung durchgeführt werden. Sie sind<br />
daher vorrangig in einer lokalen oder lokal/entfernen Serviceumgebung durchzuführen,<br />
weil sie immer Änderungen an Komponenten erfordern. In einer entfernten<br />
Serviceumgebung fehlt die notwendige Kontrolle über einen Service, um den<br />
Austausch mit einer Komponente zu realisieren. Komponententests für Services<br />
werden im Abschnitt 3.4 detailliert betrachtet.<br />
• Integrationstests: Ähnlich wie Komponententests erfordern auch Integrationstests<br />
Kontrolle über einen Service, so dass sie ebenfalls vorrangig in einer lokalen<br />
oder lokal/entfernten Serviceumgebung durchzuführen sind.<br />
• Systemtests: Die Betrachtung eines Services mit Systemsicht erfordert keine<br />
Kontrolle über den Service. Die entfernt/test Serviceumgebung ist daher für diese<br />
Art des <strong>Testen</strong>s vorgesehen. Insbesondere erlaubt sie auf Seite des Serviceanbieters<br />
zu testen.<br />
3.3.2. Vorgehensweise<br />
Eine <strong>Teststrategie</strong> kann in mehreren Projekten angewandt werden. Allerdings ist für<br />
jedes Projekt zu prüfen, ob sich die Einflüsse auf die <strong>Teststrategie</strong> verändert haben.<br />
Diese Arbeit schlägt zur Findung einer <strong>Teststrategie</strong> die folgenden Schritte vor:<br />
1. Bestimmung der Ausprägung einer SOA: Die Umsetzung einer SOA wird individuelle<br />
Ausprägungen in allen Ebenen aufweisen. Die Durchführung <strong>von</strong> Tests<br />
verlangt dieses Umfeld genau zu kennen.<br />
2. Identifikation <strong>von</strong> Testaspekten für jede Ausprägung einer Ebene: Die Kenntnis<br />
<strong>von</strong> Testaspekten erlaubt in der <strong>Teststrategie</strong> schon den Testraum einzuschränken<br />
<strong>und</strong> liefert Anhaltspunkte über die Fehler, die es zu finden gilt. Somit<br />
19
3. Ableitung einer <strong>Teststrategie</strong> für serviceorientierte <strong>Architekturen</strong><br />
sind für jede Ausprägung einer Ebene Testaspekte zu ermitteln <strong>und</strong> zunächst<br />
formlos niederzuschreiben.<br />
3. Analyse des Projektumfelds: Jeder Testaspekt lässt sich erst adressieren, wenn<br />
die Rahmenbedingungen eines Projekts bekannt sind.<br />
4. Zuordnung aller Testaspekte zur Serviceumgebung: Wie in Abschnitt 3.3.1<br />
beschrieben, legt die Testumgebung indirekt die Teststufe <strong>und</strong> das Testobjekt<br />
fest. D.h. die Zuordnung eines Testaspekts zur Testumgebung definiert automatisch<br />
in welchen Teststufen zu testen ist. Insbesondere gibt die Beziehung zwischen<br />
einem Testaspekt <strong>und</strong> der Testumgebung schon Hinweise auf die Realisierung<br />
des Tests.<br />
5. Formulierung <strong>von</strong> Testszenarien: Abschnitt 3.3.3 wird Testszenarien vorstellen,<br />
die es für eine <strong>Teststrategie</strong> zu formulieren gilt.<br />
Der Nutzen der beschriebenen Vorgehensweise liegt im Erkennen <strong>von</strong> potentiellen<br />
Problemen <strong>und</strong> der Zuordnung zu einem Testobjekt. Speziell fließt durch die konkrete<br />
Zuordnung das Projektumfeld mit ein. Als Notation für die Zuordnung <strong>von</strong> Testaspekten<br />
zu Serviceumgebungen wird in dieser Arbeit eine Tabelle eingesetzt. Dazu zeigt Tabelle<br />
3.1 ein einfaches Beispiel. Die Serviceumgebungen entfernt/test <strong>und</strong> entfernt/live<br />
sind durch eine doppelte Linie abgetrennt, weil sie nur Systemtests erlauben.<br />
Nr. lokal lokal/entfernt entfernt/test entfernt/live<br />
1 Testaspekt 1 X X<br />
2 Testaspekt 2 X<br />
Tabelle 3.1.: Beispiel für eine Testmatrix<br />
Die tabellarische Darstellung erlaubt die Testaspekte in einer Reihenfolge anzuordnen,<br />
die bekannten <strong>und</strong> etablierten Praktiken entspricht. Sind die Tests während der<br />
Entwicklung durchzuführen, so sollte die vorgeschlagene Reihenfolge die Reife des<br />
Produkts berücksichtigen [KBP02]: mitfühlend, aggressiv, abwechslungsreich <strong>und</strong> zuletzt<br />
sorgfältig. Speziell lässt sich durch die Reihenfolge z.B. die Aggressivität steuern,<br />
indem man mit Buildverifikationstests [GP06] beginnt <strong>und</strong> zunehmend Negativtests<br />
einbaut. Der Übergang zwischen den einzelnen Testaspekten lässt sich bei Bedarf um<br />
Bedingungen oder Eingangs- <strong>und</strong> Ausgangskriterien erweitern.<br />
Im Allgemeinen ist eine Tabelle, mit dem in Tabelle 3.1 dargestellten Aufbau, ein wichtiges<br />
Produkt der ermittelten <strong>Teststrategie</strong>. Sie heißt Testmatrix <strong>und</strong> gibt einen Überblick<br />
über das Vorgehen beim <strong>Testen</strong>. Die Nummer in der ersten Spalte dient zur Identifizierung<br />
eines Testaspekts.<br />
Die beschriebene Vorgehensweise führt zu einer <strong>Teststrategie</strong>, die aus drei Artefakten<br />
besteht - in ihrer Entstehungsreihenfolge:<br />
1. Eine Sammlung <strong>von</strong> Testaspekten<br />
2. Eine Testmatrix<br />
20
3. Ableitung einer <strong>Teststrategie</strong> für serviceorientierte <strong>Architekturen</strong><br />
3. Eine Sammlung <strong>von</strong> Testszenarien<br />
Alle drei Artefakte erlauben gezielt <strong>und</strong> systematisch einen Service zu testen.<br />
3.3.3. Testszenario<br />
Zur Konkretisierung der <strong>Teststrategie</strong> ist im Rahmen dieser Arbeit die in Tabelle 3.2<br />
illustrierte Vorlage entstanden. Sie beschreibt das Vorgehen zur Prüfung eines Testaspekts<br />
<strong>und</strong> sei als Testszenario bezeichnet.<br />
Nr. / Testaspekt<br />
Tester<br />
Serviceumgebung<br />
Abdeckung<br />
Risiken<br />
Vorbedingungen<br />
Durchführung<br />
Mocks<br />
Aktivitäten<br />
Erfolgsbedingungen<br />
Fehlschlagbedingungen<br />
Die Nummer dieses Testszenarios <strong>und</strong> der Name des Testaspekts.<br />
Die Nummer ist so zu wählen, dass sie mit der Nummer<br />
des zugehörigen Testaspekts in der Testmatrix übereinstimmt.<br />
Existieren mehrere Testszenarien für einen Testaspekt,<br />
so ist die Nummer um Buchstaben zu erweitern, z.B.<br />
1a, 1b, usw.<br />
Die aktiven Tester, die den beschriebenen Testaspekt testen.<br />
Die Umgebung, in der ein zu testender Service bereitgestellt<br />
wird.<br />
Die potentiellen Probleme, die dieses Testszenario findet.<br />
Gegeben durch eine Beschreibung des Testaspekts.<br />
Wird ein Testaspekt nicht getestet, können bestimmte Fehler<br />
zu Konsequenzen führen, die ein Risiko darstellen.<br />
Bedingungen, die vor der Durchführung dieses Testszenarios<br />
gegeben sein müssen.<br />
Wie ist dieser Test durchzuführen? Manuell oder automatisiert?<br />
Gibt die in einem Service durch Mocks zu ersetzenden Teile<br />
an, falls es sich um einen Komponententest handelt.<br />
Eine Liste <strong>von</strong> durchzuführenden Aktivitäten.<br />
Eine Liste <strong>von</strong> Bedingungen, <strong>von</strong> denen mindestens eine erfüllt<br />
sein muss, damit dieses Testszenario als bestanden gilt.<br />
Eine Liste <strong>von</strong> Bedingungen, <strong>von</strong> denen mindestens eine erfüllt<br />
sein muss, damit dieses Testszenario fehlgeschlagen ist.<br />
Jeder Fehlschlag deckt einen Fehler auf.<br />
Tabelle 3.2.: Testszenario Vorlage<br />
Der Aufbau eines Testszenarios bezieht die fünf Dimensionen eines Tests nach Abschnitt<br />
2.1.1 ein. Zur Definition des Testobjekts werden die Serviceumgebung <strong>und</strong> evtl.<br />
21
3. Ableitung einer <strong>Teststrategie</strong> für serviceorientierte <strong>Architekturen</strong><br />
einzusetzende Mocks angeführt. Vorbedingungen stellen notwendige Voraussetzungen<br />
an die Durchführung eines Testszenarios.<br />
Die Automatisierung <strong>von</strong> Tests ist sinnvoll, doch nicht Grenzenlos [Bac99]. Es lohnt<br />
sich nicht jeden Testaspekt automatisiert abzudecken. Ein Testszenario definiert daher,<br />
ob ein Test manuell oder automatisiert durchzuführen ist.<br />
Ein Testszenario stellt die handliche Beschreibung eines Testaspekts dar. Sie sollte<br />
die Länge <strong>von</strong> einer DIN A4 Seite nicht überschreiten. So erhält der aktive Tester<br />
die Möglichkeit ein Szenario z.B. neben seinen Monitor zu heften <strong>und</strong> seine aktuellen<br />
Aktivitäten <strong>und</strong> Ziele immer im Blick zu haben.<br />
Testszenarien sind noch keine Testfälle, sondern beschreiben nur wie diese abzuleiten<br />
sind. Im Bezug auf die Testmatrix ist für jede Zeile <strong>und</strong> damit für jeden Testaspekt mindestens<br />
ein Testszenario anzugeben. Insgesamt bilden Testszenarien einen wichtigen<br />
Bestandteil der <strong>Teststrategie</strong>.<br />
3.4. Komponententests für eine SOA<br />
3.4.1. Vorgehen<br />
Eine SOA erzwingt neue Sichtweisen beim Einsatz <strong>von</strong> Komponententests. Gr<strong>und</strong>sätzlich<br />
ist jeder Komponententest an mehrere Schritte geb<strong>und</strong>en, die systematisch<br />
durchzuführen sind. Ist es nicht möglich einen dieser Schritte abzuarbeiten, so lässt<br />
sich oftmals kein Komponententest erstellen.<br />
1. Identifikation der eigentlichen Komponente. Dabei wird eine externe Sichtweise<br />
auf ein System eingenommen <strong>und</strong> aktive Einheiten identifiziert, d.h. Komponenten<br />
sind immer Teile eines Systems.<br />
2. Identifikation aller Komponenten mit denen die Komponente in Beziehung steht.<br />
Notwendig ist die Verfügbarkeit der Implementierung in Form des Quellcodes<br />
oder andere Informationsquellen, die es erlauben teilnehmende Komponenten<br />
abzuleiten.<br />
3. Erstellen <strong>von</strong> Mocks für alle teilnehmenden Komponenten. Dieser Schritt erfordert<br />
einen Entwurf, der die Erstellung <strong>von</strong> Mocks ermöglicht.<br />
4. Austauschen aller teilnehmenden Komponenten durch die erstellten Mocks. In<br />
diesem Vorgang wird eine Komponente manipuliert, so dass zusätzliche Gr<strong>und</strong>voraussetzungen<br />
an die Testbarkeit entstehen. Lässt sich die Beziehung zu einer<br />
Komponente nicht ändern, wird ein Komponententest unmöglich.<br />
Beispiel 3.2<br />
In der objektorientierten Programmierung sind die Klassen die Komponenten. Beziehungen<br />
werden durch den Einsatz <strong>und</strong> die Interaktion mit Instanzenvariablen hergestellt.<br />
Mocks lassen sich durch Vererbung oder Implementierung <strong>von</strong> Schnittstellen<br />
schreiben. Der Austausch erfordert den Zugriff auf die Instanzenvariablen der Klasse.<br />
22
3. Ableitung einer <strong>Teststrategie</strong> für serviceorientierte <strong>Architekturen</strong><br />
3.4.2. Identifikation der Komponente bei Services<br />
Abbildung 3.2 illustriert, dass ein Service zwei unterschiedliche Realisierungen haben<br />
kann:<br />
• Ein Service wurde mit einer Enterprise Plattform <strong>und</strong> damit in einer objektorientierten<br />
Programmiersprachen realisiert.<br />
• Ein Service repräsentiert eine Komposition nach Konsequenz 2.1.<br />
Ein Servicekonsument sieht bei der Interaktion keinen Unterschied in der Realisierung.<br />
«interface»<br />
Interface1<br />
Class1<br />
Class2<br />
Abbildung 3.2.: Realisierungen eines Services<br />
Beispiel 3.2 hat bereits dargelegt, dass in der objektorientierten Programmierung Klassen<br />
die Komponenten sind. Die Identifikation der Komponente in einem Service erfordert<br />
die Realisierung des Service zu kennen, denn die Form der Realisierung <strong>und</strong> die<br />
Betrachtungsweise vererben die Komponente:<br />
• Ist ein Service in einer objektorientierten Programmiersprache implementiert, so<br />
sind die Komponenten Klassen.<br />
• Ist ein Service als Komposition realisiert, so bilden Services die Komponenten.<br />
Zusätzlich sind auch Mischformen denkbar, indem unter Einsatz einer objektorientierten<br />
Programmiersprache Kompositionen erstellt werden.<br />
3.4.3. Austauschen <strong>von</strong> Komponenten in Services<br />
Nach der Identifikation der Komponente, sind für alle teilnehmenden Komponenten in<br />
Abhängigkeit <strong>von</strong> der Realisierung Mocks zu schreiben. Sind Teile einer Komposition<br />
durch Mocks auszutauschen, so müssen die Serviceimplementierungen <strong>von</strong> angesprochenen<br />
Services geändert werden - die Serviceschnittstellen bleiben dabei erhalten.<br />
Kapitel 8 wird Werkzeuge vorstellen, die bei der Erstellung <strong>von</strong> Mocks für Kompositionen<br />
unterstützen. Der Austausch des Mocks erfolgt dabei mittels Änderung des<br />
23
3. Ableitung einer <strong>Teststrategie</strong> für serviceorientierte <strong>Architekturen</strong><br />
zugehörigen Endpunkts im Serviceregister.<br />
Betrachtet man nur einen Service an sich <strong>und</strong> keine Kompositionen, so werden Komponenten<br />
durch die Plattform vererbt. Bei der Implementierung eines Services in Java<br />
EE oder mit dem Microsoft .NET Framework, sind Mocks als Klassen zu implementieren.<br />
Dabei hat die Serviceumgebung, in der ein zu testender Service existiert, Einfluss<br />
auf den Einsatz <strong>von</strong> Mocks:<br />
• lokal: Zur Laufzeit werden teilnehmende Komponenten durch Mocks ersetzt. Die<br />
verwendeten Verfahren sind seit Jahren bekannt <strong>und</strong> werden insbesondere in<br />
der testgetriebenen Entwicklung [Bec03] eingesetzt.<br />
• lokal/entfernt: Sobald ein Service in einer entfernten Serviceumgebung verwaltet<br />
wird, interagiert ein Servicekonsument nach Konsequenz 2.3 mit einer Instanz,<br />
auf die er keinen Einfluss nehmen kann. Es ist daher nicht möglich wie in der<br />
lokalen Serviceumgebung eine Komponente zur Laufzeit auszutauschen.<br />
Diese Arbeit schlägt neue Ansätze zum Einsatz <strong>von</strong> Mocks in einem Service vor. Durch<br />
den Vorgang der Bereitstellung hat ein Tester keinen Zugriff mehr auf die Instanz des<br />
Services, so dass jede Änderung am Service vor der Bereitstellung erfolgen muss.<br />
Insbesondere nach Konsequenz 2.2 wird auch ein Tester evtl. nur über einen Proxy<br />
mit dem Service kommunizieren.<br />
Diese Arbeit verfolgt zwei verschiedene Ansätze zur Realisierung <strong>von</strong> Mocks. Dazu sei<br />
angenommen, dass eine Klasse in einer Datei definiert wird <strong>und</strong> zur Laufzeit als ein<br />
Objekt instanziiert wird.<br />
• Weicher Mock: Bei nach bekannten Methoden umgesetzten Komponententests<br />
wird zur Laufzeit ein Objekt ausgetauscht. Die Realisierung eines Mocks erfolgt<br />
in einer Klasse durch Implementierung einer Schnittstelle oder mittels Vererbung.<br />
Der Austausch einer Komponente geschieht durch das Setzen des Mocks in<br />
einer Instanzenvariable. Abbildung 3.3 zeigt dazu ein Beispiel.<br />
In einer lokal/entfernten Umgebung fehlt der Zugriff auf die Instanz eines Service,<br />
so dass das in Abbildung 3.3 aufgezeigte Vorgehen nicht anwendbar ist.<br />
Als Lösung ist der Service vor seiner Bereitstellung, um entsprechende Logik<br />
zum Austauschen durch Mocks zu erweitern. Hierzu ist auch die Interaktion so<br />
zu ändern, dass vor jedem Benutzen des Services ein Austausch durch Mocks<br />
vorgenommen wird. D.h. die Zeilen 9 <strong>und</strong> 10 aus Abbildung 3.3 sind Teil des<br />
Services.<br />
Im Allgemeinen sei dieser Vorgang als weich bezeichnet, weil keine tatsächliche<br />
Definition einer Klasse geändert wird. Der Austausch durch Mocks erfolgt erst<br />
zur Laufzeit <strong>und</strong> betrifft nur ein Objekt.<br />
24
3. Ableitung einer <strong>Teststrategie</strong> für serviceorientierte <strong>Architekturen</strong><br />
1 public class ServiceTest {<br />
2 private class SubSystemMock {<br />
3 public void Invoke ( ) {<br />
4 . . .<br />
5 }<br />
6 }<br />
7<br />
8 public void Test ( ) {<br />
9 Service <strong>und</strong>erTest = new Service ( ) ;<br />
10 <strong>und</strong>erTest . SubSystem = new SubSystemMock ( ) ;<br />
11<br />
12 . . .<br />
13 }<br />
14 }<br />
Abbildung 3.3.: Umsetzung eines weichen Mocks<br />
• Harter Mock: Immer wenn ein Programmierer kurzzeitig einen Teil im Quellcode<br />
auskommentiert, um einen bestimmten Aspekt der Software zu prüfen, fügt der<br />
Programmierer im weitesten Sinne einen Mock ein. Ändert man die Definition<br />
einer teilnehmenden Komponente direkt in der zugehörigen Datei, so sind zur<br />
Laufzeit keine weiteren Maßnahmen mehr durchzuführen. Man arbeitet so lange<br />
mit einem Mock bis alle Änderungen wieder rückgängig gemacht wurden. Dieser<br />
Vorgang einen Mock einzuführen sei als hart bezeichnet, weil eine tatsächliche<br />
Änderung vorgenommen wird.<br />
Durch den Vorgang der Bereitstellung ist es möglich während eines Testlaufs<br />
einen harten Mock in einem Service einzusetzen. In der objektorientierten Programmierung<br />
<strong>und</strong> bekannten Komponententests ist dies nicht während des Testlaufs<br />
möglich, weil alle Informationen zur Kompilierzeit bekannt sein müssen.<br />
Abbildung 3.4 zeigt ein Beispiel, das die Logik einer teilnehmenden Komponente<br />
direkt ändert.<br />
1 public class Component {<br />
2 public s t r i n g Do ( ) {<br />
3 s t r i n g r e s u l t = " " ;<br />
4<br />
5 . . .<br />
6<br />
7 return r e s u l t ;<br />
8 }<br />
9 }<br />
1 public class Component {<br />
2 public s t r i n g Do ( ) {<br />
3<br />
4<br />
5<br />
6<br />
7 return "mock" ;<br />
8 }<br />
9 }<br />
Abbildung 3.4.: Einsatz eines harten Mocks<br />
Auf die Realisierung <strong>von</strong> harten <strong>und</strong> weichen Mocks wird erst in den Abschnitten 5.5<br />
<strong>und</strong> 5.6 eingegangen.<br />
25
3. Ableitung einer <strong>Teststrategie</strong> für serviceorientierte <strong>Architekturen</strong><br />
3.5. Zusammenfassung<br />
Eine anfängliche Einordnung der <strong>Teststrategie</strong> hat ihren Fokus gezielt eingeschränkt:<br />
• Die <strong>Teststrategie</strong> betrachtet nur Services aus der Sicht des Serviceanbieters <strong>und</strong><br />
Serviceentwicklers, d.h. das Serviceregister sei vernachlässigt.<br />
• Kompositionen sind kein primärer Bestandteil der <strong>Teststrategie</strong> <strong>und</strong> werden erst<br />
in Kapitel 8 behandelt.<br />
Auf die <strong>Teststrategie</strong> einer SOA nehmen drei Ebenen <strong>und</strong> das Projektumfeld Einfluss.<br />
Abschnitt 3.3.2 präsentiert ein Vorgehen zur Findung einer konkreten <strong>Teststrategie</strong>, die<br />
aus einer Beschreibung <strong>von</strong> Testaspekten, einer Testmatrix, sowie Testszenarien<br />
besteht.<br />
Zuletzt sind die Probleme <strong>und</strong> Lösungsansätze beim Einsatz <strong>von</strong> Komponententests<br />
in Abschnitt 3.4 vorgestellt. Weiche oder harte Mocks ermöglichen die Komponenten<br />
in einem Service gezielt auszutauschen.<br />
Zur Findung einer konkreten <strong>Teststrategie</strong> für SOA werden im folgenden Kapitel die<br />
ersten zwei Schritte der Vorgehensweise aus Abschnitt 3.3.2 durchlaufen.<br />
26
4. Testaspekte für SOA, Webservices <strong>und</strong><br />
.NET<br />
Services werden mit einer ganz bestimmten Ausprägung einer SOA realisiert. Webservices<br />
bilden dabei die am weitesten verbreitete Technologie <strong>und</strong> als Plattform findet<br />
man häufig Enterprise Plattformen vor. Bevor die Formulierung einer <strong>Teststrategie</strong><br />
möglich ist, sind für jede Ebene nach Kapitel 3 Testaspekte abzuleiten. Daher wird<br />
in diesem Kapitel die in Abbildung 4.1 dargestellte Ausprägung betrachtet.<br />
Abbildung 4.1.: Betrachtete Ausprägung einer SOA<br />
Jede Ebene wird eigene Testaspekte zur <strong>Teststrategie</strong> beitragen. Webservices als dominierende<br />
Technologie einer SOA erlauben die Wiederverwendung der Testaspekte<br />
in vielen anderen Projekten. .NET ist sehr verwandt mit Java EE, so dass abgeleitete<br />
Testaspekte beide Plattformen betreffen.<br />
Durch die gewählte Ausprägung entsteht das in Abbildung 4.2 dargestellte Umfeld, in<br />
dem es zu <strong>Testen</strong> gilt. Speziell auf Seiten des Servicekonsumenten wird ein Proxy<br />
nach Konsequenz 2.2 eingesetzt. Der Serviceanbieter stellt einen Web Container zur<br />
Verfügung, der die Serviceimplementierung verwaltet.<br />
In einer Microsoft .NET-Umgebung existieren zwei bekannte Web Container:<br />
• ASP.NET Development Server: Wird nur während der Entwicklung eingesetzt<br />
<strong>und</strong> erlaubt Webapplikationen zu testen.<br />
• Internet Information Services (IIS): Ein Applikationsserver, der für Produktivsysteme<br />
genutzt wird.<br />
27
4. Testaspekte für SOA, Webservices <strong>und</strong> .NET<br />
Implementierung<br />
Serviceimplementierung<br />
Serviceproxy<br />
Benutzen<br />
(SOAP)<br />
W<br />
S<br />
D<br />
L<br />
implementiert<br />
(Java, .NET, ...)<br />
Serviceentwickler<br />
Servicekonsument<br />
Web Container<br />
Serviceanbieter<br />
Abbildung 4.2.: Webservice Umfeld<br />
4.1. Identifikation <strong>von</strong> Testaspekten<br />
In den folgenden Abschnitten werden zunächst Testaspekte für die Idee, Technologie<br />
<strong>und</strong> Plattform identifiziert. Dazu wird jeder Testaspekt über seine potentiellen Probleme<br />
definiert. Im Rahmen dieser Arbeit wurde für jeden Testaspekt eine Vorgehensweise<br />
zum Auffinden <strong>von</strong> Fehlern entwickelt. Die Beschreibung der Vorgehensweise stützt<br />
sich falls möglich auf Testmethoden aus Abschnitt 2.1.2. Existieren keine bekannten<br />
Testmethoden wird das allgemeine Vorgehen zum Auffinden <strong>von</strong> Fehlern beschrieben.<br />
Aufgr<strong>und</strong> der Verflechtung der einzelnen Ebenen einer SOA, ist es nicht immer möglich<br />
Testaspekte unabhängig <strong>und</strong> isoliert anzugeben. Allgemein sind die dargelegten Testaspekte<br />
nur als Auswahl anzusehen. Einige potentiellen Probleme, die Testaspekte<br />
repräsentieren, sind bereits durch angeführte Literatur bekannt, andere ergeben sich<br />
aus Konsequenzen oder dem Umfeld einer SOA.<br />
4.1.1. SOA als Idee<br />
Testaspekte für eine serviceorientierte Architektur leiten sich aus dem SOA-Dreieck,<br />
genauer den Beziehungen zwischen den verschiedenen Rollen ab. Insbesondere die<br />
Interaktion mit einem Service, also die Beziehung zwischen Servicekonsument <strong>und</strong><br />
Serviceanbieter, ist dabei <strong>von</strong> Interesse. Es ergeben sich die folgenden Testaspekte:<br />
• Annahmen an Eingabedaten: Nach Konsequenz 2.6 minimiert ein Service die<br />
Annahmen an das Vertrauen, so dass alle Eingabedaten in einem Service zu<br />
prüfen sind. Insbesondere ist nie bekannt in welchem Umfeld oder auf welcher<br />
Tiefe in einer Komposition ein Service eingesetzt wird. Dabei können sowohl<br />
der Servicekonsument, als auch andere Services, im Allgemeinen immer wenn<br />
Nachrichten ausgetauscht werden, ungültige Daten liefern.<br />
Jedes Datenelement hat eine Semantik, die entweder implizit angenommen oder<br />
explizit angegeben wird. In jedem Fall sind alle Daten, die in einen Service fließen,<br />
zu überprüfen. Speziell jede Applikation mit Bedienoberfläche wird auch ei-<br />
28
4. Testaspekte für SOA, Webservices <strong>und</strong> .NET<br />
ne Datenprüfung vornehmen, meistens schon während der Eingabe. Durch z.B.<br />
den Wegfall <strong>von</strong> Benutzeroberflächen bei Webservices muss jeder übergebene<br />
Parameter explizit durch den Service validiert werden. Fehlt eine Prüfung der<br />
Eingabedaten kann nicht vorhersehbares Verhalten auftreten.<br />
Um die potentiellen Probleme dieses Testaspekts zu finden ist zunächst eine<br />
Analyse unter Anwendung der Testmethode Equivalence partitioning durchzuführen:<br />
1. Für alle möglichen Daten, die an einen Service gestellt werden, sind Äquivalenzklassen<br />
bezüglich gültigen <strong>und</strong> ungültigen Werten zu bestimmen. Im<br />
Speziellen sind dies Analysen für alle Eingabedaten eines Servicekonsumenten<br />
<strong>und</strong> alle Ausgabedaten eines genutzten Service. Quellen zur Festlegung<br />
dieser Äquivalenzklassen können Spezifikationen, White-Box Analysen<br />
oder Gespräche mit Entwicklern sein.<br />
2. Aus den ermittelten Äquivalenzklassen lassen sich Repräsentanten auswählen,<br />
so dass gezielt Matrizen für Negativ- <strong>und</strong> Positivtests entstehen.<br />
Tabelle 4.1 zeigt ein einfaches Beispiel für mögliche Äquivalenzklassen <strong>und</strong> ausgewählte<br />
Repräsentanten. Die Überprüfung <strong>von</strong> Grenzen sei dabei an dieser<br />
Stelle nicht betrachtet.<br />
Element Typ Beschreibung Äquivalenzklasse Repräsentanten<br />
ID<br />
Int32<br />
nie ungültig ≤ 0 0, −1, −2147483648<br />
gültig 1 bis 25 1, 25<br />
zu groß ≥ 26 26, 27, 2147483647<br />
Tabelle 4.1.: Äquivalenzklassen für gültige <strong>und</strong> ungültige Werte<br />
Services überprüfen alle erhaltenen Daten in der Regel direkt nach Erhalt, so<br />
dass alle nicht benötigten Teile durch Mocks zu ersetzen sind. Erst wenn Daten<br />
nicht überprüft werden, sind Mocks zu entfernen, um das Verhalten des Systems<br />
zu beobachten. Aus Sicht des Servicekonsumenten kann unter Verwendung<br />
der ausgewählten Repräsentanten entsprechend mit dem Service interagiert<br />
werden. Datenflüsse aus Richtung eines anderen Services erfordern, dass<br />
ein Service zu erstellen ist, der diese Werte zur Verfügung stellt. Dazu stehen<br />
für Webservices Werkzeuge zur Verfügung, die auch bei Kompositionen zum Erstellen<br />
<strong>von</strong> Mocks genutzt werden <strong>und</strong> in Kapitel 8.3 angeführt werden.<br />
Dieser Test ist automatisiert umzusetzen, weil mit mehreren Daten gleichermaßen<br />
mit einem Service interagiert wird. Erkennt der Service ungültige Daten <strong>und</strong><br />
liefert eine Fehlermeldung, so ist ein Test bestanden, ansonsten nicht.<br />
Bei Verletzung <strong>von</strong> Randbedingungen kann es zu Problemen bei der Verarbeitung<br />
<strong>und</strong> Speicherung kommen [KBP02]. Speziell durch die Integration in Geschäftsprozessen<br />
sind ungültige Daten sehr realistisch <strong>und</strong> Fehler durch deren<br />
29
4. Testaspekte für SOA, Webservices <strong>und</strong> .NET<br />
Verarbeitung schwer ausfindig zu machen.<br />
• Interoperabilität [App07]: Wenn die Technologie zur Realisierung einer SOA<br />
bekannt ist, wird noch keine Aussage über die eingesetzte Plattform getroffen.<br />
Dennoch muss ein Service zur Interaktion mit jeder Plattform in der Lage sein<br />
[Sta06a], um Kopplungen zu minimieren. Ansonsten steht ein Service nur einer<br />
eingeschränkten Anzahl <strong>von</strong> Servicekonsumenten zur Verfügung.<br />
WS-I [The06] ist ein Standard, um Interoperabilität für Webservices zu definieren.<br />
Werden Webservices als Technologie eingesetzt, ist eine Überprüfung auf<br />
Interoperabilität durch Werkzeuge möglich [Par] [Theb], die Konformität zum WS-<br />
I Standard prüfen.<br />
Allgemein ist eine Auswahl <strong>von</strong> Plattformen zu treffen <strong>und</strong> mit diesen eine Interaktion<br />
mit dem Service durchzuführen. Voraussetzung ist jedoch immer die<br />
Kenntnis einer Technologie.<br />
• Rückwärtskompatibilität [App07]: Wenn sich die Serviceimplementierung ändert,<br />
muss die Serviceschnittstelle unverändert bleiben. Jede Änderung an der<br />
Serviceschnittstelle zieht Änderungen bei allen Servicekonsumenten nach sich.<br />
Auch wenn die Erstellung eines neuen Proxy heutzutage einfach durchzuführen<br />
ist, resultieren aus einer Änderung an der Serviceschnittstelle evtl. auch Änderungen<br />
im Verhalten.<br />
Gr<strong>und</strong>sätzlich muss nur auf Rückwärtskompatibilität geprüft werden, wenn eine<br />
öffentlich zugängliche Version des Services existiert. Immer, wenn eine neue<br />
Version des Services entsteht, ist ein Proxy für den aktuellen Produktiv-Service<br />
zu erstellen <strong>und</strong> in jedem automatisierten Test einzusetzen. D.h. unter Anwendung<br />
der Testmethode Regression testing sind alle existierenden Tests mit einem<br />
neuen Proxy erneut auszuführen.<br />
• Sicherheit [App07]: Ist das Universum <strong>von</strong> Benutzern, die mit einem Service interagieren<br />
dürfen, begrenzt, müssen Maßnahmen zur Absicherung ergriffen werden.<br />
Allgemein ist sicherzustellen, dass ein Service nur wie vorgesehen genutzt<br />
werden kann <strong>und</strong> ein Ausnutzen jeglicher Art unmöglich ist. Die Auswirkungen<br />
bei Vernachlässigung dieses Testaspekts sind kritisch.<br />
Die Umsetzung dieses Testaspekts ist projektabhängig, weil der aktive Tester,<br />
der nach Sicherheitslücken sucht, variiert:<br />
1. Der Entwickler des Services testet, ob Funktionen zur Erhöhung der Sicherheit<br />
korrekt implementiert sind.<br />
2. Ein Tester prüft, ob festgelegte Sicherheitsanforderungen eingehalten werden.<br />
3. Ein Tiger Team [Bur03] führt Angriffe auf den Service durch, um Sicherheitslücken<br />
aufzudecken.<br />
4. Benutzer nehmen an einem Wettbewerb Teil, um Sicherheitslücken in einem<br />
Service zu finden.<br />
30
4. Testaspekte für SOA, Webservices <strong>und</strong> .NET<br />
Nach Abschnitt 3.3.2 folgt nach der Ermittlung aller Testaspekte die Zuordnung<br />
in einer Testmatrix. Für diesen Testaspekt ist dabei die Zuordnung variabel, weil<br />
sie vom gewählten aktiven Tester abhängt. D.h. die Testmatrix spiegelt die Vorgehensweise<br />
zum Auffinden <strong>von</strong> potentiellen Problemen grob wieder; mindestens<br />
ein Testszenario für jede Zeile wird das genaue Vorgehen festlegen. Tabelle 4.2<br />
illustriert für diesen Testaspekt die Auswirkungen der verschiedenen Rollen auf<br />
die Serviceumgebung.<br />
Tester Testaspekt lokal lokal/entfernt entfernt/test entfernt/live<br />
Entwickler Sicherheit X X<br />
Tester Sicherheit X<br />
Tiger Team Sicherheit X X<br />
Benutzer Sicherheit X<br />
Tabelle 4.2.: Rollen, Testaspekte <strong>und</strong> Serviceumgebungen<br />
Im Allgemein betrifft der Testaspekt Sicherheit alle drei Ebenen einer SOA. In<br />
Abschnitt 8.2 wird auf eine Veröffentlichung verwiesen, die sich speziell mit der<br />
Sicherheit <strong>von</strong> Webservices befasst. Dabei geht es hauptsächlich um die potentiellen<br />
Probleme, die sich hinter diesem Testaspekt verbergen.<br />
• Funktionalität: Jeder Service bietet Dienste an, auf die sich ein Servicekonsument<br />
verlässt. Services können Effekte in der realen Welt bewirken <strong>und</strong> erfordern<br />
eine qualitativ hochwertige Implementierung.<br />
Das Vorhandensein <strong>und</strong> die Korrektheit <strong>von</strong> Funktionalität zu verifizieren, ist<br />
durch das <strong>Testen</strong> der Serviceimplementierung mit einer White-Box Sichtweise<br />
möglich 1 . Einzusetzende Testmethoden sind Statement and branch coverage<br />
<strong>und</strong> Regression testing. D.h. durch die Tests sind Funktionalitäten zu überprüfen,<br />
so dass eine hohe Anweisungs- <strong>und</strong> Zweigabdeckung entsteht. Die Automatisierung<br />
dieser Tests erlaubt alle Tests nach Änderungen erneut auszuführen.<br />
Ein Service ist eine existierende Einheit, mit der ein Servicekonsument interagiert.<br />
Liegt eine Servicedokumentation vor, so ist jede beschriebene Funktionalität<br />
unter Anwendung der Testmethoden Function testing <strong>und</strong> Specificationbased<br />
testing zu testen.<br />
• Last- <strong>und</strong> Performanceverhalten: Auf Seiten des Serviceanbieters müssen die<br />
Kapazitäten ausreichen, um einen Service bereit zu stellen. Unter Anwendung<br />
der Testmethoden Load testing, Performance testing <strong>und</strong> Long sequence testing<br />
ist zu verifizieren, dass Anforderungen an das Lastverhalten durch die Infrastruktur<br />
erfüllt werden [CP06]. Zusätzlich sind nach [Par06] bereits während der<br />
Entwicklung Lasttests durchzuführen, um Fehler in der Serviceimplementierung<br />
früh zu finden.<br />
1 Liegt die Serviceimplementierung in einer objektorientierten Programmiersprache vor, so sind z.B. aus<br />
der testgetriebenen Entwicklung [Bec03] bekannte Komponententests anwendbar.<br />
31
4. Testaspekte für SOA, Webservices <strong>und</strong> .NET<br />
4.1.2. Webservices als Technologie<br />
Webservices sind eine Technologie, die Dienste über Operationen anbietet. Ein Servicekonsument<br />
ruft eine Operation durch Angabe <strong>von</strong> Parametern in einer SOAP-<br />
Nachricht auf. Als Ergebnis entsteht ein implementierter Effekt <strong>und</strong> der Webservice<br />
schickt eine SOAP-Nachricht an den Servicekonsumenten zurück. Abbildung 4.3 illustriert<br />
die Interaktion mit einem Webservice.<br />
Servicekonsument<br />
Webservice<br />
Operation()<br />
Ergebnis<br />
SOAP<br />
Abbildung 4.3.: Interaktion mit einem Webservice<br />
Für Webservices sind die folgenden Testaspekte <strong>von</strong> Interesse:<br />
• Datentransferobjekte: Da zur Kommunikation XML-basierte SOAP-Nachrichten<br />
ausgetauscht werden, ist zu prüfen, ob die Nachrichten wohlgeformt sind. Speziell<br />
arbeiten Plattformen intern nicht direkt mit XML, so dass eine Serialisierung<br />
notwendig wird. Durch diesen Vorgang können neue Fehler entstehen, die es<br />
gezielt zu finden gilt.<br />
Die Verifizierung der Datentransferobjekte erfordert alle Objekte, die in Parametern<br />
oder Rückgaben übermittelt werden, vollständig aufzulösen <strong>und</strong> nach XML<br />
zu übersetzen. Es werden die folgenden Fehler gesucht:<br />
– Datentypen lassen sich nicht nach XML übersetzen <strong>und</strong> sind daher nicht<br />
verwendbar.<br />
– Unmögliche in XML darstellbare Eigenschaften verhindern eine Übersetzung,<br />
z.B. bidirektionale Abhängigkeiten oder allgemein zirkuläre Abhängigkeiten.<br />
– Notwendige Informationen zur Übersetzung wurden nicht zur Verfügung gestellt.<br />
Zur Durchführung des Tests werden nur die Datentransferobjekte benötigt. Hat<br />
man Zugriff auf den XML-Serialisierer, so sind alle Datentransferobjekte zu bauen<br />
<strong>und</strong> serialisieren. Treten keine Fehler auf <strong>und</strong> das ursprüngliche Objekt stimmt<br />
mit seiner deserialisierten Version überein, so ist dieser Test bestanden. Zusätz-<br />
32
4. Testaspekte für SOA, Webservices <strong>und</strong> .NET<br />
lich existieren Werkzeuge, die eine automatische Überprüfung einer WSDL erlauben<br />
[Par06].<br />
• Webservice Standards: In Abschnitt 2.4.2 wurden Webservice Standards erwähnt,<br />
die erweiterte Funktionalitäten zur Verfügung stellen. Die korrekte Installation<br />
<strong>und</strong> Benutzung dieser Standards ist zu testen, weil Fehler einen Service<br />
unbrauchbar machen können. Dieser Testaspekt ist sehr verwandt mit dem Testaspekt<br />
Funktionalität aus Abschnitt 4.1.1.<br />
4.1.3. .NET als Plattform<br />
In .NET entwickelte Webservices können über einen Web Container oder als Prozess<br />
in Windows bereitgestellt werden. Die Bereitstellung benötigt ein zunächst hergestelltes<br />
Deployment, das sich aus einem Build <strong>und</strong> einer Konfiguration zusammensetzt.<br />
Für .NET ergeben sich die folgenden Testaspekte:<br />
• Verifizierung des Deployment: Bevor ein Service würdig ist komplexen Tests<br />
unterzogen zu werden, sind leichtgewichtige Überprüfungstests durchzuführen.<br />
Unter Einsatz der Testmethode Smoke testing ist zu prüfen, ob ein implementierter<br />
Service überhaupt gr<strong>und</strong>legend funktioniert.<br />
Durch den Einsatz eines Containers, einer Plattform <strong>und</strong> Konfigurationen können<br />
eine Vielzahl <strong>von</strong> möglichen Fehlern auftreten. Ziel der Überprüfung ist festzustellen,<br />
ob die Bereitstellung erfolgreich war <strong>und</strong> der Service seine Dienste<br />
anbietet.<br />
Subsysteme sind durch Mocks auszutauschen. Andernfalls ist sicherzustellen,<br />
dass alle Subsysteme verfügbar sind. Gr<strong>und</strong>sätzlich erfolgt dieser Test durch<br />
gezielte Interaktion mit einem Service, so dass möglichst viele einfache Pfade<br />
im Service durchlaufen <strong>und</strong> Subsysteme angesprochen werden. Pfade können<br />
unter Einsatz der Testmethode Path testing gef<strong>und</strong>en werden.<br />
Die Korrektheit des Effekts ist bei diesem Test nicht relevant <strong>und</strong> ist durch andere<br />
Testaspekte abzudecken. Verifikationstests sind zu automatisieren, um nach der<br />
Testmethode Regression testing immer wieder einsetzbar zu sein.<br />
• Konfigurationen: Bei der Realisierung <strong>von</strong> Enterprise Komponenten werden<br />
Konfigurationen eingesetzt, um Teile des Services gezielt maßzuschneidern. Ein<br />
Deployment kann dabei unterschiedliche Konfigurationen enthalten. Besonders<br />
häufig werden verschiedene Konfigurationen eingesetzt, um einen Build in einer<br />
anderen Umgebung einzusetzen.<br />
Konkret sind die folgenden Teile eines Services <strong>von</strong> einer Konfiguration betroffen:<br />
– Ermöglichen des Zugriffs auf Subsysteme, z.B. Datenbanken.<br />
– Bibliotheken, die in der Implementierung eingesetzt werden, um bestimmte<br />
Funktionalitäten zu realisieren.<br />
– Anpassen des Verhaltens des eingesetzten Containers.<br />
33
4. Testaspekte für SOA, Webservices <strong>und</strong> .NET<br />
Jede Konfiguration trägt einen Effekt bei, dessen Eintritt zu prüfen ist. Einzusetzen<br />
ist dabei die Testmethode Path testing, um möglichst viele Pfade zu identifizieren,<br />
die <strong>von</strong> der Konfiguration betroffen sind.<br />
Neben dem Auffinden <strong>von</strong> fehlerhaften Konfigurationen, betrifft dieser Testaspekt<br />
auch unterschiedliche Konfigurationen. Ist vorgesehen einen Service in z.B. mehreren<br />
verschiedenen Containern oder mit unterschiedlichen Subsystemen zu<br />
nutzen, entsteht ein Universum <strong>von</strong> Konfigurationen. Dabei ist jede Konfiguration<br />
einzeln mittels Configuration coverage zu testen. Konfigurationstests sind im<br />
Allgemeinen zu automatisieren [GP06] <strong>und</strong> unter Anwendung der Testmethode<br />
Regression testing nach jeder Änderung auszuführen.<br />
• Fehlendes Subsystem: Services benutzen Subsysteme, z.B. andere Services<br />
oder Datenbanken. Fehlt eins dieser Subsysteme muss ein Service angemessen<br />
reagieren, indem er eine sinnvolle Fehlermeldung liefert oder Alternativen sucht.<br />
Bei der Durchführung ist der Zugriff auf bestimmte Systeme manuell unmöglich<br />
zu machen <strong>und</strong> das Verhalten des Services zu überwachen.<br />
• Versteckte Grenzen: Durch die Verwendung einer Schichtenarchitektur <strong>und</strong> unterschiedlicher<br />
Subsysteme entstehen mehrere Grenzen, zwischen denen Objekte<br />
ausgetauscht werden. Ändern sich die Datentypen oder Definitionsbereiche,<br />
so kann ein Informationsverlust auftreten. Diese versteckten Verluste gilt es<br />
zu identifizieren, damit ein Service mit beliebigen Daten arbeiten kann.<br />
Zur Identifikation <strong>von</strong> versteckten Grenzen sind die folgenden zwei Schritte durchzuführen:<br />
1. Identifikation aller potentiellen Grenzen. Grenzen entstehen zwischen einzelnen<br />
Schichten in einer Schichtenarchitektur <strong>und</strong> beim Zugriff auf Subsysteme.<br />
2. Für jede identifizierte Grenze ist für jedes Objekt, das über diese Grenze<br />
ausgetauscht wird, der Datentyp bzw. aufgespannte Datenraum zu bestimmen.<br />
Tabelle 4.3 zeigt beispielhaft ein Produkt der eben beschriebenen Analyse. Dabei<br />
tritt bei dem Objekt ID ein Datenverlust zwischen den Grenzen 1 <strong>und</strong> 2 auf.<br />
Name Grenze 1 Grenze 2 Grenze 3<br />
Typ Typ Typ<br />
ID Int32 > Int16 < Int32<br />
Tabelle 4.3.: Analyse zur Ermittlung versteckter Grenzen<br />
Nach der Bestimmung aller Grenzen <strong>und</strong> Datentypen, sind Testdaten zu ermitteln,<br />
die zu Fehlern führen können. Als hilfreiche Testmethode kann die Bo<strong>und</strong>aryvalue<br />
analysis eingesetzt werden. Testfälle nutzen diese Testdaten <strong>und</strong> versuchen<br />
zu zeigen, dass aus der Datenreduktion fehlerhaftes Verhalten folgt.<br />
34
4. Testaspekte für SOA, Webservices <strong>und</strong> .NET<br />
Dieser Testaspekt repräsentiert einen vereinfachten Integrationstest. Die Grenzen<br />
seien als versteckt bezeichnet, weil ein Servicekonsument nur die Serviceschnittstelle<br />
sieht.<br />
4.2. Analogien zu Java EE<br />
Neben .NET sind heutzutage auch Webapplikationen mit Java EE sehr verbreitet. Die<br />
Praktiken, mit denen dabei Applikationen erstellt werden, sind sehr verwandt. Daher<br />
sind die vorgestellten Testaspekte aufgr<strong>und</strong> folgender Gründe auch für Java EE gültig:<br />
• Die Bereitstellung eines Services findet durch einen Applikationsserver gleichermaßen<br />
durch ein Deployment statt.<br />
• Das Deployment setzt sich aus einem Build <strong>und</strong> einer Konfiguration zusammen.<br />
• <strong>Architekturen</strong> sind ähnlich mit einer Schichtenarchitektur konstruiert nach Abbildung<br />
2.2.<br />
4.3. Zusammenfassung<br />
Für jede Ausprägung einer Ebene sind Testaspekte ableitbar. In diesem Kapitel wurden<br />
Testaspekte für Webservices, dem Microsoft .NET Framework <strong>und</strong> SOA selbst<br />
vorgestellt. Die Formulierung einer <strong>Teststrategie</strong> ist zu diesem Zeitpunkt noch nicht<br />
möglich, weil dazu das Projektumfeld fehlt.<br />
Im folgenden Kapitel wird zunächst ein Werkzeug vorgestellt, das die Umsetzung <strong>von</strong><br />
Teststufen <strong>und</strong> <strong>Teststrategie</strong>n ermöglicht. Erst im Rahmen der Fallstudie in Kapitel 6<br />
finden die vorgestellten Testaspekte Anwendung <strong>und</strong> formen eine <strong>Teststrategie</strong>.<br />
35
5. Werkzeugunterstützung für die<br />
<strong>Teststrategie</strong><br />
Ist ein Testaspekt automatisiert zu testen, so wird ein Werkzeug zur Testdurchführung<br />
notwendig. Allgemein wird in einer SOA ein Werkzeug für die praktikable Umsetzung<br />
einer <strong>Teststrategie</strong> benötigt. Ähnlich wie eine <strong>Teststrategie</strong>, ist auch dieses Werkzeug<br />
an die Ausprägung einer SOA geb<strong>und</strong>en.<br />
Ein Werkzeug zur Unterstützung der <strong>Teststrategie</strong> muss die Realisierung <strong>von</strong> Serviceumgebungen<br />
<strong>und</strong> Komponenten-, Integrations- <strong>und</strong> Systemtests direkt ermöglichen.<br />
Speziell diese Arbeit wird Komponententests nach den in Abschnitt 3.4.3 vorgestellten<br />
Ansätzen realisieren.<br />
In diesem Kapitel wird zunächst allgemein ein Werkzeug vorgestellt, das sich auf<br />
Webservices <strong>und</strong> eine Enterprise Plattform stützt. Ein konkret in dieser Arbeit entwickeltes<br />
Werkzeug betrachtet die in Abbildung 5.1 illustrierte Ausprägung <strong>und</strong> wird<br />
im Anschluss beschrieben.<br />
Abbildung 5.1.: Ausprägung des implementierten Werkzeugs<br />
5.1. Überblick<br />
5.1.1. Anforderungen<br />
Zur Unterstützung der <strong>Teststrategie</strong> muss ein Werkzeug die Umsetzung <strong>von</strong> Serviceumgebungen<br />
nach Abschnitt 3.3.1 ermöglichen <strong>und</strong> die Automation <strong>von</strong> Tests für Webser-<br />
36
5. Werkzeugunterstützung für die <strong>Teststrategie</strong><br />
vices erleichtern. Für die Realisierung <strong>von</strong> Testfällen gelten zunächst die folgenden<br />
Anforderungen:<br />
• Erweiterung vorhandener Werkzeuge: Die Unterstützung fließt nahtlos in vorhandene<br />
Unit Test Frameworks ein. Vorhandene Werkzeuge bieten Basisfunktionalitäten<br />
für die Formulierung, Organisation, Ausführung <strong>und</strong> Auswertung <strong>von</strong><br />
Tests an. Sie sind seit Längerem erprobt <strong>und</strong> getestet. Zusätzlich sind Entwickler<br />
mit den Werkzeugen vertraut, so dass der Einstieg beim <strong>Testen</strong> <strong>von</strong> Webservices<br />
leichter fällt.<br />
• Unabhängige Testläufe: Testläufe <strong>und</strong> die Tests selbst sind <strong>von</strong>einander unabhängig.<br />
In jedem Test ist es notwendig das Testobjekt zu kennen. Stellvertretend übernimmt<br />
ein Proxy diese Funktion:<br />
• Proxy-Integration: Ermöglichen der Interaktion mit einem Service durch Integration<br />
eines Proxy-Objekts. Speziell der Endpunkt des Webservices muss beliebig<br />
festlegbar sein.<br />
Auch wenn das Verfassen <strong>von</strong> herkömmlichen Komponententests für die Serviceimplementierung<br />
möglich ist, hat Abschnitt 3.4.3 neue Ansätze für Komponententests<br />
aufgezeigt. Im Folgenden seien Anforderungen zum Verfassen <strong>von</strong> Komponententests<br />
für Webservices vorgestellt:<br />
• Realisierung <strong>von</strong> Mocks: Anbieten <strong>von</strong> Möglichkeiten zum Einsatz eines harten<br />
oder weichen Mocks. Folglich muss sich Code auf einfache Art <strong>und</strong> Weise<br />
ändern lassen, um einen harten oder evtl. weichen Mock zu ermöglichen.<br />
• Aktive Verwaltung des Deployment: Nach Konsequenz 2.3 wird immer mit<br />
einem bestehenden Objekt interagiert. Durch die Bereitstellung in einem Web<br />
Container ist es nicht mehr möglich <strong>von</strong> außen Einfluss auf einen Webservice zu<br />
nehmen. Folglich muss ein Webservice vor der Bereitstellung manipuliert werden.<br />
Dazu benötigt man eine aktive Verwaltung der Dateien aus denen sich ein<br />
Deployment zusammensetzt. Insbesondere muss die kurzzeitige Manipulation<br />
<strong>von</strong> Dateien <strong>und</strong> auch deren Inhalten einfach möglich sein, ohne dass sich die<br />
realen Dateien ändern.<br />
Die Manipulation des Deployment muss während der Testdurchführung erfolgen.<br />
Dadurch setzt sich evtl. erst zur Laufzeit das eigentliche Testobjekt aus einer Serviceumgebung<br />
<strong>und</strong> den Vorschriften zur Manipulation des Deployment zusammen.<br />
In jedem Testlauf kann mit einer einzigartigen Mutation eines Webservices<br />
gearbeitet werden.<br />
• Aktive Bereitstellung: Durchführen einer Bereitstellung in einem Web Container,<br />
um ein manipuliertes Deployment direkt testen zu können. Insbesondere<br />
muss es möglich sein einen lokalen Web Container zu starten.<br />
Das vorgestellte Werkzeug wird nur eine Erweiterung eines Unit Test Frameworks sein<br />
<strong>und</strong> sei daher im weiteren Verlauf als Erweiterung bezeichnet.<br />
37
5. Werkzeugunterstützung für die <strong>Teststrategie</strong><br />
5.1.2. Konsequenzen<br />
Die im letzten Abschnitt vorgestellten Anforderungen <strong>und</strong> auch die gewählte Ausprägung<br />
führt zu folgenden Konsequenzen:<br />
• Ein Proxy-Objekt muss immer bereits zur Kompilierzeit bekannt sein. Mit Unit<br />
Test Frameworks werden Testfälle als Code verfasst. Dabei ist jeder Testfall die<br />
Methode einer Klasse <strong>und</strong> wird kompiliert. Dies erzwingt, dass alle benutzten Objekte<br />
zur Kompilierzeit vorliegen müssen, so auch das Proxy-Objekt. Das Proxy-<br />
Objekt ist als Stellvertreter zum eigentlichen Testobjekt, dem Webservice, zu<br />
betrachten.<br />
• Durch die Manipulation <strong>von</strong> Code zur Realisierung eines harten Mocks werden<br />
Abhängigkeiten zur Sprache geschaffen. Im Rahmen dieser Arbeit sei C# als<br />
Programmiersprache betrachtet.<br />
5.1.3. Prozess<br />
Ein Webservice durchläuft immer mehrere Schritte in der Entwicklung. Dies kann bewusst<br />
<strong>und</strong> geplant passieren, aber auch zufällig aus der Notwendigkeit heraus. In jedem<br />
Fall werden die folgenden Schritte immer in der angegeben Reihenfolge durchlaufen:<br />
1. Verwaltung: Es muss eine übergeordnete Struktur erstellt werden, die den Webservice<br />
verwaltet. Dies kann nur ein Verzeichnis mit Quelldateien sein, aber auch<br />
umfangreichere Verwaltungsmöglichkeiten, wie z.B. Projekte, sind denkbar.<br />
2. Entwicklung: Der Entwickler implementiert die Serviceimplementierung des Webservices.<br />
3. Build: Der Entwickler veranlasst einen Build, der aus der Serviceimplementierung<br />
ein Deployment erstellt. Oftmals existieren Skripte, die automatisiert einen<br />
Build durchführen.<br />
4. Bereitstellung: Das erzeugte Deployment wird auf einen Web Container übertragen<br />
<strong>und</strong> der Webservice steht zur Interaktion bereit.<br />
Ist das <strong>Testen</strong> <strong>von</strong> Webservices automatisiert zu unterstützen, so sind Teile der eben<br />
genannten Punkte in die Automatisierung mit einzubeziehen. Es ist erst möglich mit<br />
einem Webservice zu interagieren, wenn dieser vollständig <strong>und</strong> erfolgreich in einen<br />
Web Container übertragen wurde.<br />
Im Allgemeinen untergliedern sich automatisierte Tests in drei Phasen:<br />
• Initialisierung: Vorbereitung eines Testobjekts <strong>und</strong> herstellen eines definierten<br />
Zustandes.<br />
• Testdurchführung: Durchführung des Tests am Testobjekt.<br />
• Aufräumen: Wiederherstellen des Zustands vor der Initialisierung.<br />
38
5. Werkzeugunterstützung für die <strong>Teststrategie</strong><br />
Abbildung 5.2 zeigt den durchlaufenden Prozess eines Tests für Services. Dieser Prozess<br />
sei im Folgenden als Testprozess bezeichnet.<br />
Verwaltung<br />
Verwaltung<br />
Build<br />
Build<br />
Rückgängigmachen aller<br />
Aktivitäten der Initialisierung<br />
Bereitstellung<br />
Bereitstellung<br />
Test<br />
Test<br />
Test<br />
Abbildung 5.2.: Ablauf eines Tests für Services<br />
Das im Rahmen dieser Arbeit entwickelte Werkzeug wird den vorgestellten Testprozess<br />
implementieren <strong>und</strong> auf die drei Phasen <strong>von</strong> automatisierten Tests abbilden.<br />
5.2. Testmöglichkeiten in .NET<br />
Für .NET existieren mehrere Unit Test Frameworks, die für eine Erweiterung geeignet<br />
sind:<br />
• NUnit [Ham04]: Ein Vertreter der xUnit Test Frameworks als Realisierung für<br />
.NET.<br />
• Das Unit Test Framework der Microsoft Visual Studio Team Edition: In der Microsoft<br />
Visual Studio Team Edition für Softwareentwickler oder Tester ist ein vollständiges<br />
Unit Test Framework enthalten.<br />
In Rahmen dieser Arbeit ist das Unit Test Framework der Microsoft Visual Studio Team<br />
Edition aus folgenden Gründen zu erweitern:<br />
39
5. Werkzeugunterstützung für die <strong>Teststrategie</strong><br />
• Die Visual Studio Team Edition wird bei dem in Kapitel 6 vorgestellten Unternehmen<br />
eingesetzt.<br />
• Das Unit Test Framework ist nahtlos in die Entwicklungsumgebung <strong>von</strong> Visual<br />
Studio integriert.<br />
• Die Visual Studio Team Edition ermöglicht einen gesamten Entwicklungsprozess<br />
<strong>und</strong> seine Artefakte zu verwalten [GP06]. Neben Testfällen an sich, ist es auch<br />
möglich den Tests direkt die Ergebnisse <strong>von</strong> Testläufen <strong>und</strong> gef<strong>und</strong>ene Bugs<br />
zuzuordnen.<br />
• Die Integration in einen Build-Prozess ist direkt möglich.<br />
In .NET gibt es bereits einige Möglichkeiten einen Webservice zu testen:<br />
• Das Unit Test Framework der Microsoft Visual Studio Team Edition erlaubt lokal<br />
einen ASP.NET Development Server zu starten, über den ein Webservice bereitgestellt<br />
wird. Dies erlaubt die Interaktion mit einem Webservice, aber erfordert,<br />
dass alle teilnehmenden Subsysteme existieren <strong>und</strong> zugreifbar sind.<br />
• Ein in .NET entwickelter <strong>und</strong> bereitgestellter Webservice hat eine Bedienoberfläche,<br />
die es erlaubt jede Operation mit einem Browser aufzurufen. Dies ermöglicht<br />
die Interaktion mit einem Webservice, selbst wenn wenig technisches Verständnis<br />
vorhanden ist.<br />
Alle bekannten Ansätze <strong>und</strong> Werkzeuge haben gemeinsam, dass das Deployment immer<br />
vor der Testdurchführung bekannt sein muss <strong>und</strong> auch eine Bereitstellung bereits<br />
erfolgt sein muss. Es ist nicht möglich ein Deployment interaktiv während oder kurz<br />
vor der Testdurchführung frei zu gestalten <strong>und</strong> diesen Vorgang für Regressionstests<br />
aufzuheben. Als Konsequenz ist nach jedem Testlauf ein definierter Zustand herzustellen.<br />
5.3. Architektur<br />
5.3.1. Grobarchitektur<br />
Die Architektur der Erweiterungen gliedert sich in drei Teilbereiche, die einzelne Funktionalitäten<br />
beschreiben. Abbildung 5.3 gibt dazu eine Übersicht, wobei jeder Teilbereich<br />
die folgenden Aufgaben übernimmt:<br />
• Adapter: Enthält einen Adapter zum bestehenden Unit Test Framework <strong>und</strong> alle<br />
Klassen, die eine Benutzerschnittstelle zu neu angebotenen Funktionalitäten<br />
bilden. Dabei ist das Ziel die bisherige Testausführung um neue Funktionen zu<br />
erweitern, die während der Initialisierung <strong>und</strong> dem Aufräumen abgearbeitet werden.<br />
Der Adapter veranlasst alle weiteren Schritte, so dass der Testlauf an sich<br />
um einen Testprozess dekoriert wird. Die Ausführung <strong>und</strong> Auswertung des Tests<br />
übernimmt weiterhin das Unit Test Framework.<br />
Dieser Adapter ist abhängig vom eingesetzten Unit Test Framework, indem er<br />
40
5. Werkzeugunterstützung für die <strong>Teststrategie</strong><br />
vorhandene Besonderheiten berücksichtigt <strong>und</strong> die bestehende Verwaltung der<br />
Tests nutzt.<br />
• Testablauf: Die interne Beschreibung des technischen Testprozesses. Weiterhin<br />
eine Möglichkeit zur Ausführung <strong>und</strong> Verwaltung des Testprozesses.<br />
• Externe Systeme: Alle externen Systeme, mit denen interagiert werden muss,<br />
z.B. das Dateisystem, ein Compiler oder Möglichkeiten zur Bereitstellung.<br />
Adapter Testablauf Extern<br />
nutzt<br />
Tester<br />
nutzt<br />
nutzt<br />
FrameworkAdapter<br />
Neue<br />
Funktionalitäten<br />
Initialisierung Aufräumen<br />
nutzt<br />
nutzt<br />
Abbildung 5.3.: Grobarchitektur<br />
Die Architektur <strong>von</strong> jedem Teilbereich ist stark durch Entwurfsmuster geprägt <strong>und</strong> eine<br />
detaillierte Darstellung erfolgt in den nächsten Abschnitten.<br />
5.3.2. Testablauf<br />
Abbildung 5.4 illustriert die Architektur des Teilbereichs Testablauf. Ziel ist es den Testprozess<br />
um Logik vor <strong>und</strong> nach der Testdurchführung zu erweitern. D.h. die Testdurchführung<br />
selbst übernimmt weiterhin das zu erweiternde Unit Test Framework.<br />
41
5. Werkzeugunterstützung für die <strong>Teststrategie</strong><br />
TestProcess<br />
+Initialize()<br />
+CleanUp()<br />
1<br />
1..*<br />
+Node<br />
Knoten für:<br />
Verwaltung<br />
Build<br />
Bereitstellung<br />
Test<br />
TestProcessNode<br />
+Command : ITestCommand<br />
+Preparation : ITestCommand[]<br />
+DoBeforeTest()<br />
+DoAfterTest()<br />
«interface»<br />
ITestCommand<br />
+DoBeforeTest()<br />
+DoAfterTest()<br />
Abbildung 5.4.: Feinarchitektur des Teilbereichs Testablauf<br />
Ein Knoten im Testprozess besteht immer aus einem Command-Objekt zur Durchführung<br />
der eigentlichen Logik <strong>und</strong> einer Liste <strong>von</strong> Command-Objekten, die vorher<br />
auszuführen sind (Vorbereitung). Insgesamt entsteht eine Hierarchie, in der die Ausführung<br />
des Testprozesses entsprechend an die Knoten delegiert wird, die wiederum<br />
jedes Command-Objekt entsprechend ausführen. Die Command-Objekte sind dabei<br />
anderorts implementiert <strong>und</strong> der Teilbereich Testablauf bildet nur einen leeren <strong>und</strong><br />
definierten Rahmen.<br />
5.3.3. Adapter zu einem Unit Test Framework<br />
Das Unit Test Framework der Microsoft Visual Studio Team Edition bietet aufgr<strong>und</strong><br />
<strong>von</strong> fehlenden Schnittstellen <strong>und</strong> der Tatsache, dass der Quellcode nicht frei verfügbar<br />
ist, keine Möglichkeiten zur direkten Erweiterung an. Daher gilt es die vom Unit Test<br />
Framework bereitgestellten Möglichkeiten zur Initialisierung <strong>und</strong> zum Aufräumen so<br />
erweiterbar zu machen, dass ein Nutzer leicht neue Funktionalitäten einbinden kann.<br />
Die Aktivitäten der Initialisierung <strong>und</strong> des Aufräumens sind Teile eines jeden Testfalls<br />
<strong>und</strong> werden durch Methoden repräsentiert. Über beide Aktivitäten hat der Verfasser<br />
des Tests die Kontrolle, so dass er einen Adapter einbinden kann. Der Adapter benötigt<br />
dabei die folgenden Informationen:<br />
• Die aktuelle Klasse, die Testfälle umsetzt.<br />
• Ein Proxy zur Interaktion mit einem Service.<br />
• Ein Objekt, das alle wichtigen Steuerungsinformationen während des Testlaufs<br />
enthält.<br />
42
5. Werkzeugunterstützung für die <strong>Teststrategie</strong><br />
Zum einfachen Einbinden bietet sich eine statische Methode an, die eine Verbindung<br />
zwischen dem Unit Test Framework <strong>und</strong> den Erweiterungen herstellt. Als Auskommen<br />
dieses Aufrufs wird neue Funktionalität bereitgestellt <strong>und</strong> ein Objekt des<br />
Proxy so vorbereitet geliefert, dass dieses direkt zum <strong>Testen</strong> des Webservices genutzt<br />
werden kann. Abbildung 5.5 zeigt die Einbindung des Adapters in einem Test<br />
in C#. Dabei enthält der TestContext alle Steuerungsinformationen des Testlaufs.<br />
InitializeLink führt die Initialisierung des Testprozesses aus <strong>und</strong> gibt ein Objekt<br />
des Proxy zurück. ReleaseLink führt die Aufräumknoten des Testprozesses aus <strong>und</strong><br />
löst dadurch die Verbindung zu den Erweiterungen auf.<br />
1 [ TestClass ]<br />
2 public class Test {<br />
3<br />
4 [ T e s t I n i t i a l i z e ]<br />
5 public void I n i t i a l i z e ( ) {<br />
6 Proxy s e r v i c e = Adapter . I n i t i a l i z e L i n k ( TestContext ) ;<br />
7 }<br />
8<br />
9 [ TestCleanup ]<br />
10 public void CleanUp ( ) {<br />
11 Adapter . ReleaseLink ( TestContext ) ;<br />
12 }<br />
13<br />
14 . . .<br />
15<br />
16 }<br />
Abbildung 5.5.: Einbindung des Adapters in einem Test<br />
Der Adapter stellt die äußere Schnittstelle zum Testprozess dar. Neue Funktionalitäten<br />
werden über Annotationen 1 bereitgestellt. Jede Annotation enthält dabei die Logik zur<br />
entsprechenden Manipulation des Testprozesses.<br />
Abbildung 5.6 stellt den gesamten Teilbereich Adapter als Klassendiagramm dar. Annotationen<br />
werden über eine Vererbungshierarchie identifiziert, wodurch eine gezielte<br />
Auswertung möglich wird.<br />
Die Verwaltung <strong>von</strong> Informationen, die während der Testdurchführung entstehen <strong>und</strong><br />
anderorts notwendig sind, werden in einem global erreichbarem Kontext abgelegt.<br />
1 Annotationen sind in Java Metadaten, die direkt am Code angegeben werden. In .NET werden Annotationen<br />
als Attribute bezeichnet.<br />
43
5. Werkzeugunterstützung für die <strong>Teststrategie</strong><br />
Wertet Test- <strong>und</strong> Konfigurationsannotationen aus.<br />
Adapter<br />
+InitializeLink(in testContext) : Proxy<br />
+ReleaseLink(in testContext)<br />
-EvaluateAttributes(in testName : string)<br />
«interface»<br />
ITestProcessRegistration<br />
+RegisterAt(in process)<br />
System.Attribute<br />
TestAttribute<br />
ConfigurationAttribute<br />
+RegisterAt(in process)<br />
ScopeAttribute<br />
Annotationen zur Bereitstellung unterliegen<br />
der Einschränkung, dass nur eine Bereitstellung<br />
je Testfall erfolgt.<br />
Abbildung 5.6.: Feinarchitektur des Teilbereich Adapter<br />
5.3.4. Interaktion mit externen Systemen<br />
Zur Realisierung des Testprozesses ist der Einsatz <strong>von</strong> Systemen zum Kompilieren<br />
oder Bereitstellen unabdingbar. Daher seien externe Systeme durch eine Fassade<br />
[GHJV95] so implementiert, dass sie in den Erweiterungen wohl definiert nutzbar sind.<br />
Dies begünstigt Flexibilität durch eine klare Trennung zwischen den Erweiterungen<br />
<strong>und</strong> externen Systemen. Zusätzlich wird die Testbarkeit erhöht, weil sich Tests durch<br />
den Einsatz <strong>von</strong> Mocks ohne reale Effekte ausführen lassen.<br />
44
5. Werkzeugunterstützung für die <strong>Teststrategie</strong><br />
«interface»<br />
IParser<br />
+Parse(in code : string)<br />
+GetOutput() : string<br />
CSharpParser<br />
+Parse(in code : string)<br />
+GetOutput() : string<br />
«interface»<br />
IAspNetDevelopmentServer<br />
+Start()<br />
+Shutdown()<br />
AspNetDevelopmentServer<br />
+Start()<br />
+Shutdown()<br />
«interface»<br />
IFileSystemFacade<br />
FileSystemFacade<br />
«interface»<br />
IPathLocator<br />
PathLocator<br />
«interface»<br />
ISolutionFacade<br />
+Load(in solutionFile : string)<br />
+Build()<br />
SolutionFacade<br />
+Load(in solutionFile : string)<br />
+Build()<br />
Abbildung 5.7.: Feinarchitektur des Teilbereich Extern<br />
Abbildung 5.7 zeigt die Architektur des Teilbereich Extern in vereinfachter Form. Jede<br />
Fassade ist definiert durch eine Schnittstelle, die für das Umfeld .NET implementiert<br />
ist. Die Funktionen einer jeden Fassade stellen sich wie folgt dar:<br />
• IParser: Stellt Möglichkeiten zur Manipulation <strong>von</strong> Code zur Verfügung. Die konkrete<br />
Implementierung ist an eine Sprache geb<strong>und</strong>en, um harte Mocks zu ermöglichen.<br />
Eine detaillierte Beschreibung wird in Abschnitt 5.5 gegeben.<br />
• IAspNetDevelopmentServer: Der ASP.NET Development Server ist ein Web<br />
Container im .NET Umfeld <strong>und</strong> wird während der Entwicklung zu Testzwecken<br />
eingesetzt.<br />
• IFileSystemFacade: Verbirgt Operationen auf dem Dateisystem.<br />
• IPathLocator: Dient zum Auflösen <strong>von</strong> Pfaden <strong>und</strong> hält definierte Pfade bereit.<br />
• ISolutionFacade: In .NET heißt die einem Projekt übergeordnete Struktur Solution.<br />
Diese Fassade erlaubt die Durchführung eines Builds für eine Solution.<br />
45
5.4. Implementierung<br />
5. Werkzeugunterstützung für die <strong>Teststrategie</strong><br />
Die Umsetzung <strong>von</strong> Serviceumgebungen <strong>und</strong> das Einfügen <strong>von</strong> Mocks sind neue<br />
Funktionalitäten, die die Erweiterungen einem Tester zur Verfügung stellen. Realisiert<br />
sind sie über Annotationen, die den Testprozess mit Command-Objekten entsprechend<br />
anreichern.<br />
Viele Command-Objekte nehmen Änderungen am Deployment vor, so dass für diesen<br />
Fall ein Klon <strong>von</strong> der Solution erstellt wird. Dadurch sind alle Änderungen nur temporär<br />
<strong>und</strong> betreffen den jeweiligen Testlauf. Realisiert wird der Klonvorgang durch wohl<br />
definierte Command-Objekte, die den Verwaltungsknoten des Testprozess erweitern.<br />
Konkret wird ein entsprechender Pfad zum Ablegen des Klon gesucht <strong>und</strong> eine Kopie<br />
aller Verzeichnisse rekursiv erstellt. Anderen Command-Objekten steht der Klon über<br />
einen Kontext zur Verfügung.<br />
Umgesetzt sind die folgenden Annotationen:<br />
• Die lokal/entfernt Serviceumgebung stützt sich auf einen lokal zur Verfügung<br />
gestellten Web Container. Die Annotation LocalRemote dekoriert den Bereitstellungsknoten<br />
des Testprozess um ein Command-Objekt, das einen ASP.NET<br />
Development Server startet <strong>und</strong> die Bereitstellung eines Projektes durchführt.<br />
• Eine entfernte Serviceumgebung wird manuell bereitgestellt, so dass nur die<br />
URL des Endpunkts <strong>von</strong> Interesse ist. Die Annotation Remote muss folglich nur<br />
den Bereitstellungsknoten des Testprozess um ein Command-Objekt erweitern,<br />
das die URL des Proxys auf die URL des Services umleitet.<br />
• Der Einsatz eines harten Mocks nach Abschnitt 3.4 kann durch den Austausch<br />
<strong>von</strong> Dateien im Deployment oder dem Austauschen <strong>von</strong> Code umgesetzt werden.<br />
Entsprechende Annotationen erweitern die Vorbereitung des Buildknotens<br />
um Command-Objekte, die eine Datei oder Code austauschen. Die genaue Vorgehensweise<br />
wird in Abschnitt 5.5 vorgestellt.<br />
• Ein weicher Mock zieht nach Abschnitt 3.4.3 die Änderung des Deployments<br />
nach sich. Dazu muss eine Annotation das Deployment so manipulieren, dass<br />
ein weicher Mock während der Testdurchführung nutzbar wird. Abschnitt 5.6 wird<br />
diesen Fall genauer betrachten <strong>und</strong> unterschiedliche Vorgehensweisen beschreiben.<br />
Während der Implementierung wurden einige Maßnahmen zur Steigerung der Qualität<br />
unternommen. Zunächst wurde ein Wegwerf-Prototyp entwickelt, um Probleme bei der<br />
letztendlichen Implementierung zu vermeiden. Die Erweiterungen selbst sind testgetrieben<br />
[Bec03] implementiert, damit schon während der Entwicklung durch kontinuierliche<br />
Tests die Qualität sichergestellt wird. Zum Abschluss wurden weitere Mängel<br />
durch die statische Codeanalyse <strong>von</strong> Microsoft Visual Studio identifiziert <strong>und</strong> behoben.<br />
46
5. Werkzeugunterstützung für die <strong>Teststrategie</strong><br />
5.5. Realisierung <strong>von</strong> harten Mocks<br />
5.5.1. Identifikation <strong>von</strong> auszutauschenden Teilen<br />
Ein nach Abschnitt 3.4.3 eingeführter harter Mock wird Teile eines Deployment austauschen.<br />
Entwicklungsumgebungen verwalten Quellcode in Projekten. D.h. existiert<br />
bereits ein Klon der Projekte, so ist der Austausch <strong>von</strong> gesamten Dateien einfach<br />
möglich. Für die gezielte Ersetzung <strong>von</strong> Teilen im Quellcode präsentiert diese Arbeit<br />
einen neuen Mechanismus.<br />
Vor der Manipulation <strong>von</strong> Code ist es notwendig den auszutauschenden Teil festzulegen.<br />
Dabei sind einfache Merkmale wie z.B. die Zeilennummern einer Datei ungeeignet,<br />
weil sie gegenüber Änderungen nicht konstant sind. In der objektorientierten<br />
Programmierung dienen Klassen <strong>und</strong> Methoden zur Strukturierung einer Applikation.<br />
Klassen enthalten dabei Methoden <strong>und</strong> stellen das äußere Gerüst dar, so dass erst in<br />
Methoden konkrete Logik implementiert wird. Daher seien Methoden als der Teil <strong>von</strong><br />
Code ausgewählt, den es zu ersetzen gilt. Die Identifikationsmerkmale einer Methode<br />
sind wie folgt:<br />
• Äußere Klasse<br />
• Methodenname<br />
• Parameter<br />
• Generische Typen<br />
Gilt es eine Methode auszutauschen, so sind alle vier Identifikationsmerkmale, der<br />
neue Rumpf der Methode <strong>und</strong> die zu manipulierende Datei vom Testverfasser anzugeben.<br />
5.5.2. Verarbeitung <strong>und</strong> Austauschen <strong>von</strong> Code<br />
Sind alle notwendigen Informationen zum Austauschen einer Methode bekannt, muss<br />
ein Mechanismus die Änderungen vornehmen. Dabei gilt es zunächst die Methode im<br />
Quellcode zu finden <strong>und</strong> anschließend den neuen Rumpf zu schreiben. Im Folgenden<br />
wird dazu ein Parser vorgestellt, der Zeichenweise einen Text verarbeitet.<br />
Zur Vereinfachung sei die Annahme getroffen, dass der betrachtete Code wohlgeformt<br />
ist. Diese Annahme kann getroffen werden, weil im Testprozess immer ein Build durchzuführen<br />
ist, wenn sich das Deployment ändert. Dies erlaubt den Parser auf Probleme<br />
aus der Zeichenkettensuche zu reduzieren.<br />
Zur kontextuellen Suche einer Methode <strong>und</strong> zum Schreiben des Ergebnisses setzt der<br />
Parser das Strategy-Entwurfsmuster [GHJV95] ein. Die Strategien erhalten dabei ein<br />
Zeichen <strong>und</strong> entscheiden intern über die weitere Verarbeitung:<br />
• Ein Finder ist eine Strategie, deren Implementierung zur Suche <strong>von</strong> Informationen<br />
genutzt wird. Zusätzlich repräsentiert ein Finder den Zustand des Parsers<br />
47
5. Werkzeugunterstützung für die <strong>Teststrategie</strong><br />
nach dem State-Entwurfsmuster [GHJV95]. Ein Finder definiert jeweils für den<br />
Erfolgsfall <strong>und</strong> den Fehlschlag den nachfolgenden Finder.<br />
• Ein Writer ist eine Strategie zum Schreiben <strong>von</strong> Zeichen.<br />
Klassenname<br />
suchen<br />
Klassenname<br />
gef<strong>und</strong>en<br />
Klassenschlüsselwort<br />
gef<strong>und</strong>en<br />
Klassenschlüsselwort<br />
oder<br />
Methodenname<br />
suchen<br />
Methodenname<br />
gef<strong>und</strong>en<br />
Generische<br />
Typen suchen<br />
Ende der generischen<br />
Typen erreicht<br />
Parameter<br />
suchen<br />
Ende der Parameterliste<br />
erreicht<br />
Anfang des<br />
Methodenrumpfes<br />
suchen<br />
Abbildung 5.8.: Zustandsübergänge der Finder<br />
Zum Auffinden einer Methode durchläuft der Parser die in Abbildung 5.8 durch Finder<br />
repräsentierten Zustände. Der Misserfolgsfall wird dabei nicht explizit angegeben <strong>und</strong><br />
sei für alle Kanten ohne Markierung angenommen. Für jeden Knoten existiert eine<br />
eigene Klasse, die die Schnittstelle der Finder mit entsprechender Logik implementiert.<br />
Zur Erzeugung <strong>von</strong> Finder-Objekten wird das Factory-Entwurfsmuster [GHJV95]<br />
eingesetzt.<br />
Während der Verarbeitung einer Quelldatei ist sowohl die aktuell betrachtete Klasse,<br />
als auch der aktuelle Block 2 <strong>von</strong> Interesse. Deshalb existiert ein Stack für die gefun-<br />
2 In C# wird ein Block durch geschweifte Klammern eingeleitet <strong>und</strong> abgeschlossen.<br />
48
5. Werkzeugunterstützung für die <strong>Teststrategie</strong><br />
denden Klassen <strong>und</strong> ein zentraler Zähler zur Speicherung des aktuellen Blocks.<br />
Im Allgemeinen wird ein Writer verwendet, der jedes erhaltene Zeichen direkt schreibt.<br />
Nur im Fall, dass erfolgreich eine Methode zum Austauschen gef<strong>und</strong>en wurde, wird<br />
der Writer gewechselt. Dieser neue Writer schreibt den neuen Methodenrumpf <strong>und</strong> es<br />
wird veranlasst alle Zeichen so lange zu überlesen bis das Ende der Methode erreicht<br />
wurde; das Ende der Methode stellt ein Beobachter fest.<br />
Die zentrale Steuerung übernimmt nach dem Mediator-Entwurfsmuster [GHJV95] ein<br />
Manager. Dieser erlaubt jedem Finder <strong>und</strong> Writer kontextsensitive Informationen zu<br />
nutzen. Abbildung 5.9 zeigt den Parser als Klassendiagramm.<br />
Entsprechende Schnittstellen<br />
seien nicht angegeben.<br />
get- <strong>und</strong> set-Methoden seien<br />
durch öffentliche Attribute<br />
repräsentiert.<br />
Parser<br />
+Output : string<br />
+Parse(in code : string)<br />
1<br />
1<br />
ParserManager<br />
+ActiveFinder : IFinder<br />
+ActiveWriter : IWriter<br />
+MethodsToMock[] : Method<br />
+Find(in character : char)<br />
+Write(in character : char)<br />
1<br />
1<br />
1<br />
1<br />
«interface»<br />
IFinderFactory<br />
+CreateFinder(in type : int)<br />
«interface»<br />
IFinder<br />
+Find(in character : char)<br />
+DoMatch(in manager : IParserManager)<br />
+DoFail(in manager : IParserManager)<br />
«interface»<br />
IWriter<br />
+Write(in character : char)<br />
ClassStack<br />
BlockCounter<br />
+Push(in classToPush : Class)<br />
+Pop() : Class<br />
+Peek() : Class<br />
+Increment()<br />
+Decrement()<br />
Abbildung 5.9.: Architektur des Parser<br />
5.6. Realisierung <strong>von</strong> weichen Mocks<br />
Die Einführung <strong>von</strong> weichen Mock-Objekten setzt einen Mechanismus voraus, der<br />
einen Austausch <strong>von</strong> Objekten zur Laufzeit durchführt. Die Logik, die diesen Austausch<br />
vornimmt, ist vor der Bereitstellung dem Webservice hinzuzufügen. Nach der Bereitstellung<br />
kann ein Test nicht mehr <strong>von</strong> außen Einfluss auf den Webservice nehmen.<br />
Im Verlauf dieser Arbeit wurden drei verschiedene Ansätze verfolgt, die auf den nächsten<br />
Seiten vorgestellt werden.<br />
49
5. Werkzeugunterstützung für die <strong>Teststrategie</strong><br />
1. Abbildung 5.10 zeigt die Realisierung eines weichen Mocks unter Einsatz einer<br />
Steuereinheit. Die Steuereinheit ist ein Webservice, der zum Deployment des<br />
zu testenden Webservices hinzuzufügen ist. Den Austausch <strong>von</strong> Komponenten<br />
durch Mocks übernimmt die Steuereinheit. Die eingenommene Sichtweise<br />
der Steuereinheit entspricht der Sichtweise eines Tests in der objektorientierten<br />
Programmierung (siehe Abbildung 3.3 in Abschnitt 3.4.3). Demnach muss die<br />
Steuereinheit Zugriff auf die Instanz eines Webservices haben.<br />
Test Steuereinheit Webservice<br />
Initialisierung()<br />
SetzeKomponente()<br />
Operation()<br />
Ergebnis<br />
Aufräumen()<br />
SetzeKomponente()<br />
SOAP<br />
Abbildung 5.10.: Weicher Mock mit Steuereinheit<br />
Ein Tester muss nur die Logik zum Austauschen einer Komponente angeben. Die<br />
Steuereinheit ist einmalig zu implementieren <strong>und</strong> die Serviceimplementierung<br />
bleibt unverändert.<br />
Dieser Ansatz ist aufgr<strong>und</strong> <strong>von</strong> Konsequenz 2.3 nicht anwendbar, weil im Web<br />
Container kein Zugriff auf die Instanz des Webservices möglich ist. Insbesondere<br />
ist auch nicht bekannt mit welcher Instanz eines Webservices ein Servicekonsument<br />
interagieren wird.<br />
50
5. Werkzeugunterstützung für die <strong>Teststrategie</strong><br />
2. In Abbildung 5.11 wird ein Ansatz unter Einführung einer Initialisierungs- <strong>und</strong><br />
Aufräumoperation im Webservice illustriert. Dabei führen die neuen Operationen<br />
den Austausch der Komponenten durch.<br />
Test<br />
Webservice<br />
Initialisierung()<br />
Operation()<br />
Ergebnis<br />
Aufräumen()<br />
SOAP<br />
Abbildung 5.11.: Weicher Mock mit neuen Operationen<br />
Ein Tester gibt die Logik der Initialisierungs- <strong>und</strong> Aufräumoperation an. Die Serviceimplementierung<br />
bleibt insofern unverändert, als dass sich keine Operationen<br />
im Webservice ändern.<br />
Zwischen dem Aufruf <strong>von</strong> Operationen eines Webservices kann nicht garantiert<br />
werden, dass die Instanz des Webservices identisch bleibt [Sta06a] (siehe auch<br />
Konsequenz 2.5). Folglich ist auch dieser Ansatz nicht anwendbar.<br />
51
5. Werkzeugunterstützung für die <strong>Teststrategie</strong><br />
3. Abbildung 5.12 zeigt einen Ansatz, der die zu testende Operation im Webservice<br />
um Logik zur Durchführung der Initialisierung <strong>und</strong> dem Aufräumen erweitert. Dabei<br />
wird eine Operation so verändert, dass sich ihr eigentliches Verhalten nicht<br />
ändert.<br />
Test<br />
Webservice<br />
Operation()<br />
Ergebnis<br />
SOAP<br />
Initialisierung()<br />
Aufräumen()<br />
1 public void Operation ( ) {<br />
2 I n i t i a l i z e ( ) ;<br />
3 t r y {<br />
4 / / vorhandener Code<br />
5 } catch ( Exception ) {<br />
6 throw ;<br />
7 } f i n a l l y {<br />
8 CleanUp ( ) ;<br />
9 }<br />
10 }<br />
Abbildung 5.12.: Weicher Mock mit erweiterter Logik<br />
Zur Implementierung dieses Ansatzes wurde der Parser aus 5.5 wie folgt erweitert:<br />
• Der Writer, der einen Mock schreibt, ist so anzupassen, dass bisheriger Code<br />
erhalten bleibt. D.h. eine Methode wird nur mit neuen Codefragmenten<br />
dekoriert.<br />
• Einfügen eines Beobachters, der die Klasse des Webservices um eine Initialisierungs-<br />
<strong>und</strong> Aufräummethode erweitert.<br />
5.7. Zusammenfassung<br />
Ein Werkzeug zur Unterstützung einer <strong>Teststrategie</strong> betrifft Ausprägungen in allen drei<br />
Ebenen einer SOA. Insbesondere wird man abhängig <strong>von</strong> der Plattform, ermöglicht<br />
aber Komponententests nach Abschnitt 3.4.<br />
Durch den Einsatz <strong>von</strong> Entwurfsmustern <strong>und</strong> klarer Trennung der Zuständigkeiten erhält<br />
man eine sehr einfache Architektur, die sich aus einem Adapter, einem Testablauf<br />
<strong>und</strong> externen Systemen zusammensetzt.<br />
52
6. Fallstudie<br />
Kapitel 3 hat gezeigt, wie eine <strong>Teststrategie</strong> für eine SOA zu finden ist. Dabei hat im<br />
Anschluss Kapitel 4 die ersten zwei Schritte dieser Vorgehensweise durchgeführt. In<br />
diesem Kapitel gilt es eine konkrete <strong>Teststrategie</strong> unter Einbezug der bisherigen Ergebnisse<br />
zu finden. Dazu werden die Webservices eines Unternehmens als Testobjekte<br />
dienen. Die <strong>Teststrategie</strong> selbst ist angepasst an das vorherrschende Projektumfeld<br />
im Unternehmen.<br />
Nach erfolgreicher Festlegung einer <strong>Teststrategie</strong>, beschrieben durch eine Testmatrix<br />
<strong>und</strong> Testszenarien, ist diese <strong>Teststrategie</strong> für die bereits erwähnten Webservices umzusetzen.<br />
Zur Ausführung <strong>von</strong> Testfällen dient das in Kapitel 5 vorgestellte Werkzeug.<br />
6.1. Projektumfeld<br />
Das im Rahmen dieser Fallstudie betrachtete Unternehmen ist im Business-To-Business<br />
Umfeld tätig. Angebotene Dienste werden über ein eigenes entwickeltes <strong>und</strong><br />
verwaltetes Portal zur Verfügung gestellt. Die Entwicklung betrifft im Allgemeinen die<br />
Erweiterung <strong>und</strong> Wartung dieses Portals.<br />
Abbildung 6.1(a) zeigt eine Übersicht über das hauseigene Portal. Informationen über<br />
die Interaktion mit Objekten werden aktiv verfolgt <strong>und</strong> gesammelt. K<strong>und</strong>en interagieren<br />
mit dem Geschäftsbereich über eine Website. Webservices sind ein noch wenig<br />
genutztes Produkt <strong>und</strong> bieten bereits vorhandene Funktionalitäten der Website an.<br />
In einer SOA übernimmt das Unternehmen die Rollen des Serviceanbieters <strong>und</strong> des<br />
Serviceentwicklers. Das Portal selbst ist nicht serviceorientiert strukturiert, sondern<br />
mit herkömmlichen Mitteln in .NET <strong>und</strong> mit Datenbanken realisiert. Abbildung 6.1(b)<br />
definiert allgemein die Ausprägung einer SOA im Unternehmen.<br />
Bisherige Tests wurden für die Webservices nur vereinzelt systematisch durchgeführt.<br />
Vorherige Schritte wie das Verfassen einer <strong>Teststrategie</strong> oder eines Testkonzepts fehlen<br />
bisher. Von den Entwicklern werden Komponententests mit einem Unit Test Framework<br />
gelegentlich umgesetzt <strong>und</strong> während der Entwicklung der Webservices wurde<br />
nicht auf Testbarkeit geachtet.<br />
Zusätzlich sind die folgenden Vorgehensweisen <strong>und</strong> Randbedingungen für diese Arbeit<br />
<strong>von</strong> Bedeutung:<br />
• Ein automatisierter Build-Prozess wird jeden Tag durchlaufen.<br />
• Bisherige Tests werden immer aus Systemsicht durchgeführt, d.h. <strong>von</strong> Teststufen<br />
53
6. Fallstudie<br />
(a) Architektur<br />
(b) Ausprägung<br />
Abbildung 6.1.: Portal des Unternehmens<br />
wird kein Gebrauch gemacht.<br />
• Für Tests existiert eine produktionsnahe Testumgebung, die ein komplettes Abbild<br />
der Datenbank zu einem gegebenen Stand vorweist.<br />
• Tester sind nicht technisch-orientiert, d.h. sie verfassen keine automatisierten<br />
Komponententests.<br />
6.1.1. Betrachtete Webservices<br />
Im Verlauf dieser Arbeit wurde <strong>von</strong> den Entwicklern ein Teil des Portals überarbeitet<br />
<strong>und</strong> erweitert. Als Konsequenz waren auch einige Webservices anzupassen, so dass<br />
diese für Tests ausgewählt wurden.<br />
Die betrachteten Webservices sind passiv <strong>und</strong> rufen nur Daten aus der Geschäftslogik<br />
ab. Abbildung 6.2 zeigt die Entwicklung der Webservices 1 , wobei für diese Webservices<br />
keine Spezifikationen vorliegen. Speziell die Auswahl der Operationen <strong>und</strong> Parameter<br />
wurde nicht geplant, sondern <strong>von</strong> den Entwicklern selbst während der Entwicklung<br />
festgelegt.<br />
Als Dokumente zum Ableiten <strong>von</strong> Testfällen stehen die Servicedokumentation <strong>und</strong> die<br />
Serviceimplementierung als Quellcode zur Verfügung. Weitere Informationen liegen<br />
nur in „flüssiger“ Form vor <strong>und</strong> sind gezielt <strong>von</strong> Mitarbeitern zu erfragen. Im gesamten<br />
Verlauf dieser Arbeit erwies sich die Identifikation <strong>von</strong> Informationsträgern als schwierig,<br />
weil oftmals schon die Zuständigkeiten nicht eindeutig geklärt waren. Als Orakel<br />
1 Für eine Erklärung der Notation sei auf Kapitel 5 in [Sta06b] verwiesen.<br />
54
6. Fallstudie<br />
Entwickler<br />
Entwickler<br />
Entwickler<br />
Implementierung<br />
erstellen<br />
Dokumentation<br />
erstellen<br />
Visual Studio<br />
Quellcode<br />
Webservice<br />
Word<br />
Servicedokumentation<br />
Quellcode<br />
Website<br />
Web Container<br />
Schnittstelle<br />
erstellen<br />
Serviceschnittstelle<br />
Web Container<br />
Abbildung 6.2.: Entwicklung der eingesetzten Webservices<br />
bei der Überprüfung der Korrektheit <strong>von</strong> Daten ist die vorhandene Website geeignet 2 ,<br />
weil die betrachteten Webservices nur bestehende Funktionalitäten über eine Maschine<br />
zu Maschine Schnittstelle anbieten.<br />
Ursprünglich war geplant Teile des Portals serviceorientiert umzusetzen. Aber die Implementierung<br />
erwies sich als kein Service, weil sie nicht Definition 2.5 entspricht. Eine<br />
Serviceschicht ist mit der Windows Communication Fo<strong>und</strong>ation (WCF) [Micb] umgesetzt,<br />
jedoch wird nie mit einem Service interagiert. Nach Konsequenz 2.3 wird in einer<br />
SOA mit einer bestehenden Instanz interagiert, die Interaktion im vorliegenden Fall<br />
geschah jedoch über ein neu erzeugtes Objekt. Gespräche haben ergeben, dass an<br />
dieser Stelle eine SOA zum jetzigen Zeitpunkt nicht zweckmäßig ist <strong>und</strong> daher auch<br />
kein Service eingesetzt wird. Stattdessen wird mit herkömmlichen objektorientierten<br />
Mitteln ein Facade-Entwurfsmuster [GHJV95] benutzt.<br />
6.1.2. Bisheriges Vorgehen beim <strong>Testen</strong> der Webservices<br />
Vor dieser Arbeit erfolgte die Testdurchführung nicht unter Einsatz einer <strong>Teststrategie</strong>.<br />
Tester prüften die Webservices eher erforschend ohne konkrete Testfälle. Dabei wird<br />
mit einem manuell bereitgestellten Webservice interagiert. Zur Validierung der Daten<br />
diente eine entsprechende Version der Website, die dieselbe Datenbank nutzt.<br />
Wie bereits in Abschnitt 5.2 beschrieben stellt ein in .NET umgesetzter Webservice<br />
eine grafische Benutzerschnittstelle zur Verfügung, so dass ein Tester mit einem Browser<br />
jede Operation des Webservices durch Eingabe der Parameter in Textfeldern auf-<br />
2 Die Korrektheit der Website kann allerdings nicht angenommen werden, so dass bei Abweichungen<br />
sowohl der Webservice als auch die Website zu prüfen sind.<br />
55
6. Fallstudie<br />
rufen kann. Als Ergebnis sieht der Tester ein XML-Dokument, das den Rückgabewert<br />
der Operation darstellt.<br />
Folglich erlaubt .NET das <strong>Testen</strong> eines Webservices auch ohne Einsatz <strong>von</strong> zusätzlichen<br />
Werkzeugen. Dieses Vorgehen sei im Folgenden als manuell bezeichnet, weil<br />
die Eingabedaten <strong>von</strong> einem Tester manuell eingegeben werden <strong>und</strong> auch die Auswertung<br />
der Ergebnisse manuell geschieht. Wird ein Werkzeug für die Interaktion mit dem<br />
Webservice <strong>und</strong> die Auswertung der Ergebnisse eingesetzt, z.B. ein Unit Test Framework<br />
mit den Erweiterungen aus Kapitel 5, so heißt dieses Vorgehen automatisch.<br />
6.2. Eine konkrete <strong>Teststrategie</strong><br />
6.2.1. Annahmen<br />
Die angestrebte <strong>Teststrategie</strong> beginnt bei Komponententests, um die Tests zu vereinfachen<br />
<strong>und</strong> unabhängiger zu machen. Ist ein komplexes System involviert, z.B. eine<br />
Datenbank, das Dateisystem oder andere Services, so sind immer Kopplungen vorhanden,<br />
die das <strong>Testen</strong> erschweren [TH02]. Es ist oftmals aufwändiger eine Datenbank<br />
durch eine „virtuelle“ neue Datenbank zu ersetzen, als die entsprechende Komponente<br />
auszutauschen, die die Datenbank nutzt.<br />
Um praktikabel zu sein, wird angenommen, dass Tests mit einen Unit Test Framework<br />
geschrieben oder manuell durchgeführt werden. Die vorgestellte <strong>Teststrategie</strong><br />
wird Abhängigkeiten zur Idee, Technologie <strong>und</strong> Plattform <strong>von</strong> SOA haben, sowie zum<br />
Projektumfeld. Dabei leiten sich Testaspekte nur aus den genannten drei Ebenen ab,<br />
das Projektumfeld definiert die letztendliche Durchführung der Tests.<br />
Mit dem Microsoft .NET Framework werden Applikationen in einer objektorientierten<br />
Sprache umgesetzt. Demnach sind auch aus der testgetriebenen Entwicklung [Bec03]<br />
bekannte Komponententests einsetzbar. Zur Interaktion mit einem Webservice kommt<br />
vorrangig ein Proxy zum Einsatz, aber auch andere Formen der Interaktion sind möglich<br />
[McC06]. Alle Sichtweisen haben gemeinsam, dass die Rolle eines Servicekonsumenten<br />
eingenommen wird.<br />
6.2.2. Testmatrix <strong>und</strong> Testszenarien<br />
Kapitel 4 hat bereits Testaspekte für die betrachtete Ausprägung beschrieben. Tabelle<br />
6.1 zeigt die für das Unternehmen ausgewählte Zuordnung <strong>von</strong> Testaspekten zur<br />
Serviceumgebung. Lokale <strong>und</strong> lokal/entfernte Serviceumgebungen sehen nur Komponententests<br />
<strong>und</strong> Integrationstests vor. Systemtests werden erst in einer entfernt/test<br />
Serviceumgebung eingesetzt.<br />
56
6. Fallstudie<br />
Nr. lokal lokal/entfernt entfernt/test entfernt/live<br />
1 Funktionalität X<br />
2 Datentransferobjekte X<br />
3 Verifizierung des Deployment X X X<br />
4 Konfigurationen X X<br />
5 Autorisierung <strong>und</strong> Authentifizierung X<br />
6 Fehlendes Subsystem X X<br />
7 Annahmen an Eingabedaten X<br />
8 Versteckte Grenzen X X<br />
9 Rückwärtskompatibilität X X<br />
10 Interoperabilität X<br />
11 Funktionalität X<br />
Tabelle 6.1.: Zuordnung <strong>von</strong> Testaspekten zur Serviceumgebung<br />
Die Testmatrix aus Tabelle 6.1 ist durch doppelte horizontale Linien in Bereiche getrennt.<br />
Jeder Bereich bildet dabei eine Gruppe <strong>von</strong> zum Teil verwandten Tests:<br />
• Nr. 1: Als Geschäftsentscheidung gilt für Projekte, dass Entwickler ihren Code<br />
mit Komponententests zu überprüfen haben. Entsprechend beginnt diese <strong>Teststrategie</strong><br />
mit solchen Tests in einer lokalen Serviceumgebung unter dem Testaspekt<br />
Funktionalität. Dabei handelt es sich um Komponententests, die aus der<br />
objektorientierten Programmierung schon länger bekannt sind.<br />
• Nr. 2-4: Ein Webservice kann nur eingesetzt werden, wenn sich gültige Objekte<br />
übertragen lassen <strong>und</strong> das Deployment funktionstüchtig ist. Folglich sind Verifikationstests<br />
für die Datentransferobjekte, das Deployment <strong>und</strong> alle Konfigurationen<br />
durchzuführen. Dies verhindert, dass spätere Tests aufgr<strong>und</strong> <strong>von</strong> Fehlern,<br />
die ein vorheriger Testaspekt findet, fehlschlagen. Die Automation dieser Tests<br />
erlaubt schnell eine neue Version der Webservices gr<strong>und</strong>legend zu prüfen.<br />
• Nr. 5: Der Testaspekt Sicherheit beschränkt sich auf eine funktionale Überprüfung<br />
der Autorisierung <strong>und</strong> Authentifizierung, weil Kapazitäten im Unternehmen<br />
<strong>und</strong> Projekt begrenzt sind. Jeder Nutzer mit einem Account ist explizit für einen<br />
Webservice freizuschalten <strong>und</strong> erhält ein eigenes Passwort. Die dadurch realisierte<br />
Absicherung ist automatisiert zu prüfen.<br />
• Nr. 6-8: In der Mitte folgen Negativtests durch das Verhalten bei fehlenden Subsystemen<br />
<strong>und</strong> die Überprüfung <strong>von</strong> Eingabedaten. Versteckte Grenzen stellen<br />
einen vereinfachten Integrationstest dar.<br />
57
6. Fallstudie<br />
• Nr. 9-10: Rückwärtskompatibilität <strong>und</strong> Interoperabilität sind spezielle Eigenschaften<br />
in einer SOA.<br />
• Nr. 11: Jeder Webservice bietet Dienste an, die die Servicedokumentation beschreibt<br />
oder eine Spezifikation fordert. Eine Überprüfung gegen diese Dokumente<br />
folgt durch Test der Funktionalität mit Systemsicht.<br />
Einige der in Kapitel 4 vorgestellten Testaspekte sind in der vorgestellten <strong>Teststrategie</strong><br />
bewusst nicht aufgeführt:<br />
• Webservice Standards werden nicht eingesetzt <strong>und</strong> sind daher nicht zu testen.<br />
• Last- <strong>und</strong> Performancetests sind im Rahmen dieser Arbeit nicht betrachtet, weil<br />
sie auf bekannten Methoden basieren <strong>und</strong> keinen Beitrag zu dieser Arbeit leisten.<br />
Ziel bei allen Testaspekten ist mit Komponententests zu arbeiten, um die Tests unabhängiger<br />
zu halten. Tests in der entfernt/test Serviceumgebung sind nicht zwingend zu<br />
automatisieren <strong>und</strong> können manuell erfolgen. Allgemein sei angemerkt, dass die vorgestellte<br />
Testmatrix nur ein Vorschlag ist, aber ein wichtiges Produkt der <strong>Teststrategie</strong><br />
darstellt. Die Testmatrix lässt sich beliebig anpassen, um die <strong>Teststrategie</strong> in verschiedenen<br />
Projekten <strong>und</strong> Unternehmen zu steuern. Allerdings können alle Artefakte der<br />
<strong>Teststrategie</strong> auch in andere Projekte übernommen werden, die die gleiche Ausprägung<br />
einer SOA vorweisen.<br />
Die Abarbeitung der Testaspekte erfolgt in einer Reihenfolge wie in Tabelle 6.1 angegeben<br />
<strong>von</strong> oben nach unten. Die Übergänge sind dabei nicht starr, sondern können<br />
flexibel bei der Testdurchführung gewählt werden. Die Vorbedingungen der Testszenarien<br />
legen fest, wann ein Testaspekt getestet werden kann. Die Reihenfolge der<br />
Testaspekte in der Testmatrix ist nach den folgenden Kriterien bestimmt:<br />
• Während des Projektverlaufs nimmt die Aggressivität beim <strong>Testen</strong> stetig zu. Die<br />
Anordnung der Testaspekte entspricht einem Vorgehen, indem mit bekannten<br />
Komponententests begonnen wird, bevor der Sprung zu einem Service vollzogen<br />
wird. Das <strong>Testen</strong> eines Services beginnt mit Verifikationstests, bevor in der Mitte<br />
der Testmatrix Negativtests folgen. Insbesondere ist es nicht sinnvoll mit umfangreichen<br />
Tests zu beginnen, bevor gr<strong>und</strong>legende Funktionsfähigkeit sichergestellt<br />
ist.<br />
• Die Zuordnung zur Serviceumgebung beginnt bei einer lokalen Serviceumgebung<br />
<strong>und</strong> sieht erst später höhere Serviceumgebungen vor, weil dies einer Zuordnung<br />
zur Teststufe entspricht (niedrige Teststufen sind vor höheren Teststufen<br />
einzusetzen). Die lokale <strong>und</strong> lokal/entfernte Umgebung eignet sich für Komponententests<br />
oder Integrationstests, die entfernt/test Umgebung eignet sich für<br />
Systemtests.<br />
Anhang A ist die Sammlung aller Testszenarien für die entwickelte <strong>Teststrategie</strong>. Die<br />
Testszenarien beziehen sich auf die Testmatrix aus Tabelle 6.1 <strong>und</strong> basieren auf der<br />
Vorlage aus Abschnitt 3.3.3.<br />
58
6. Fallstudie<br />
6.3. Anwendung der <strong>Teststrategie</strong><br />
6.3.1. Umsetzung<br />
Die Umsetzung der in Abschnitt 6.2 vorgestellten <strong>Teststrategie</strong> wird im Folgenden aufgezeigt.<br />
Als Gr<strong>und</strong>lage für die Ableitung <strong>von</strong> Testfällen dienen die in Anhang A gegebenen<br />
Testszenarien. Erzeugt wurden die Testfälle für den in Abschnitt 6.1.1 beschriebenen<br />
Webservice. Die Testautomation <strong>und</strong> alle Komponententests wurden mit dem<br />
in Kapitel 5 vorgestellten Werkzeug umgesetzt.<br />
Komponententests haben die Eigenschaft oftmals White-Box Analysen zur Erzeugung<br />
<strong>von</strong> Testfällen einzusetzen. Zusätzlich werden die Tests abgekoppelt <strong>von</strong> anderen Systemen<br />
durch den Einsatz <strong>von</strong> Mocks. Die Trennung <strong>von</strong> der Datenbank erlaubt nur den<br />
Service an sich zu testen, unabhängig <strong>von</strong> bestimmten Daten, d.h. die Erzeugung <strong>von</strong><br />
Testfällen wird vereinfacht.<br />
Im Folgenden sei jeder Testaspekt der Testmatrix aus Abschnitt 6.2.2 betrachtet:<br />
• Funktionalität (Nr. 1): Fehlende Testbarkeit erlaubte nur rudimentär die Verfassung<br />
<strong>von</strong> herkömmlichen Komponententests. Speziell die Webservice Fassade<br />
<strong>und</strong> die Datenbankanbindung sind nicht direkt testbar aufgr<strong>und</strong> <strong>von</strong> anonymer<br />
Erzeugung <strong>von</strong> Objekten <strong>und</strong> anschließender Benutzung. Auch die Grenzen zwischen<br />
den einzelnen Schichten sind fließend umgesetzt <strong>und</strong> die Einführung <strong>von</strong><br />
Mocks wird erschwert. Die Tests selbst haben noch keinen Bezug zu einer SOA,<br />
so dass nicht weiter auf diese eingegangen wird.<br />
• Datentransferobjekte (Nr. 2): In .NET steht der XML-Serialisierer als Klasse zur<br />
Verfügung <strong>und</strong> ist somit explizit nutzbar. Erzeugt man vollständig aufgelöste Objekte<br />
für die Eingabe <strong>und</strong> Ausgabe, ist durch entsprechende Übergabe der Objekte<br />
an den XML-Serialisierer prüfbar, ob eine Serialisierung bidirektional möglich<br />
ist. Der Test führt diese Übersetzung durch <strong>und</strong> vergleicht das ursprüngliche<br />
mit dem serialisierten Objekt. Die Überprüfung der Datentransferobjekte erfolgt<br />
insgesamt automatisiert.<br />
• Verifizierung des Deployment (Nr. 3): Die betrachteten Webservices sind nur<br />
passiv, indem sie Daten beziehen. In der lokal/entfernt Serviceumgebung wurde<br />
die Datenbank durch einen Mock ersetzt. Verifikationstests in der entfernt/test<br />
<strong>und</strong> entfernt/live Serviceumgebung sind identisch <strong>und</strong> in beiden Serviceumgebungen<br />
einsetzbar, wobei ein Systemtest durchgeführt wird. Testfälle leiten sich<br />
ab über eine Pfadanalyse im Quellcode. Es gilt möglichst viele Pfade durch den<br />
Webservice zu nehmen <strong>und</strong> alle Bibliotheken bzw. Subsysteme anzusprechen.<br />
Alle Tests zur Verifizierung sind automatisiert <strong>und</strong> erlauben schnell festzustellen,<br />
ob sich komplexere Tests am Testobjekt lohnen.<br />
• Konfiguration (Nr. 4): Die zu testenden Webservices setzen Konfigurationen ein,<br />
um das Logging <strong>von</strong> Informationen im Fehlerfall <strong>und</strong> den Datenbankzugriff maßzuschneidern.<br />
Effektiv lässt sich die Korrektheit der Konfiguration für das Logging zunächst in ei-<br />
59
6. Fallstudie<br />
ner lokal/entfernten Serviceumgebung prüfen. Durch die Kombination <strong>von</strong> Mocks<br />
<strong>und</strong> Testdaten wurden Pfade so durch den Webservice gelegt, dass das Logging<br />
angesprochen <strong>und</strong> die Konfiguration vollständig genutzt wird. In der lokal/entfernt<br />
Serviceumgebung hat der Tester vollständige Kontrolle über die Konfiguration<br />
<strong>und</strong> wird diese so anpassen, dass ein automatisierter Test möglich wird.<br />
Gr<strong>und</strong>sätzlich wurde in der lokal/entfernt Serviceumgebung ausschließlich die<br />
Korrektheit der Funktionalität geprüft. In der entfernt/test Serviceumgebung ändert<br />
sich nur das Ausgabeziel des Logging <strong>und</strong> es ist prüfen, ob der Effekt überhaupt<br />
eintritt. In der entfernt/test Serviceumgebung ist dieser Test nur bedingt<br />
automatisierbar, weil kein äußerer Zugriff auf das System möglich ist.<br />
Bei der Überprüfung der Datenbankkonfiguration gilt es in der entfernt/test Serviceumgebung<br />
Pfade durch den Service zu finden, so dass mit den verschiedenen<br />
Datenbanken interagiert wird.<br />
• Autorisierung <strong>und</strong> Authentifizierung (Nr. 5): Mittels automatisierten Tests ist zu<br />
prüfen, ob ein gültiger Benutzer den Webservice nutzen kann <strong>und</strong> auch nur für<br />
ihn ersichtliche Daten erhält. Im Anschluss wurden Negativtests durchgeführt,<br />
um den Webservice anzugreifen.<br />
• Fehlendes Subsystem (Nr. 6): Als einzige Subsysteme wurden Datenbanken eingesetzt.<br />
Ein entsprechender Test verhindert den Zugriff des Webservices auf<br />
die Datenbank <strong>und</strong> ist manuell durchzuführen. Durchgeführt wurde er in einer<br />
lokal/entfernt Serviceumgebung <strong>und</strong> blockieren entsprechenden Netzwerkverkehrs.<br />
• Annahmen an Eingabedaten (Nr. 7): Die Ableitung <strong>von</strong> Testfällen erfordert die<br />
Parameter jeder Operation zu analysieren. Tabelle 6.2 stellt einen Ausschnitt der<br />
durchgeführten Analyse dar.<br />
Webservice Operation Parameter Typ<br />
Annahmen an Eingaben<br />
Explizit<br />
Implizit<br />
Statistik<br />
GibTäglicheDaten<br />
GibNeueDaten<br />
ID Integer > 0<br />
Datum String Konvertierbar zu<br />
Datum,
6. Fallstudie<br />
teilt. Explizite Annahmen sind in Dokumenten festgehalten, implizite Annahmen<br />
ergeben sich aus dem Projektumfeld bzw. dem Parameter heraus <strong>und</strong> wurden<br />
bei der Implementierung <strong>von</strong> den Entwicklern angenommen. Implizite Annahmen<br />
erhält man nur durch White-Box Analysen oder durch Gespräche mit den<br />
Entwicklern.<br />
Die durchgeführte Analyse erlaubt für jeden Parameter, selbst bei komplexen<br />
Objekten, Äquivalenzklassen für ungültige <strong>und</strong> gültige Werte aufzustellen. Anschließend<br />
sind aus den Klassen Repräsentanten auszuwählen, so dass eine<br />
Matrix entsteht, die in einem automatisierten Test eingesetzt wird. Das Unit Test<br />
Framework der Visual Studio Team Edition erlaubt die Realisierung <strong>von</strong> datengetriebenen<br />
Tests [Mica], die direkt erstellte Matrizen nutzen. Es ist nur ein Operationsaufruf<br />
im Test <strong>und</strong> ein Adapter zwischen diesem Aufruf <strong>und</strong> der Matrix zu<br />
schreiben. Neben einer Durchführung dieses Tests für die ungültigen Daten, sind<br />
als Gegenprobe auch ausgewählte gültige Werte zu nutzen.<br />
Im Rahmen der Tests wurden zusätzliche Testpunkte im Logging so konfiguriert,<br />
dass resultierende Fehler durch ungültige Daten sichtbar werden. Dies erlaubt<br />
nicht nur festzustellen welche Eingabedaten ungeprüft verarbeitet werden, sondern<br />
auch welche Konsequenzen entstehen können.<br />
• Versteckte Grenzen (Nr. 8): Zur Ableitung <strong>von</strong> Testfällen ist zunächst eine Analyse<br />
durchzuführen, die Grenzen <strong>und</strong> potentielle Problemfälle identifiziert. Tabelle<br />
6.3 zeigt diese Analyse, wobei Grenzen schon zwischen Schichten angenommen<br />
seien 3 .<br />
Zwischen den einzelnen Grenzen wird über eine ’’-Relation angegeben,<br />
ob sich der Datenraum vergrößert, gleich bleibt oder verkleinert. Jede<br />
Reduktion, repräsentiert durch ’>’, kann zu Problemen bei der Verarbeitung <strong>von</strong><br />
Daten führen. Denn bei einer Zeichenkette werden z.B. nur die ersten x Zeichen<br />
betrachtet, wobei x die durch den Typ festgelegte Länge ist.<br />
Operation<br />
GibAusgaben<br />
Service/DTO Parameter/BO Datenbank/DAO Datenbank/Real<br />
Name Typ Typ Typ Typ<br />
ID Integer = Integer = Integer = Integer<br />
SubID String = String > VarChar(80) < VarChar(4000)<br />
Tabelle 6.3.: Auffinden <strong>von</strong> versteckten Grenzen<br />
In Tabelle 6.3 sind für den Type Testdaten abzuleiten, die mit Zeichenketten arbeiten,<br />
die länger als 80 Zeichen sind. Im Besonderen ist bei den getesteten<br />
Webservices die längste mögliche Zeichenkette durch Einsatz <strong>von</strong> „Wildcards“<br />
81 Zeichen lang <strong>und</strong> führt zu einem Fehler. Im Falle der ID handelt es sich um<br />
3 Zwischen zwei Grenzen kommt es zu Übergängen zwischen verschiedenen Objekten, mit denen in<br />
einer Schicht gearbeitet wird. Konkret sind dies Data Transfer Objects (DTO), Business Objects (BO)<br />
<strong>und</strong> Data Access Objects (DAO).<br />
61
6. Fallstudie<br />
einen 32-Bit Integer, der denselben Wertebereich auf allen Schichten beschreibt<br />
- d.h. es kommt zu keiner Reduktion im Datenraum.<br />
• Rückwärtskompatibilität (Nr. 9): Alle automatisierten Tests, die mit einem Proxy<br />
arbeiten, werden bei diesem Testaspekt erneut eingesetzt. Es gilt einen Proxy<br />
für den aktuellen Service, der im produktiven Einsatz ist, zu erstellen. Dabei ist<br />
der Endpunkt des Proxys so zu ändern, dass er auf den sich in der Entwicklung<br />
befindlichen Webservice zeigt. Wird jeder Test mit diesem Proxy ausgeführt, darf<br />
sich das Verhalten der Tests nicht ändern.<br />
• Interoperabilität (Nr. 10): WS-I Konformität ist mit Werkzeugen <strong>von</strong> [Theb] prüfbar.<br />
Beim Test wurde Java als potentielle Plattform eingesetzt. Im Allgemeinen<br />
sind die vorhandenen Webservices sehr einfach gehalten, so dass umfangreiche<br />
Tests für diesen Testaspekt nicht möglich waren.<br />
• Funktionalität (Nr. 11): Durchführung <strong>von</strong> Tests gegen eine Servicedokumentation,<br />
die für jede Operation die Parameter <strong>und</strong> den Effekt beschreibt. Fehler<br />
betreffen daher entweder die Implementierung oder die Dokumentation.<br />
Geprüft wird z.B. ob die Daten richtige Zeiträume umfassen, vom Service durchgeführte<br />
Berechnungen korrekt sind oder die Effekte durch die Parameter eintreten.<br />
Zur Überprüfung der Korrektheit der Daten kann die bestehende Website<br />
genutzt werden.<br />
6.3.2. Gef<strong>und</strong>ene Fehler<br />
Die in Abschnitt 6.3.1 vorgestellte Umsetzung der <strong>Teststrategie</strong> führte zu Testfällen,<br />
die im Verlauf dieser Arbeit mehrfach ausgeführt wurden. Hierbei sind Fehler sichtbar<br />
geworden, <strong>von</strong> denen eine Auswahl vorgestellt wird. Dabei beschränkt sich die Auswahl<br />
auf Fehler, die einen Beitrag zu dieser Arbeit leisten. Einige Fehler wurden noch<br />
im Rahmen dieser Arbeit <strong>von</strong> den Entwicklern behoben.<br />
Verifikationstests für ein Deployment erlaubten nach jeder Änderung direkt das Deployment<br />
selbst <strong>und</strong> manuelle Bereitstellungen zu verifizieren. Tabelle 6.4 zeigt eine<br />
Auswahl <strong>von</strong> Fehlern, die schon durch diese sehr einfachen Tests gef<strong>und</strong>en wurden.<br />
62
6. Fallstudie<br />
Verifizierung des Deployment<br />
Ein Datentransferobjekt wurde mittels Vererbung erweitert. Die Sichtbarkeit<br />
der neuen Klasse wurde beschränkt, so dass der XML-Serialisierer nicht auf<br />
diese neue Klasse zugreifen konnte. Der Aufruf der zugehörigen Operation<br />
lieferte somit einen Fehler.<br />
Ein durch Vererbung <strong>von</strong> einem Datentransferobjekt eingefügter Adapter<br />
konnte nicht serialisiert werden. Abbildung 6.3 zeigt die entstandene Vererbungshierarchie.<br />
Dem XML-Serialisierer standen nicht alle benötigten Informationen<br />
zur Serialisierung des RecordAdapter zur Verfügung. Zur Lösung<br />
dieses Problems wurde die Struktur geändert.<br />
Zwei Operationen haben nie Werte oder Fehlermeldungen geliefert. Vermutliche<br />
Ursache waren fehlende Zugriffsrechte auf benutzte Datenbanken, weil<br />
dieselben Tests unter Einsatz <strong>von</strong> Mocks für die Datenzugriffsschicht nicht<br />
fehlschlugen.<br />
Tabelle 6.4.: Fehler bei der Verifizierung des Deployment<br />
public Record Load() {<br />
RecordAdapter adapter = new RecordAdapter();<br />
adapter.LoadRecord();<br />
return (Record) adapter;<br />
}<br />
Record<br />
Webservice<br />
RecordAdapter<br />
+Load() : Record<br />
+LoadRecord()<br />
Abbildung 6.3.: Fehler aufgr<strong>und</strong> eines Adapters<br />
Tabelle 6.5 zeigt exemplarisch Fehler, die beim <strong>Testen</strong> der Konfigurationen gef<strong>und</strong>en<br />
wurden. Konfigurations- <strong>und</strong> Verifikationstests haben gezeigt, dass sie sehr gr<strong>und</strong>legende<br />
Eigenschaften in einem Service testen. Schlägt ein Testfall fehl, so ist oftmals<br />
als Konsequenz eine Operation nicht nutzbar. Fehler müssen erst behoben werden,<br />
bevor komplexere Tests durchführbar werden.<br />
Fehlt ein Subsystem, so reagiert der Webservice mit einer unangemessenen, detaillierten<br />
<strong>und</strong> sehr technischen Fehlermeldung. Letztendlich wird direkt die vom System<br />
generierte Ausnahme als Fehlermeldung verschickt. Bei der Analyse <strong>von</strong> versteckten<br />
Grenzen führte der Datenverlust bei zwei Parametern zu fehlerhaftem Verhalten bei<br />
der Selektion <strong>von</strong> Daten. Speziell wurden Zeichenketten abgeschnitten <strong>und</strong> dadurch<br />
falsche Werte ausgewählt.<br />
Durch die Kenntnis <strong>von</strong> Äquivalenzklassen für gültige <strong>und</strong> ungültige Eingaben, ließen<br />
sich Repräsentanten finden, die der Webservice nicht korrekt als ungültig filterte. Diese<br />
63
6. Fallstudie<br />
Konfigurationen<br />
Zum Logging <strong>und</strong> Tracking <strong>von</strong> Ausnahmen wird eine Bibliothek eingesetzt,<br />
die eine Konfiguration voraussetzt. Das XML-Dokument war dabei nicht wohlgeformt,<br />
indem einige Elemente mehrfach als Kind definiert waren.<br />
Es fehlte eine Bibliothek beim Ansprechen des eben erwähnten Loggings in<br />
der entfernt/test Serviceumgebung. Derselbe Test lief in der lokal/entfernt Serviceumgebung<br />
ohne Fehler.<br />
Tabelle 6.5.: Fehler in Konfigurationen<br />
ungültigen Werte wurden intern weiterverarbeitet <strong>und</strong> führten z.B. zu falschen Indizes,<br />
arithmetischen Überläufen oder null-Objekten. Der Einsatz <strong>von</strong> Positivtests als Gegenprobe<br />
bei der Überprüfung <strong>von</strong> Eingabedaten, zeigte Inkonsistenzen gegenüber<br />
der Servicedokumentation auf.<br />
Aus der Servicedokumentation abgeleitete Testfälle zur Überprüfung der Funktionalität<br />
offenbarten fehlerhaftes Verhalten des Services. Auch bei diesen Tests wurden<br />
Inkonsistenzen zwischen Service <strong>und</strong> Servicedokumentation festgestellt.<br />
Bei den Testaspekten Datentransferobjekte, Autorisierung <strong>und</strong> Authentifizierung, Rückwärtskompatibilität<br />
<strong>und</strong> Interoperabilität wurden keine Fehler gef<strong>und</strong>en.<br />
6.4. Lektionen <strong>und</strong> Bewertung<br />
Die Durchführung dieser Fallstudie hat nicht nur Fehler in den Webservices gef<strong>und</strong>en,<br />
sondern auch Probleme bei der Durchführung aufgezeigt. Diese Probleme seien in<br />
unternehmensspezifischen <strong>und</strong> allgemeinen Lektionen dargestellt.<br />
Unternehmensspezifische Lektionen:<br />
• Der Einsatz <strong>von</strong> Mocks zur Ersetzung der Datenbank erleichterte viele Tests.<br />
Eine hohe Abhängigkeit <strong>von</strong> der Datenbank erschwert die Überprüfung der Geschäftslogik,<br />
weil Testdaten geschickt auszuwählen sind. D.h. die Testdaten müssen<br />
die Geschäftslogik wie gewünscht nutzen <strong>und</strong> zur Testautomation über der<br />
Zeit konstant sein.<br />
• Das Verfassen <strong>von</strong> Komponententests muss erlernt werden. Nicht jeder Entwickler<br />
ist sofort in der Lage gute Tests für seinen Code zu schreiben. Insbesondere<br />
das testbare Programmieren erfordert einen anderen Programmierstil, den sich<br />
jeder Entwickler zunächst aneignen muss.<br />
• Den Webservices wird noch nicht soviel Aufmerksamkeit gewidmet wie der Website.<br />
Dennoch setzen K<strong>und</strong>en die Webservices ein <strong>und</strong> müssen sich auf deren<br />
Korrektheit verlassen.<br />
Allgemeine Lektionen:<br />
• Der Einsatz <strong>von</strong> harten Mocks, die Code anhand <strong>von</strong> Methoden tauschen, er-<br />
64
6. Fallstudie<br />
fordert ein gewisses Maß an Testbarkeit. Ist viel Logik in einer Methode ohne<br />
Trennung <strong>und</strong> Zugriff auf andere Komponenten realisiert, so wird der Austausch<br />
<strong>von</strong> Methoden erschwert.<br />
• Fehler, die durch Abarbeitung der Matrix früh gef<strong>und</strong>en werden, zeigen nicht testwürdige<br />
oder testbare Operationen. Insbesondere die Verifizierung des Deployment<br />
stellt dies schnell durch ihren einfachen Charakter fest. Gef<strong>und</strong>ene Fehler<br />
müssen erst behoben werden, bevor weitere Tests möglich sind.<br />
• Die Automatisierung <strong>von</strong> Tests wird schwerer, wenn bestimmte Effekte nur anhand<br />
<strong>von</strong> externen Systemen sichtbar werden. So erzeugt das Logging beispielsweise<br />
direkt Dateien oder E-Mails, so dass anhand derer zu überprüfen ist, ob<br />
eine Information festgehalten wurde.<br />
• Unter Einsatz des Werkzeugs aus Kapitel 5 ist es möglich mit Servicesicht zu<br />
testen, ohne das ein bereitgestellter Service notwendig ist. Im Test ist nur die<br />
Serviceimplementierung notwendig.<br />
• Nicht jeder Tester <strong>und</strong> Entwickler ist mit den Fallstricken einer SOA vertraut.<br />
Durch Testaspekte werden potentielle Probleme offen gelegt, die unter Anwendung<br />
<strong>von</strong> Testmethoden <strong>und</strong> Testszenarien gezielt gesucht werden. Eine <strong>Teststrategie</strong><br />
als definierender Rahmen hilft die Qualität <strong>von</strong> Services allgemein zu<br />
messen.<br />
Die in Abschnitt 6.3.2 beschriebenen Fehler haben die Qualität der Webservices ermittelt.<br />
Diese Informationen können dem Unternehmen helfen die Qualität ihrer Webservices<br />
gezielt zu verbessern. Für zukünftige Projekte steht bereits eine praktikable <strong>Teststrategie</strong><br />
zur Verfügung.<br />
6.5. Zusammenfassung<br />
In diesem Kapitel wurde für die Webservices eines Unternehmens eine <strong>Teststrategie</strong><br />
nach Kapitel 3 unter Bezug auf die Testaspekte aus Kapitel 4 entwickelt.<br />
Die Umsetzung der <strong>Teststrategie</strong> erfolgte unter Einsatz <strong>von</strong> Testszenarien, die im Anhang<br />
A zu finden sind. Für jeden Testaspekt ist die Vorgehensweise beschrieben <strong>und</strong><br />
die Durchführung lehnt sich an das zugehörige Testszenario an. Die Realisierung der<br />
Tests erfolgte größtenteils mit dem in Kapitel 5 vorgestellten Werkzeug.<br />
Im nächsten Kapitel wird kritisch auf diese Arbeit zurückgeblickt. Speziell die Erfahrungen<br />
aus der Fallstudie sind wertvoll, weil alle in dieser Arbeit vorgestellten Verfahren<br />
<strong>und</strong> Konzepte zum Einsatz kamen.<br />
65
7. Kritische Würdigung<br />
In der Fallstudie in Kapitel 6 wurden alle in dieser Arbeit vorgestellten Konzepte <strong>und</strong><br />
Werkzeuge konkret eingesetzt. Dadurch haben sich bestimmte Stärken <strong>und</strong> Schwächen<br />
herauskristallisiert, die in den folgenden Abschnitten gezielt betrachtet werden.<br />
7.1. Kritischer Rückblick auf den Erarbeitungsprozess<br />
Diese Arbeit wurde vor dem Hintergr<strong>und</strong> erstellt dem in Kapitel 6 genannten Unternehmen<br />
eine <strong>Teststrategie</strong> <strong>und</strong> eine mögliche Umsetzung für SOA zu liefern. Die vorgestellten<br />
Ergebnisse sind dennoch allgemein nutzbar <strong>und</strong> insbesondere unter Kenntnis<br />
der Vorgehensweise aus Kapitel 3 an individuelle Gegebenheiten anpassbar.<br />
Die Erarbeitung dieser Arbeit begann durch eine gezielte Analyse des Unternehmens<br />
<strong>und</strong> der zur Verfügung gestellten Services. Dabei haben sich die folgenden Probleme<br />
ergeben:<br />
• Das ursprüngliche für Tests ausgewählte Projekt war nicht serviceorientiert umgesetzt.<br />
Auch wenn alle Klassen notwendige Metainformationen enthielten, fehlte<br />
eine nach Konsequenz 2.4 notwendige Bereitstellung. D.h. die Klassen haben<br />
nie den Übergang zu einem Service vollzogen <strong>und</strong> das Projekt war für diese<br />
Arbeit ungeeignet.<br />
• Die Unterschiede zwischen einem Webservice <strong>und</strong> einer SOA sind nicht jedem<br />
gleichermaßen bekannt. Eine SOA dient zur Strukturierung <strong>von</strong> Lösungen, wobei<br />
ein Webservice eine bestimmte Technologie ist, mit der sich diese Strukturierung<br />
umsetzen lässt.<br />
Services bilden als aktive Einheiten die Wurzel einer SOA <strong>und</strong> sind bei Tests besonders<br />
<strong>von</strong> Interesse.<br />
7.2. Stärken <strong>und</strong> Schwächen einer <strong>Teststrategie</strong><br />
Aus der Trennung zwischen Service <strong>und</strong> Serviceimplementierung folgt, dass ein Service<br />
nur einen definierten Rahmen für umgesetzte Logik zur Verfügung stellt. Es erweist<br />
sich als schwierig festzulegen wo Funktionalität zu testen ist. Betrachtet man nur<br />
die Serviceimplementierung, sind alle für die eingesetzte Plattform bekannten Methoden<br />
<strong>und</strong> Verfahren einsetzbar. Testet man einen Service, so nimmt man die Sichtweise<br />
66
7. Kritische Würdigung<br />
eines Servicekonsumenten ein <strong>und</strong> muss gegen etwas testen, das auch der Servicekonsument<br />
kennt bzw. ihm zur Verfügung steht: die Servicedokumentation.<br />
Die in Kapitel 4 vorgestellten Testaspekte sind nur als Auswahl anzusehen. Besonders<br />
die Ableitung <strong>von</strong> Testaspekten für eine bestimmte Ebene erweist sich als schwierig,<br />
weil oftmals die Ebenen untereinander verwoben sind. Z.B. wird die Trennung zwischen<br />
Webservices <strong>und</strong> SOA schon in der Literatur häufig als fließend angenommen.<br />
Komponententests für Services nach Abschnitt 3.4 weisen die folgende Schwäche<br />
auf:<br />
• Die Realisierung <strong>von</strong> Serviceumgebungen <strong>und</strong> weichen bzw. harten Mocks setzt<br />
Werkzeuge voraus, die nicht immer existieren.<br />
Die Stärken einer <strong>Teststrategie</strong> nach Kapitel 3 sind:<br />
• Im herkömmlichen Sinne testet man mit einem Komponententest eine Komponente<br />
in Isolation. Services bieten Servicekonsumenten die Logik der Serviceimplementierung<br />
an. Durch die verschiedenen Ebenen einer SOA entstehen jedoch<br />
potentielle Probleme, die erst bei Interaktion mit einem Service getestet werden<br />
können.<br />
Mocks in einem Service einzusetzen, erlaubt Tests zu vereinfachen <strong>und</strong> unabhängig<br />
gegenüber Daten zu machen. Automatisierte Tests sind nicht mehr abhängig<br />
<strong>von</strong> der Datenbank <strong>und</strong> es ist nicht mehr nötig nach bzw. vor jedem Testlauf<br />
einen definierten Zustand herzustellen. Als Tester gelingt es mehr Kontrolle<br />
zu erhalten, so dass gezielter <strong>und</strong> einfacher getestet werden kann.<br />
• Durch die Findung <strong>von</strong> Testaspekten werden nur potentielle Probleme gesucht,<br />
die überhaupt auftreten können <strong>und</strong> <strong>von</strong> Interesse sind. Die Testmatrix zur Zuordnung<br />
der Serviceumgebung trifft gezielt eine Auswahl <strong>und</strong> wird zu einem übersichtlichen<br />
<strong>und</strong> wichtigen Produkt.<br />
• Gef<strong>und</strong>ene Testaspekte, die Testmatrix <strong>und</strong> Testszenarien lassen sich in Projekten<br />
mit gleicher Ausprägung wieder verwenden.<br />
7.3. Stärken <strong>und</strong> Schwächen der entwickelten<br />
Erweiterungen<br />
Der Einsatz der entwickelten Erweiterungen zeigte in der Fallstudie die folgenden<br />
Schwächen auf:<br />
• Das Werkzeug ist nicht nur an eine Technologie geb<strong>und</strong>en, sondern auch an<br />
eine Plattform <strong>und</strong> Sprache. Es ist dadurch in allen drei Ebenen abhängig <strong>und</strong><br />
kann nur in diesem beschränkten Rahmen eingesetzt werden.<br />
• Im Werkzeug wird der Build schnell zum Flaschenhals, weil oftmals die Projekte<br />
nicht mehr klein sind <strong>und</strong> die Erzeugung des Deployment lange dauert. Dadurch<br />
wird oftmals eine performante <strong>und</strong> schnelle Ausführung verhindert.<br />
67
7. Kritische Würdigung<br />
• Der Einsatz <strong>von</strong> harten oder weichen Mocks macht jeden Test anfällig dafür,<br />
dass er bei Änderungen im Code nicht mehr funktioniert, weil die Serviceimplementierung<br />
zur Laufzeit modifiziert wird. In den vorgestellten Erweiterungen wird<br />
man nicht zur Kompilierzeit über die Funktionstüchtigkeit des Tests informiert,<br />
sondern erst bei Ausführung des Tests.<br />
• Das eingesetzte Werkzeug bestimmt oftmals, ob die Tests wieder verwendbar<br />
sind, wenn sich die Serviceimplementierung ändert, aber die Serviceschnittstelle<br />
gleich bleibt. Setzt man auf Werkzeuge, die Services immer als abgeschlossene<br />
Einheit betrachten <strong>und</strong> nur mit Serviceschnittstellen arbeiten, so lassen sich unterschiedliche<br />
Implementierungen mit denselben Tests testen. Testfälle, die unter<br />
Einsatz der Erweiterungen erstellt werden, sind abhängig <strong>von</strong> der Serviceimplementierung.<br />
• Bei der Realisierung <strong>von</strong> Komponententests sind die Tests <strong>und</strong> die Applikation<br />
oftmals getrennt. Jede Änderung, die ein Test innerhalb der Applikation vornimmt,<br />
wird <strong>von</strong> außen vollzogen. Der Einsatz der Erweiterungen hingegen ändert<br />
die Applikation, genauer die Serviceimplementierung. Werkzeuge, die bei<br />
der Erstellung <strong>von</strong> Mocks unterstützen, müssen Teil des Services sein <strong>und</strong> sind<br />
daher nicht direkt anwendbar. Im Allgemeinen müssen sehr viele Variablen in einem<br />
Projekt änderbar sein, um z.B. dieselbe Mächtigkeit bei der Erstellung <strong>von</strong><br />
Mocks zu ermöglichen.<br />
• Tests unter Einsatz eines Proxy erlauben nicht mit einer allgemeingültigen Sicht<br />
zu testen. Man verlässt nicht die ursprüngliche Plattform, so dass durch den<br />
Testaspekt Interoperabilität Fehler gesondert zu identifizieren sind.<br />
• Die Messung <strong>von</strong> Testabdeckungen ist nicht möglich, weil das zu verfolgende<br />
Objekt entfernt liegt. Der Test agiert wie ein Servicekonsument <strong>und</strong> hat mitunter<br />
keinen Zugriff auf den eingesetzten Container.<br />
Der Einsatz der Erweiterungen bietet jedoch auch Vorteile, die Stärken:<br />
• Testfälle für Webservices lassen sich einfach mit bekannten Mitteln erstellen.<br />
• Durch die Beschreibung eines Mocks nahe am Testfall selbst, ist sofort ersichtlich,<br />
was genau getestet wird. Die Annotationen weisen jede Methode, die einen<br />
Testfall beschreibt, eindeutig aus.<br />
• Das Werkzeug verringert die Anforderungen an Testbarkeit, indem es durch harte<br />
Mocks das direkte Austauschen <strong>von</strong> Code ermöglicht. Allerdings ist der Einsatz<br />
<strong>von</strong> harten Mocks nur bei Software mit einem Deployment praktisch möglich,<br />
weil sonst alle Informationen schon zu Kompilierzeit vorliegen müssen.<br />
7.4. Kritischer Rückblick auf die Fallstudie<br />
Die in Kapitel 6 konkret vorgestellte <strong>Teststrategie</strong> hat Folgendes aufgezeigt:<br />
• Datentransferobjekte zu verifizieren ist sehr aufwendig, weil alle Objekte vollstän-<br />
68
7. Kritische Würdigung<br />
dig aufzulösen sind. Hier sind nach Möglichkeit Werkzeuge einzusetzen, die automatisiert<br />
eine Überprüfung vornehmen. Letztendlich sind erstellte Tests immer<br />
anzupassen, wenn sich die Parameter einer Operation ändern, so dass Tests für<br />
Datentransferobjekte wenig lohnenswert sind. Nur wenn Änderungen auftreten,<br />
können sie später Fehler finden <strong>und</strong> erfordern Änderungen an den Tests. Der<br />
Einsatz <strong>von</strong> Reflektionen wäre ebenfalls sinnvoll, um die Erzeugung der Objekte<br />
zu automatisieren.<br />
• Auch wenn die Tests für Rückwärtskompatibilität <strong>und</strong> Interoperabilität keine Fehler<br />
gef<strong>und</strong>en haben, wäre es ein Trugschluss diese Testaspekte bei zukünftigen<br />
Tests zu ignorieren. Setzt man z.B. Erweiterungen ein, die zusätzliche Informationen<br />
im SOAP-Header erfordern, kann sich das Verhalten bezüglich der zwei<br />
Testaspekte verändern.<br />
• Das <strong>Testen</strong> <strong>von</strong> Funktionalitäten in einer entfernt/test Umgebung erschwert die<br />
Testautomation. Jeder Test ist abhängig <strong>von</strong> allen Subsystemen, so dass sich<br />
die Ableitung <strong>von</strong> Testdaten als schwierig erweist.<br />
Liegen für ein Testobjekt keine oder nur wenig Artefakte vor, so lässt sich oftmals bei<br />
den Diensten, die ein Service anbietet, kein „Soll“ bestimmen. Es fehlt eine Referenz,<br />
die das Verhalten des Services allgemein beschreibt.<br />
69
8. Verwandte Arbeiten<br />
8.1. Andere Ansätze <strong>und</strong> Werkzeuge<br />
In [Par06] wird eine Vorgehensweise zum <strong>Testen</strong> <strong>von</strong> Webservices vorgestellt, die ein<br />
Verwaltungswerkzeug für Quellcode <strong>und</strong> einen täglichen Build-Prozess voraussetzt.<br />
Während des täglichen Build-Prozess ist ein Webservice automatisch in einer wohl<br />
definierten entfernt/test Umgebung bereitzustellen <strong>und</strong> alle Daten in einen definierten<br />
Zustand zu überführen.<br />
Die Reihenfolge bei der Erstellung <strong>von</strong> Testfällen sieht zunächst Komponententests<br />
mit JUnit vor, bevor der Webservice zu testen ist. Dabei ist funktional jede Operation<br />
zu testen. Im Unterschied zum Verständnis <strong>von</strong> Komponententests in dieser Arbeit,<br />
wird in [Par06] ein Test, der nur eine Operation betrifft als Komponententest bezeichnet.<br />
Werden mehrere Operationen in einem Test genutzt, so wird dies als Szenariotest<br />
bezeichnet. Diese Arbeit betrachtet bei Komponententests einen individuellen Service,<br />
der nur während eines bestimmten Testlaufs mit einer angepassten Serviceimplementierung<br />
existiert. Die Anzahl <strong>von</strong> genutzten Operationen ist dabei unerheblich.<br />
Abbildung 8.1.: In-Container Tests mit Cactus<br />
Cactus [Thea] ist ein Werkzeug, das so genannte In-Container Tests ermöglicht. Dabei<br />
wird eine Enterprise Komponente zusammen mit einem Test in einem Container<br />
bereitgestellt <strong>und</strong> dieser Test wird entfernt über einen Proxy aufgerufen. Ziel ist es<br />
Software so zu testen, dass man erweiterte Funktionalitäten <strong>und</strong> Eigenschaften des<br />
Containers nutzen kann. Abbildung 8.1 stellt die Arbeitweise <strong>von</strong> Cactus dar. Die Num-<br />
70
8. Verwandte Arbeiten<br />
mern geben die Reihenfolge der Aktivitäten bei der Ausführung an. Die Aktivitäten 1,<br />
4 <strong>und</strong> 8 enthalten Methoden zur Initialisierung <strong>und</strong> zum Aufräumen des Tests.<br />
8.2. Testaspekte<br />
Viele Veröffentlichungen beschreiben oftmals die Testaspekte, die es in einer SOA zu<br />
testen gilt. Im Folgenden seien zwei Veröffentlichungen kurz vorgestellt:<br />
• In [YSA05] wird der Testaspekt Sicherheit speziell für Webservices betrachtet.<br />
Dabei werden mögliche Angriffe aus bekannten Angriffszenarien für Webapplikationen<br />
abgeleitet. Besonders durch die Bereitstellung in einem Web Container,<br />
der den Zugriff auf eine Datenbank oder das Dateisystem ermöglicht, sind<br />
Webservices sehr mit Webapplikationen verwandt. So kann auch ein Webservice<br />
anfällig sein gegenüber Cross-site scripting, SQL injections, Buffer overflows,<br />
. . . Auch das SOA-Dreieck ist verw<strong>und</strong>bar, wenn ein Angreifer z.B. gezielt<br />
einen Denial-of-Service Angriff auf das Serviceregister durchführt.<br />
• [App07] gibt eine Übersicht über Testaspekte, die es in einer SOA zu testen gilt.<br />
Unter Anderem werden Rückwärtskompatibilität, Interoperabilität <strong>und</strong> Sicherheit<br />
kurz beschrieben. Die Sammlung <strong>von</strong> Testaspekten aus Kapitel 4 hat diese Veröffentlichung<br />
bereits berücksichtigt.<br />
8.3. <strong>Testen</strong> <strong>von</strong> Kompositionen<br />
Nach Konsequenz 2.1 ist eine Komposition ein Verb<strong>und</strong> <strong>von</strong> Services, d.h. in einer<br />
Serviceimplementierung werden andere Services genutzt. Letztendlich wird eine Komposition<br />
durch einen äußeren Service repräsentiert. Daher ist eine nach Kapitel 3 entwickelte<br />
<strong>Teststrategie</strong> auch bei Kompositionen anwendbar, wobei das Testobjekt der<br />
äußere Service ist.<br />
Bei Einsatz einer Komposition ist die Plattform zu vernachlässigen, weil sie durch die<br />
Technologie vollständig überschattet wird. D.h. alle Werkzeuge arbeiten nur mit der<br />
Technologie ohne Berücksichtigung der Plattform. Abbildung 8.2 illustriert eine verbreitete<br />
Ausprägung einer SOA bei Kompositionen, die Webservices als Technologie<br />
einsetzt.<br />
Im Falle einer Komposition wird ein Service als Komponente vererbt. Die Serviceimplementierung<br />
muss nicht geändert werden, weil andere Services kein Bestandteil der<br />
Serviceimplementierung sind. Für die Technologie Webservices befinden sich einige<br />
Werkzeuge auf dem Markt, mit denen ein Tester Komponententests für Kompositionen<br />
realisieren kann:<br />
• BPELUnit [May06]: Ein Werkzeug, das speziell Komponententests für in BPEL<br />
realisierte Geschäftsprozesse ermöglicht. Webservices können durch Mocks ersetzt<br />
werden, so dass nur der in BPEL realisierte Geschäftsprozess getestet<br />
71
8. Verwandte Arbeiten<br />
Abbildung 8.2.: Eine verbreitete Ausprägung einer SOA bei Kompositionen<br />
wird.<br />
• soapUI [MRHB]: Ein Werkzeug zum <strong>Testen</strong> <strong>von</strong> Webservices, dass die Erstellung<br />
<strong>von</strong> Mocks für Kompositionen ermöglicht.<br />
Alle vorgestellten Werkzeuge haben gemeinsam, dass unter Kenntnis der Serviceschnittstelle<br />
eine Serviceimplementierung erstellt werden kann. Diese neue Serviceimplementierung<br />
wird in einem eigenen Container bereitgestellt <strong>und</strong> steht als Mock zur<br />
Verfügung. Dem äußeren Service ist nur der Endpunkt des Mocks bekannt zu machen.<br />
Im Falle einer Komposition können die Serviceanbieter variieren, d.h. jeder Serviceanbieter<br />
bzw. -entwickler muss die Qualität seiner Services selbst sicherstellen. Für eine<br />
Komposition ist unter Einsatz <strong>von</strong> Mocks zu testen, ob die Einbindung eines Services<br />
erfolgreich ist.<br />
72
9. Zusammenfassung <strong>und</strong> Ausblick<br />
9.1. Rückblick<br />
Services sind die aktiven <strong>und</strong> individuellen Einheiten in einer SOA. Jeder Service bietet<br />
Dienste an, die ein Servicekonsument nutzt. Dabei verlässt sich der Servicekonsument<br />
auf den Service, so dass Tests unabdingbar werden. Speziell das Umfeld in dem<br />
letztendlich ein Service eingesetzt wird, ist nicht immer bekannt.<br />
In dieser Arbeit wird eine <strong>Teststrategie</strong> für eine SOA über drei Artefakte beschrieben:<br />
• Ein Katalog <strong>von</strong> Testaspekten, in dem potentielle Probleme <strong>und</strong> ein Vorgehen<br />
zur Identifikation dieser Probleme beschrieben werden.<br />
• Eine Testmatrix, die Testaspekte einer Serviceumgebung zuordnet.<br />
• Testszenarien, die detailliert das Vorgehen zur Identifikation eines Testaspekts<br />
beschreiben.<br />
Für eine SOA leiten sich nach Abschnitt 3.2.1 Testaspekte aus drei verschiedenen<br />
Ebenen ab: Idee, Technologie <strong>und</strong> Plattform. Die Kenntnis <strong>von</strong> konkreten Testaspekten<br />
erlaubt unter Einbezug des Projektumfelds eine Testmatrix aufzustellen. Abschließend<br />
sieht das in Abschnitt 3.3.2 beschriebene Vorgehen zur Findung einer <strong>Teststrategie</strong> die<br />
Formulierung <strong>von</strong> Testszenarien vor.<br />
Moderne Entwicklungsumgebungen <strong>und</strong> Plattformen für Unternehmensanwendungen<br />
verbergen die Komplexität <strong>von</strong> Webservices bei der Entwicklung. Ein Entwickler schreibt<br />
eine normale Klasse, die gezielt annotiert, direkt als Webservice nutzbar ist. Folglich<br />
sind Kenntnisse in der XML, WSDL, . . . nicht mehr notwendig. Dennoch ist ein Webservice<br />
anfällig gegenüber den in Kapitel 4 genannten Testaspekten, die als verborgene<br />
Fehlerquellen entstehen.<br />
Gilt es eine Serviceimplementierung zu testen, so sind oftmals bekannte Verfahren<br />
<strong>und</strong> Methoden anwendbar. Betrachtet man jedoch einen Service, so versagen viele<br />
Konzepte, weil ein Service durch die Bereitstellung einer Serviceimplementierung entsteht.<br />
Dadurch liegt ein Service entfernt <strong>und</strong> kann während eines Tests nicht mehr<br />
manipuliert werden.<br />
Diese Arbeit hat in Abschnitt 3.4.3 im Rahmen <strong>von</strong> Komponententests ein Vorgehen<br />
beschrieben, dass gezielt eine Serviceimplementierung manipuliert. Durch eine sich<br />
anschließende Bereitstellung entsteht ein einzigartiger Service, so dass gezielt Teile<br />
dieses Service isoliert getestet werden können. In Kapitel 5 wurde ein Werkzeug<br />
vorgestellt, das den Einsatz <strong>von</strong> harten <strong>und</strong> weichen Mocks in einem Webservice ermöglicht.<br />
73
9. Zusammenfassung <strong>und</strong> Ausblick<br />
Abschließend betrachtete diese Arbeit die Webservices eines Unternehmens unter<br />
Anwendung einer zuvor nach Kapitel 3 ermittelten <strong>Teststrategie</strong>. Als Gr<strong>und</strong>lage dienten<br />
die Testaspekte aus Kapitel 4 <strong>und</strong> Testfälle wurden mit dem Werkzeug aus Kapitel 5<br />
formuliert.<br />
9.2. Ausblick<br />
Kapitel 3 stellt das Vorgehen zur Findung einer <strong>Teststrategie</strong> zunächst ausschließlich<br />
für SOA vor. Dennoch sind die Artefakte allgemeingültig einsetzbar, aber auch leicht<br />
anpassbar an individuelle Gegebenheiten, z.B.:<br />
• Die Testmatrix ist auch bei Tests für Webapplikationen einsetzbar.<br />
• Testszenarien können in anderen Applikationen eingesetzt werden, um die Ableitung<br />
<strong>von</strong> Testfällen detailliert zu beschreiben. Dazu ist evtl. die präsentierte<br />
Vorlage aus Abschnitt 3.3.3 individuell anzupassen.<br />
Nach Abschnitt 3.2.1 kann jede Ebene einer SOA verschiedene Ausprägungen aufweisen.<br />
Auch wenn in dieser Arbeit für die Idee <strong>und</strong> Technologie keine Alternativen<br />
angegeben wurden, so kann deren Existenz nicht ausgeschlossen werden. Im Allgemeinen<br />
entsteht durch die Ableitung <strong>von</strong> Testaspekten für verschiedene Ausprägungen<br />
ein Katalog, aus dem man sich bei der Definition einer <strong>Teststrategie</strong> frei bedienen<br />
kann. Neuen Testaspekten sind dabei keine Grenzen gesetzt, denn selbst die Sammlung<br />
aus Kapitel 4 ist nur als Auswahl zu betrachten.<br />
Die Erweiterungen lassen sich vielfältig zur Manipulation eines Deployment erweitern.<br />
Bisher ist es nur möglich Methoden <strong>und</strong> Dateien auszutauschen, aber eine Serviceimplementierung<br />
setzt sich aus sehr viel mehr Einheiten zusammen. Vielleicht gelingt es<br />
sogar den Austausch durch Mocks in die Entwicklungsumgebung zu integrieren, so<br />
dass eine einfachere Verwaltung des Deployment entsteht.<br />
Services erben nach Abschnitt 3.4.2 die Komponente durch die zugr<strong>und</strong>e liegende<br />
Implementierung. In-Container Tests, wie sie Cactus nach Abschnitt 8.1 durchführt<br />
sind auch für Services sinnvoll. Vielmehr aber wäre eine Kombination <strong>von</strong> Ansätzen<br />
interessant:<br />
• Abschnitt 5.6 hat aufgezeigt, dass eine Steuerungseinheit zur Manipulation eines<br />
bestimmten Service praktisch nicht umsetzbar ist. Gelingt es für einen bestimmten<br />
Endpunkt einen Service anzubieten, auf den die Steuereinheit Zugriff hat, so<br />
ist keine Änderung im Quellcode der zugehörigen Serviceimplementierung mehr<br />
nötig. Es muss nur ein spezielles Deployment bestehend aus Steuereinheit <strong>und</strong><br />
Service hergestellt werden.<br />
• Die Manipulation eines Services durch eine Steuereinheit erfolgt durch das Einfügen<br />
<strong>von</strong> Mock-Objekten zur Laufzeit. Dazu ist ähnlich wie bei bekannten Werkzeugen<br />
(siehe z.B. [FMP + ]) eine Fabrik für Mock-Objekte anzubieten.<br />
Der Einsatz einer Steuereinheit ändert nicht die Serviceimplementierung, sondern nur<br />
das Deployment. Dies erlaubt z.B. in .NET oder Java EE den Einsatz <strong>von</strong> Komponen-<br />
74
9. Zusammenfassung <strong>und</strong> Ausblick<br />
tentests, wie sie aus der objektorientierten Programmierung bekannt sind.<br />
9.3. Fazit<br />
Diese Arbeit hat ein Vorgehen aufgezeigt, mit dem sich in jedem Projekt eine <strong>Teststrategie</strong><br />
für eine SOA ermitteln lässt. Die Ergebnisse einer einmaligen Analyse sind<br />
in ähnlichen Projekten wieder verwendbar. Die im Rahmen der Fallstudie vorgeschlagene<br />
<strong>Teststrategie</strong> kann als Gr<strong>und</strong>lage für eine eigene <strong>Teststrategie</strong> dienen. Durch<br />
Kenntnis der eingeführten Begriffe <strong>und</strong> Artefakte ist es möglich eine <strong>Teststrategie</strong> an<br />
die eigenen Bedürfnisse anzupassen.<br />
Diese Arbeit stellt für die Microsoft Visual Studio Team Edition ein vollfunktionsfähiges<br />
Werkzeug zur Verfügung. Ein Tester kann nicht nur einfach Serviceumgebungen realisieren,<br />
sondern erhält auch die Kontrolle über das Deployment eines Services. Dies<br />
erlaubt Teile eines Services isoliert zu testen, so dass die Ableitung <strong>von</strong> Testfällen<br />
erleichtert wird.<br />
Im Rahmen der Fallstudie entstanden automatisierte Testfälle, die dem vorgestellten<br />
Unternehmen helfen, die Qualität ihrer Webservices kontinuierlich zu überwachen. Die<br />
Fallstudie hat gezeigt, dass schon das <strong>Testen</strong> <strong>von</strong> einzelnen Services eine starke Hebelwirkung<br />
hat. Es genügt nicht nur die Serviceimplementierung in einer lokalen Serviceumgebung<br />
zu testen, sondern auch der Übergang zu einem Service muss vollzogen<br />
werden. Dabei hilft das systematische Vorgehen einer <strong>Teststrategie</strong>, die gezielt<br />
nach vorher identifizierten Problemen sucht.<br />
Diese Arbeit schafft eine allgemeine Gr<strong>und</strong>lage zum <strong>Testen</strong> in einer SOA. Durch die<br />
Kenntnis der beschriebenen Konzepte, können alle Produkte dieser Arbeit in beliebigen<br />
Projekten praktisch eingesetzt werden.<br />
75
Literaturverzeichnis<br />
[ACD + 03] ANDREWS, Tony ; CURBERA, Francisco ; DHOLAKIA, Hitesh ; GOLAND,<br />
Yaron ; KLEIN, Johannes ; LEYMANN, Frank ; LIU, Kevin ; ROLLER, Dieter<br />
; SMITH, Doug ; THATTE, Satish ; TRICKOVIC, Ivana ; WEERAWA-<br />
RANA, Sanjiva: Business Process Execution Language for Web Services<br />
Version 1.1. http://www.ibm.com/developerworks/library/<br />
specification/ws-bpel. Version: May 2003<br />
[App07] APPLABS: Approach to Testing SOA Applications. Mai 2007<br />
[Bac99] BACH, James: Test Automation Snake Oil. 1999<br />
[Bec00]<br />
BECK, Kent: Extreme Programming Explained: Embrace Change. Addison-<br />
Wesley, 2000<br />
[Bec03] BECK, Kent: Test-driven Development: By Example. Addison Wesley, 2003<br />
[BG98]<br />
BECK, Kent ; GAMMA, Erich: Test infected: Programmers love writing tests.<br />
In: Java Report 3(7) (1998), S. 51–56<br />
[Boe79] BOEHM, B. W.: Guidelines for Verifying and Validating Software Requirements<br />
and Design Specifications. In: SAMET, P. A. (Hrsg.): Euro IFIP 79,<br />
North Holland, 1979, S. 711–719<br />
[Bur03] BURNSTEIN, Ilene: Practical Software Testing: A Process-Oriented Approach.<br />
Springer, 2003<br />
[CP06]<br />
[FMP + ]<br />
CANFORA, Gerardo ; PENTA, Massimiliano D.: Testing Services and Service-<br />
Centric Systems: Challenges and Opportunities. In: IT Pro March/April<br />
(2006), S. 10–17<br />
FREEMAN, Steve ; MACKINNON, Tim ; PRYCE, Nat ; TALEVI, Mauro ; WAL-<br />
NES, Joe: jMock. http://www.jmock.org<br />
[GHJV95] GAMMA, Erich ; HELM, Richard ; JOHNSON, Ralph ; VLISSIDES, John:<br />
Design Patterns: elements of reusable object-oriented software. Addison-<br />
Wesley, 1995<br />
[Goo06]<br />
[GP06]<br />
GOODLIFFE, Pete: Code Craft: The Practice of Writing Excellent Code. No<br />
Starch Press, 2006<br />
GUCKENHEIMER, Sam ; PEREZ, Juan J.: Software Engineering with Microsoft<br />
Visual Studio Team System. Addison-Wesley, 2006<br />
[Ham04] HAMILL, Paul: Unit Test Frameworks. O’Reilly Media, Inc, 2004<br />
[HS05]<br />
HUHNS, Michael ; SINGH, Munindar P.: Service-Oriented Computing: Key<br />
76
Literaturverzeichnis<br />
[IEE90]<br />
Concepts and Principles.<br />
(2005), S. 75–81<br />
In: IEEE Internet Computing January/February<br />
IEEE COMPUTER SOCIETY: IEEE Std 610.12-1990 - IEEE Standard Glossary<br />
of Software Engineering Terminology. IEEE Computer Society, 1990<br />
[IEE04] IEEE COMPUTER SOCIETY: Guide to the Software Engineering Body of<br />
Knowledge. Angela Burgess, 2004<br />
[imb] IMBUS AG: Testing Glossary. http://www.imbus.de/glossary/<br />
glossary.pl?show_Deutsch&sort=Deutsch<br />
[JBC + 07] JENDROCK, Eric ; BALL, Jennifer ; CARSON, Debbie ; EVANS, Ian ;<br />
FORDIN, Scott ; HAASE, Kim: The Java EE 5 Tutorial. Addison-<br />
Wesley, 2007 http://java.sun.com/javaee/5/docs/tutorial/<br />
doc/JavaEETutorial.pdf<br />
[KBL06]<br />
KIFER, Michael ; BERNSTEIN, Arthur ; LEWIS, Philip M.: Database Systems:<br />
An Application Oriented Approach (Complete Version). Second. Addison<br />
Wesley, 2006<br />
[KBP02] KANER, Cem ; BACH, James ; PETTICHORD, Bret: Lessons learned in software<br />
testing: a context-driven approach. John Wiley & Sons, 2002<br />
[May06]<br />
MAYER, Philip: Design and Implementation of a Framework for Testing BPEL<br />
Compositions, Leibniz Universität Hannover, Masterarbeit, 2006<br />
[McC06] MCCAFFREY, James D.: .NET Test Automation Recipes: A Problem-Solution<br />
Approach. Apress, 2006<br />
[MFC01] MACKINNON, Tim ; FREEMAN, Steve ; CRAIG, Philip: Endo-Testing: Unit<br />
Testing with Mock Objects. In: Extreme programming examined, Addison-<br />
Wesley Longman Publishing Co., Inc., 2001, 287-301<br />
[Mica]<br />
[Micb]<br />
[MRHB]<br />
MICROSOFT CORPORATION: Overview of Data-Driven Unit Tests. http:<br />
//msdn2.microsoft.com/library/ms182519.aspx<br />
MICROSOFT CORPORATION: Windows Communication Fo<strong>und</strong>ation. http:<br />
//msdn2.microsoft.com/netframework/aa663324.aspx<br />
MATZURA, Ole ; REIMERTZ, Niclas ; HOIDAHL, Lars ; BREDING, Emil: soapUI.<br />
http://www.soapui.org/<br />
[MTSM03] MCGOVERN, James ; TYAGI, Sameer ; STEVENS, Michael ; MATHEW, Sunil:<br />
Java Web Services Architecture. Morgan Kaufmann, 2003<br />
[OAS06] OASIS OPEN: Reference Model for Service Oriented Architecture 1.0. 2006<br />
[Pap03]<br />
[Par]<br />
PAPAZOGLOU, Mike P.: Service-Oriented Computing: Concepts, Characteristics<br />
and Directions. In: WISE ’03: Proceedings of the Fourth International<br />
Conference on Web Information Systems Engineering, IEEE Computer Society,<br />
2003, S. 3<br />
PARASOFT CORPORATION: SOAtest. http://www.parasoft.com<br />
77
Literaturverzeichnis<br />
[Par06] PARASOFT CORPORATION: Bulletproofing Web Services. http://www.<br />
parasoft.com/jsp/printables/BulletproofingWebServices.<br />
pdf. Version: 2006<br />
[Sko06] SKONNARD, Aaron: Service Station: Web Service Software Factory. In:<br />
MSDN Magazine December (2006)<br />
[SLS06]<br />
SPILLNER, Andreas ; LINZ, Tilo ; SCHAEFER, Hans: Software Testing Fo<strong>und</strong>ations<br />
- A Study Guide for the Certified Tester Exam. dpunkt.verlag GmbH,<br />
2006<br />
[Sta06a] STAL, Michael: Using Architectural Patterns and Blueprints for Service-<br />
Oriented Architecture. In: IEEE Software 23 (2006), Nr. 2, S. 54–61<br />
[Sta06b] STAPEL, Kai: Informationsflussoptimierung eines Softwareentwicklungsprozesses<br />
aus der Bankenbranche, Leibniz Universität Hannover, Masterarbeit,<br />
2006<br />
[Tam02] TAMRES, Louise: Introducing Software Testing. Addison-Wesley, 2002<br />
[TH02] THOMAS, Dave ; HUNT, Andy: Mock Objects. In: IEEE Software 19 (2002),<br />
Nr. 3, S. 22–24<br />
[Thea] THE APACHE SOFTWARE FOUNDATION: Cactus. http://jakarta.<br />
apache.org/cactus/<br />
[Theb] THE WEB SERVICES-INTEROPERABILITY ORGANIZATION: Interoperability<br />
Testing Tools 1.1. http://www.ws-i.org/deliverables/<br />
workinggroup.aspx?wg=testingtools<br />
[The06] THE WEB SERVICES-INTEROPERABILITY ORGANIZATION: Basic Profile<br />
Version 1.1. http://www.ws-i.org/Profiles/BasicProfile-1.1.<br />
html. Version: 10 2006<br />
[Typ]<br />
[W3C]<br />
TYPEMOCK LTD.: TypeMock.NET. http://www.typemock.com<br />
W3C: Extensible Markup Language (XML). http://www.w3.org/XML/<br />
[W3C04] W3C: Web Services Architecture. http://www.w3.org/TR/ws-arch/.<br />
Version: 2004<br />
[W3C07] W3C: Web Services Description Language (WSDL) Version 2.0 Part 1: Core<br />
Language. http://www.w3.org/TR/wsdl20. Version: 2007<br />
[WSU]<br />
WSUNIT: WSUnit. https://wsunit.dev.java.net/<br />
[Yan03] YANG, Jian: Web Service Componentization. In: Commun. ACM 46 (2003),<br />
Nr. 10, S. 35–40<br />
[YSA05] YU, Weider D. ; SUPTHAWEESUK, Passarawarin ; ARAVIND, Dhanya: Trustworthy<br />
Web Services Based on Testing. In: SOSE ’05: Proceedings of the<br />
IEEE International Workshop, IEEE Computer Society, 2005, S. 167–177<br />
78
A. Testszenarien<br />
1 / Testaspekt Funktionalität<br />
Tester<br />
Serviceumgebung<br />
Abdeckung<br />
Risiken<br />
Vorbedingungen<br />
Durchführung<br />
Mocks<br />
Aktivitäten<br />
Entwickler<br />
lokal<br />
Einsatz <strong>von</strong> bekannten Methoden <strong>und</strong> Werkzeugen zur<br />
Durchführung <strong>von</strong> Komponententests bei objektorientierter<br />
Software. Für weitere Informationen sei z.B. auf [Bec03]<br />
oder [McC06] verwiesen.<br />
Der Webservice zeigt unerwartetes Verhalten aufgr<strong>und</strong> einer<br />
fehlerhaften oder unvollständigen Implementierung. Wenn<br />
sich der Code ändert, z.B. durch Einfügen einer neuen Funktionalität,<br />
können Fehler versteckt bleiben.<br />
Die Serviceimplementierung ist vorhanden <strong>und</strong> testbar.<br />
Automatisiert<br />
Mocks sind so einzusetzen, dass ein Teil der Serviceimplementierung<br />
einzeln <strong>und</strong> isoliert getestet wird.<br />
1. <strong>Testen</strong> der funktionalen Korrektheit <strong>und</strong> Vollständigkeit<br />
der zu testenden Komponente.<br />
2. <strong>Testen</strong> <strong>von</strong> angemessener Fehlerbehandlung.<br />
Erfolgsbedingungen<br />
Fehlschlagbedingungen<br />
Ein erwarteter Effekt tritt ein.<br />
• Ein erwarteter Effekt bleibt aus.<br />
• Eine unerwartete Fehlermeldung tritt auf.<br />
79
A. Testszenarien<br />
2 / Testaspekt Datentransferobjekte<br />
Tester<br />
Serviceumgebung<br />
Abdeckung<br />
Entwickler<br />
lokal<br />
Gr<strong>und</strong>legende Prüfung der WSDL, um<br />
• zirkuläre Abhängigkeiten<br />
• nicht unterstützte XML Abbildungen<br />
zu identifizieren.<br />
Risiken<br />
Vorbedingungen<br />
Durchführung<br />
Mocks<br />
Aktivitäten<br />
Der Webservice ist bei Verwendung bestimmter Eingabeoder<br />
Ausgabedaten nicht nutzbar. Zirkuläre Abhängigkeiten<br />
können verborgen sein.<br />
Eine Webservice Operation benutzt komplexe Datentypen,<br />
d.h. es werden nicht nur primitive Datentypen eingesetzt. Betrifft<br />
Eingabe- <strong>und</strong> Ausgabedaten.<br />
Automatisiert<br />
keine<br />
1. Erstellen <strong>von</strong> vollständig aufgelösten Datentransferobjekten,<br />
d.h. komplexe Objekte sind nicht null.<br />
2. Durchführen einer XML-Serialisierung zur Erzeugung<br />
einer entsprechenden XML-Repräsentation.<br />
3. Deserialiserung der XML-Repräsentation aus Schritt<br />
2 zur Erzeugung eines mehrfach umgewandelten Objekts.<br />
Erfolgsbedingungen<br />
• Es wird keine Ausnahme erzeugt.<br />
• Das ursprüngliche <strong>und</strong> mehrfach umgewandelte Objekt<br />
sind identisch.<br />
Fehlschlagbedingungen<br />
• Eine Ausnahme wird geworfen.<br />
• Das ursprüngliche <strong>und</strong> mehrfach umgewandelte Objekt<br />
sind unterschiedlich.<br />
80
A. Testszenarien<br />
3a / Testaspekt<br />
Tester<br />
Serviceumgebung<br />
Abdeckung<br />
Risiken<br />
Vorbedingungen<br />
Verifizierung des Deployment<br />
Entwickler<br />
lokal/entfernt<br />
Überprüft die Existenz <strong>von</strong> gr<strong>und</strong>legenden Funktionalitäten,<br />
die ein Service anbietet.<br />
Der Service ist nicht nutzbar.<br />
• Eine Serviceimplementierung ist vorhanden.<br />
• Interne Testpunkte sind vorhanden <strong>und</strong> erlauben auftretende<br />
Fehler gezielt zu verfolgen.<br />
Durchführung<br />
Mocks<br />
Aktivitäten<br />
Automatisiert<br />
Die Datenzugriffsschicht.<br />
1. Interaktion mit dem Service, so dass möglichst viele Interaktionsmöglichkeiten<br />
ausgenutzt werden. So ist z.B.<br />
für Webservices jede Operation mindestens einmal anzusprechen.<br />
Erfolgsbedingungen<br />
Fehlschlagbedingungen<br />
Der Service erzeugt den erwarteten Effekt.<br />
• Der Service liefert eine Fehlermeldung.<br />
• Ein interner Testpunkt wirft eine Fehlermeldung.<br />
81
A. Testszenarien<br />
3b / Testaspekt<br />
Tester<br />
Serviceumgebung<br />
Abdeckung<br />
Risiken<br />
Vorbedingungen<br />
Verifizierung des Deployment<br />
Entwickler<br />
entfernt/test<br />
Überprüft die Existenz <strong>von</strong> gr<strong>und</strong>legenden Funktionalitäten,<br />
die ein Service anbietet.<br />
Der Service ist nicht nutzbar.<br />
• Der Service wurde bereitgestellt.<br />
• Interne Testpunkte sind vorhanden <strong>und</strong> erlauben auftretende<br />
Fehler gezielt zu verfolgen.<br />
Durchführung<br />
Mocks<br />
Aktivitäten<br />
Automatisiert<br />
keine<br />
1. Interaktion mit dem Service, so dass alle Subsysteme,<br />
die der Service nutzt, angesprochen werden.<br />
Erfolgsbedingungen<br />
Fehlschlagbedingungen<br />
Der Service erzeugt den erwarteten Effekt.<br />
• Der Service liefert eine Fehlermeldung.<br />
• Ein interner Testpunkt wirft eine Fehlermeldung.<br />
82
A. Testszenarien<br />
3c / Testaspekt<br />
Tester<br />
Serviceumgebung<br />
Abdeckung<br />
Risiken<br />
Vorbedingungen<br />
Durchführung<br />
Mocks<br />
Aktivitäten<br />
Verifizierung des Deployment<br />
Entwickler<br />
entfernt/live<br />
Überprüft die Existenz <strong>von</strong> gr<strong>und</strong>legenden Funktionalitäten,<br />
die ein Service anbietet.<br />
Der Service ist nicht nutzbar.<br />
Der Service wurde mit einer endgültigen Konfiguration in einer<br />
produktiven Serivceumgebung bereitgestellt.<br />
Automatisiert<br />
keine<br />
1. Defensive Interaktion mit dem Service, d.h. der innere<br />
Zustand des Service oder <strong>von</strong> anderen beteiligten<br />
Systemen darf sich nicht ändern. Dennoch sollte die<br />
Interaktion so viele Subsysteme wie möglich ansprechen.<br />
Erfolgsbedingungen<br />
Fehlschlagbedingungen<br />
Der Service erzeugt den erwarteten Effekt.<br />
Der Service liefert eine Fehlermeldung.<br />
83
A. Testszenarien<br />
4a / Testaspekt<br />
Tester<br />
Serviceumgebung<br />
Abdeckung<br />
Konfigurationen<br />
Entwickler<br />
lokal/entfernt, entfernt/test<br />
Überprüft die Korrektheit <strong>von</strong> allen in einem Service genutzten<br />
Konfiguration. Im Allgemeinen benötigen z.B. die folgenden<br />
Einheiten eine gültige Konfiguration:<br />
• der Container<br />
• Ressourcen, die in der Datenzugriffsschicht genutzt<br />
werden<br />
• eingesetzte Bibliotheken<br />
Risiken<br />
Vorbedingungen<br />
Der Service ist nicht nutzbar.<br />
• Die Konfiguration einer Einheit ist verfügbar.<br />
• Interne Testpunkte sind vorhanden <strong>und</strong> erlauben auftretende<br />
Fehler gezielt zu verfolgen.<br />
Durchführung<br />
Mocks<br />
Aktivitäten<br />
Automatisiert<br />
Nicht benötigte Ressourcen.<br />
1. Interaktion mit dem Service, so dass eine Einheit genutzt<br />
wird.<br />
Erfolgsbedingungen<br />
Fehlschlagbedingungen<br />
Der Effekt der Einheit tritt ein.<br />
• Der Service liefert eine Fehlermeldung.<br />
• Ein interner Testpunkt wirft eine Fehlermeldung.<br />
84
A. Testszenarien<br />
4b / Testaspekt<br />
Tester<br />
Serviceumgebung<br />
Abdeckung<br />
Risiken<br />
Vorbedingungen<br />
Konfigurationen<br />
Entwickler<br />
lokal/entfernt, entfernt/test<br />
Ein Service wird mit unterschiedlichen Konfigurationen in<br />
sehr unterschiedlichen Umgebungen eingesetzt.<br />
Der Service ist nicht nutzbar.<br />
• Alle neuen Umgebungen sind verfügbar.<br />
• Die Konfiguration für jede neue Umgebung ist verfügbar.<br />
• Interne Testpunkte sind vorhanden <strong>und</strong> erlauben auftretende<br />
Fehler gezielt zu verfolgen.<br />
Durchführung<br />
Mocks<br />
Aktivitäten<br />
Automatisiert<br />
Nicht benötigte Ressourcen.<br />
1. Interaktion mit dem Service, so dass eine Konfiguration<br />
verarbeitet wird.<br />
Erfolgsbedingungen<br />
Fehlschlagbedingungen<br />
Der Service erzeugt einen erwarteten Effekt.<br />
• Der Service liefert eine Fehlermeldung.<br />
• Ein interner Testpunkt wirft eine Fehlermeldung.<br />
85
A. Testszenarien<br />
5a / Testaspekt<br />
Tester<br />
Serviceumgebung<br />
Abdeckung<br />
Risiken<br />
Vorbedingungen<br />
Autorisierung <strong>und</strong> Authentifizierung<br />
Entwickler, Tester<br />
lokal/entfernt<br />
Überprüft, ob nur berechtigte Nutzer mit einem Service interagieren<br />
können.<br />
Services können mit vertraulichen Daten arbeiten oder lösen<br />
Effekte in der realen Welt aus. Daher sind Services vor<br />
unberechtigten Zugriffen zu schützen.<br />
• Der Service ist öffentlich zugänglich, aber die Interaktion<br />
mit dem Service soll nur einem beschränkten Nutzerkreis<br />
möglich sein.<br />
• Interne Testpunkte sind vorhanden <strong>und</strong> erlauben auftretende<br />
Fehler gezielt zu verfolgen.<br />
Durchführung<br />
Mocks<br />
Aktivitäten<br />
Automatisiert<br />
Die Geschäftslogikschicht <strong>und</strong>/oder Datenzugriffsschicht.<br />
1. Aufrufen einer Operation ohne Übermittlung <strong>von</strong> Daten<br />
zur Authentifizierung.<br />
2. Aufrufen einer Operation mit verschiedenen ungültigen<br />
Daten zur Authentifizierung.<br />
Erfolgsbedingungen<br />
Fehlschlagbedingungen<br />
Der Service liefert eine Fehlermeldung.<br />
• Der Service verarbeitet die Anfrage <strong>und</strong> erzeugt einen<br />
Effekt.<br />
• Ein interner Testpunkt wirft eine Fehlermeldung.<br />
86
A. Testszenarien<br />
5b / Testaspekt<br />
Tester<br />
Serviceumgebung<br />
Abdeckung<br />
Risiken<br />
Vorbedingungen<br />
Autorisierung <strong>und</strong> Authentifizierung<br />
Entwickler, Tester<br />
lokal/entfernt<br />
Eine Authentifizierung prüft, ob ein Benutzer die Erlaubnis<br />
hat mit einem Service überhaupt zu interagieren. Eine Autorisierung<br />
überprüft, ob ein Benutzer die Rechte hat angeforderte<br />
Dienste in Anspruch zu nehmen.<br />
Einem authentifizierten Benutzer ist nicht immer erlaubt alle<br />
Aktionen auszuführen, die durch einen Service angeboten<br />
werden.<br />
• Der Service ist öffentlich zugänglich <strong>und</strong> seine Dienste<br />
sollen nur einem beschränkten Nutzerkreis zur Verfügung<br />
stehen.<br />
• Interne Testpunkte sind vorhanden <strong>und</strong> erlauben auftretende<br />
Fehler gezielt zu verfolgen.<br />
Durchführung<br />
Mocks<br />
Aktivitäten<br />
Automatisiert<br />
Die Geschäftslogikschicht <strong>und</strong>/oder Datenzugriffsschicht.<br />
1. Interaktion mit dem Service unter Angabe <strong>von</strong> gültigen<br />
Daten zur Authentifizierung, aber mit dem Versuch<br />
auf Dienste zuzugreifen, für die entsprechende Rechte<br />
fehlen.<br />
Erfolgsbedingungen<br />
• Der Service liefert eine Fehlermeldung.<br />
• Der Service erzeugt keinen Effekt.<br />
Fehlschlagbedingungen<br />
• Der Service verarbeitet die Anfrage <strong>und</strong> erzeugt einen<br />
Effekt.<br />
• Ein interner Testpunkt wirft eine Fehlermeldung.<br />
87
A. Testszenarien<br />
6 / Testaspekt Fehlendes Subsystem<br />
Tester<br />
Serviceumgebung<br />
Abdeckung<br />
Risiken<br />
Vorbedingungen<br />
Durchführung<br />
Mocks<br />
Aktivitäten<br />
Entwickler<br />
lokal/entfernt oder entfernt/test<br />
Das Verhalten des Services, wenn ein Subsystem nicht verfügbar<br />
ist.<br />
Der Service ist nicht nutzbar.<br />
Ein Subsystem ist nicht verfügbar.<br />
Manuell<br />
keine<br />
1. Interaktion mit dem Service, so dass das nicht verfügbare<br />
Subsystem angesprochen wird.<br />
Erfolgsbedingungen<br />
• Der Service sucht nach Alternativen oder wirft eine angemessene<br />
Fehlermeldung.<br />
• Die Abwesenheit des Subsystems wird festgehalten<br />
<strong>und</strong> eine zuständige Person informiert.<br />
Fehlschlagbedingungen<br />
• Der Service stellt das fehlende Subsystem nicht fest,<br />
so dass ein unerwarteter Effekt entsteht.<br />
• Der Service wirft eine unangemessene Fehlermeldung.<br />
88
A. Testszenarien<br />
7a / Testaspekt<br />
Tester<br />
Serviceumgebung<br />
Abdeckung<br />
Risiken<br />
Vorbedingungen<br />
Annahmen an Eingabedaten<br />
Entwickler, Tester<br />
lokal/entfernt<br />
Jeder Service muss alle Eingabedaten auf Gültigkeit überprüfen<br />
<strong>und</strong> Fehler durch eine Meldung anzeigen. Eingabedaten<br />
werden sowohl <strong>von</strong> Servicekonsumenten, als auch <strong>von</strong><br />
anderen Services, bezogen.<br />
Ungültige Eingabedaten gefährden die Integrität des Services,<br />
indem es z.B. zu langen Verarbeitungszeiten, Angriffen<br />
oder allgemein unberechenbarem Verhalten kommt.<br />
• Eine Serviceimplementierung liegt vor.<br />
• Interne Testpunkte sind vorhanden <strong>und</strong> erlauben auftretende<br />
Fehler gezielt zu verfolgen.<br />
Durchführung<br />
Mocks<br />
Aktivitäten<br />
Automatisiert<br />
Die Geschäftslogikschicht. Wenn ein Test fehlschlägt, ist dieser<br />
Test erneut ohne Mocks durchzuführen <strong>und</strong> das Verhalten<br />
zu beobachten.<br />
1. Identifikation aller Annahmen an Eingabedaten.<br />
2. Auswahl <strong>von</strong> Repräsentanten für ungültige Eingabedaten.<br />
3. Interaktion mit dem Service mit ausgewählten Repräsentanten.<br />
4. Andere Services sind so durch Mocks zu ersetzen,<br />
dass sie ausgewählte Repräsentanten liefern.<br />
Erfolgsbedingungen<br />
Fehlschlagbedingungen<br />
Der Service liefert eine Fehlermeldung, die angibt, dass zur<br />
Verfügung gestellte Eingabedaten nicht verarbeitet werden<br />
können.<br />
• Der Service arbeitet ohne Fehlermeldung weiter <strong>und</strong><br />
erzeugt einen Effekt.<br />
• Der Service liefert eine unerwartete Fehlermeldung.<br />
• Ein interner Testpunkt wirft eine Fehlermeldung.<br />
89
A. Testszenarien<br />
7b / Testaspekt<br />
Tester<br />
Serviceumgebung<br />
Abdeckung<br />
Risiken<br />
Vorbedingungen<br />
Annahmen an Eingabedaten<br />
Entwickler, Tester<br />
lokal/entfernt<br />
Gegenprobe zu Testszenario 7a unter Verwendung <strong>von</strong> gültigen<br />
Eingabedaten.<br />
Dokumente <strong>und</strong> andere Quellen, die zur Analyse <strong>von</strong> Annahmen<br />
an Eingabedaten in Testszenario 7a genutzt wurden,<br />
können fehlerhaft sein.<br />
• Eine Serviceimplementierung liegt vor.<br />
• Interne Testpunkte sind vorhanden <strong>und</strong> erlauben auftretende<br />
Fehler gezielt zu verfolgen.<br />
• Testszenario 7a wurde durchgeführt <strong>und</strong> die Ergebnisse<br />
der anfänglichen Analyse sind noch verfügbar.<br />
Durchführung<br />
Mocks<br />
Aktivitäten<br />
Automatisiert<br />
Die Geschäftslogikschicht.<br />
1. Interaktion mit dem Service mit gültigen Eingabedaten.<br />
2. Andere Services sind so durch Mocks zu ersetzen,<br />
dass sie gültige Eingabedaten liefern.<br />
Erfolgsbedingungen<br />
Fehlschlagbedingungen<br />
Der Service erzeugt einen erwarteten Effekt.<br />
• Der Service liefert eine Fehlermeldung.<br />
• Ein interner Testpunkt wirft eine Fehlermeldung.<br />
90
A. Testszenarien<br />
8 / Testaspekt Versteckte Grenzen<br />
Tester<br />
Serviceumgebung<br />
Abdeckung<br />
Risiken<br />
Vorbedingungen<br />
Entwickler, Tester<br />
lokal/entfernt, entfernt/test<br />
Durch den Einsatz einer Schichtenarchitektur oder dem Nutzen<br />
<strong>von</strong> Subsystemen entstehen Grenzen, an denen unterschiedliche<br />
Datentypen <strong>und</strong> Annahmen an die Daten zu Fehlern<br />
führen können. Probleme sind versteckt <strong>und</strong> schwierig<br />
zu identifizieren.<br />
Der Service kann intern mit ungültigen Werten arbeiten.<br />
• Eine Serviceimplementierung liegt vor.<br />
• Falls erforderlich, ist der Service in einer entfernt/test<br />
Serviceumgebung bereitzustellen.<br />
Durchführung<br />
Mocks<br />
Aktivitäten<br />
Manuell<br />
keine<br />
1. Identifikation <strong>von</strong> Grenzen zwischen allen Schichten<br />
<strong>und</strong> Ressourcen, d.h. die Grenzen selbst <strong>und</strong> alle ausgetauschten<br />
Objekte sind bekannt.<br />
2. Für jedes Objekt, das über eine Grenze ausgetauscht<br />
wird, ist der Datentyp bzw. aufgespannte Datenraum<br />
zu bestimmen.<br />
3. Reduktionen im Datenraum identifizieren.<br />
4. Falls erforderlich sind Daten so in den Service einzupflegen,<br />
dass eine potentielle Reduktion im Datenraum<br />
entsteht.<br />
5. Interaktion mit dem Service, so dass potentiell reduzierte<br />
Daten genutzt werden.<br />
Erfolgsbedingungen<br />
• Der Service kompensiert eine Reduktion im Datenraum<br />
<strong>und</strong> arbeitet in jedem Fall korrekt.<br />
• Der Service wirft eine angemessene Fehlermeldung.<br />
Fehlschlagbedingungen<br />
Der Service verwendet die potentiell reduzierten Daten, so<br />
dass der Effekt des Services fehlerhaft ist.<br />
91
A. Testszenarien<br />
9 / Testaspekt Rückwärtskompatibilität<br />
Tester<br />
Serviceumgebung<br />
Abdeckung<br />
Risiken<br />
Vorbedingungen<br />
Entwickler<br />
lokal/entfernt, entfernt/test<br />
Die Serviceschnittstellte ist ein einzuhaltender Vertrag. Immer<br />
wenn sich Änderungen am Service ergeben, muss die<br />
Serviceschnittstelle rückwärtskompatibel bleiben.<br />
Jede Änderung in der Serviceschnittstelle kann zu Änderungen<br />
bei allen Servicekonsumenten führen. Die Servicekonsumenten<br />
werden unzufrieden, weil sie evtl. zeitintensive<br />
Änderungen in ihrer eigenen Software vornehmen müssen.<br />
Fehler treten evtl. nur bei bestimmten Interaktionen auf <strong>und</strong><br />
sind daher zunächst versteckt.<br />
1. Für den Service existieren automatische Tests <strong>und</strong> diese<br />
Tests setzen einen Proxy zur Interaktion mit dem<br />
Service ein.<br />
2. Keiner der Tests aus Vorbedingung 1 schlägt fehl.<br />
Durchführung<br />
Mocks<br />
Aktivitäten<br />
Automatisiert<br />
Werden vom eingesetzten Test übernommen.<br />
1. Erstellen eines Proxy für den aktuellen produktiven<br />
Service.<br />
2. Ausführen aller verfügbaren Tests mit dem neuen<br />
Proxy.<br />
Erfolgsbedingungen<br />
Fehlschlagbedingungen<br />
Alle Tests sind erfolgreich.<br />
Ein Test schlägt fehl.<br />
92
A. Testszenarien<br />
10 / Testaspekt Interoperabilität<br />
Tester<br />
Serviceumgebung<br />
Abdeckung<br />
Risiken<br />
Vorbedingungen<br />
Tester<br />
entfernt/test<br />
Der Service kann <strong>von</strong> beliebigen Plattformen eingesetzt werden,<br />
ist aber geb<strong>und</strong>en an eine Technologie.<br />
Der Service steht nur einem beschränkten Kreis <strong>von</strong> Nutzern<br />
zur Verfügung.<br />
• Der Service ist in einer entfernt/test Serviceumgebung<br />
verfügbar.<br />
• Eine andere Plattform, die sich <strong>von</strong> der zur Bereitstellung<br />
genutzten Plattform unterscheidet, ist verfügbar.<br />
Bevorzugt sind für den Test verbreitete Plattformen zu<br />
wählen, die vorrangig <strong>von</strong> K<strong>und</strong>en eingesetzt werden.<br />
Durchführung<br />
Mocks<br />
Aktivitäten<br />
Manuell<br />
keine<br />
1. Benutzen des Services mit einer anderen Plattform.<br />
Erfolgsbedingungen<br />
Fehlschlagbedingungen<br />
Der Service bearbeitet die Anfrage wie erwartet.<br />
Der Service liefert eine Fehlermeldung.<br />
93
A. Testszenarien<br />
11 / Testaspekt Funktionalität<br />
Tester<br />
Serviceumgebung<br />
Abdeckung<br />
Risiken<br />
Vorbedingungen<br />
Tester<br />
entfernt/test<br />
Spezifikationen <strong>und</strong> die Servicedokumentation beschreiben<br />
das Verhalten eines Services.<br />
Der Service arbeitet nicht wie es <strong>von</strong> einem Servicekonsument<br />
erwartet wird. Dadurch lässt er sich nicht wie gewünscht<br />
einsetzen.<br />
• Dokumente, die den Effekt eines Services beschreiben,<br />
wurden identifiziert.<br />
• Der Service ist in einer entfernt/test Serviceumgebung<br />
verfügbar.<br />
Durchführung<br />
Mocks<br />
Aktivitäten<br />
Manuell<br />
keine<br />
1. Überprüfen, ob eine Funktion oder ein Effekt, den der<br />
Service liefern soll, eintritt.<br />
Erfolgsbedingungen<br />
Fehlschlagbedingungen<br />
Der Service bearbeitet die Anfrage wie in einem Dokument<br />
festgelegt.<br />
• Der Service zeigt vom Dokument abweichendes Verhalten.<br />
• Der Service wirft eine unerwartete Fehlermeldung.<br />
94
Erklärung der Selbstständigkeit<br />
Hiermit versichere ich, dass ich die vorliegende Masterarbeit selbständig <strong>und</strong> ohne<br />
fremde Hilfe verfasst <strong>und</strong> keine anderen als die in der Arbeit angegebenen Quellen<br />
<strong>und</strong> Hilfsmittel verwendet habe. Die Arbeit hat in gleicher oder ähnlicher Form noch<br />
keinem anderen Prüfungsamt vorgelegen.<br />
Hannover, den 29. Oktober 2007<br />
Dennis Hardt<br />
95