Testen von serviceorientierten Architekturen: Teststrategie und ...

Testen von serviceorientierten Architekturen: Teststrategie und ... Testen von serviceorientierten Architekturen: Teststrategie und ...

se.uni.hannover.de
von se.uni.hannover.de Mehr von diesem Publisher
30.06.2014 Aufrufe

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

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!