Alle Kapitel aufklappen
Alle Kapitel zuklappen
1.1 Nachhaltigkeit: Entwicklung und Wartung mit einer Testinfrastruktur
32
1.2 Agilität: Praktiken des Agile Software Engineerings
37
1.3 Effizienz: Einhaltung von Designprinzipien
38
1.4 Kommunikation: Diagramme als Gesprächsgrundlage
42
TEIL I Aufbau einer Testinfrastruktur
45
2 Beispielanwendung für diesen Buchteil
47
2.1 Stammdatenmanagement
48
2.1.2 Definition eines Stammdatenmodells
49
2.2 Benutzeroberfläche
50
3 Codebasierte Verbesserung eines Tests
55
3.1 Einführung in den Testcode
55
3.1.1 Erste Definition einer Testklasse
56
3.1.2 Erste Implementierung der Testklasse
57
3.1.3 ABAP-Unit-Protokoll
64
3.2 Allgemeine Clean-Code-Prinzipien
67
3.2.1 Verbesserungsprozess
67
3.2.2 Verbesserung der Definition der Testklasse
69
3.2.3 Verbesserung der Implementierung der Testklasse
70
3.3 Testorientierte Clean-Code-Prinzipien
76
3.3.1 Verbesserungsprozess
76
3.3.2 Verbesserung der Implementierung der Testklasse
77
4 Designbasierte Verbesserung des Tests
85
4.1 Basisklasse von Testklassen
85
4.1.1 Verbesserungsprozess
86
4.1.2 Extraktion einer Basisklasse aus einer Testklasse
86
4.2 Verwendung von Hilfsklassen durch Testklassen
91
4.2.1 Verbesserungsprozess
91
4.2.2 Entwurfsmuster für Klassen
91
4.2.3 Definition und Verwendung der Testdatenklasse
92
5 Robuster Integrationstest
99
5.1 Verbesserungsprozess
99
5.2 Unabhängigkeit von Testmethoden
100
5.2.1 Testdatencontainer
101
5.2.2 Singleton-Entwurfsmuster
102
5.3 Wiederholbarkeit von Testmethoden
105
5.3.1 Automatischer Testaufbau
105
5.3.2 Hilfsmethoden der Testklasse
106
6 Minimierung von Abhängigkeiten
113
6.1 Vereinfachung einer Verwendung
114
6.1.1 Verbesserungsprozess
115
6.1.2 Vereinfachung der produktiven API
116
6.1.3 Zugriff auf den Testdatencontainer
117
6.1.4 Delegierende Testklasse
117
6.2 Abgrenzung einer Verwendung
121
6.2.1 Verbesserungsprozess
122
6.2.2 Geschachtelte Interfaces
122
6.3 Unabhängigkeit von einer Erzeugung
125
6.3.1 Verbesserungsprozess
125
6.3.2 Definition einer Factory
126
6.3.3 Implementierung einer Factory
127
6.3.4 Verwendung einer Factory
128
6.4 Unabhängigkeit von einer Erweiterung
131
6.4.1 Verbesserungsprozess
131
6.4.2 Abstrakte Oberklasse aller Entitäten
131
6.4.3 Konkrete Unterklasse für Flugverbindungen
133
7 Isolierter Komponententest
137
7.1 Transformation des Integrationstests
138
7.1.1 Verbesserungsprozess
139
7.1.2 Isolierung mit einem Governance-API-Double
139
7.1.3 Konfiguration des Governance-API-Doubles
144
7.2 Skalierung mit einer Testsprache
150
7.2.1 Verbesserungsprozess
150
7.2.2 Zustand einer Entität
151
7.2.3 Testmethode: Ungesicherte Änderungen
153
7.2.4 Testmethode: Änderungen zu einem neuen Entitätstyp
155
7.2.5 Testmethode: Enthaltene Änderungen
156
7.3 Testgetriebene Entwicklung
157
7.3.1 Testklasse für das Hervorheben von Löschungen
158
7.4 Liskov-Substitution-Prinzip
161
7.4.1 Beispielhafte Verletzung
161
7.4.2 Beispielhafte Erfüllung
163
8 Redesign mit Unit-Tests
165
8.1 Objektorientierte API für Entitäten
167
8.1.1 Entitätstypklasse
167
8.1.2 Selektionsklasse
167
8.1.3 Entitätsmengenklasse
169
8.1.4 Entity-API-Klasse
169
8.2 Hervorheben von Änderungen als eigenständige Einheit
170
8.2.1 Highlight-Changes-Interface
170
8.2.2 Highlight-Changes-Klasse
171
8.2.3 Berechnungsmethode für Entitätsknoten
172
8.2.4 Berechnungsmethode für Entitätsbäume
174
8.2.5 Verwendung der Highlight-Changes-Klasse
175
8.2.6 Objektorientiertes Programmiermodell
176
8.3 Tests für die Highlight-Changes-Klasse
177
8.3.2 Komponententests
180
8.4 Zusammenfassung des ersten Teils
182
TEIL II Testorientiertes ABAP-Design
185
9 Design von Methoden
187
9.1 Regeln zur Implementierung einer Methode
188
9.2 Regeln für die Signatur einer Methode
196
9.2.1 Einfaches Beispiel für die Verbesserung einer Methodensignatur
196
9.2.2 Tipps und Tricks für eine kompakte Methodensignatur
197
9.2.3 Anspruchsvolles Beispiel für die Verbesserung einer Methodensignatur
199
10 Design von Klassen
209
10.1 Erzeugung eines Objekts durch seine Klasse
210
10.1.1 Erzeugungsmethoden
210
10.1.2 Testbarkeit des Konstruktors
211
10.2 Erzeugung eines Objekts durch eine Factory-Klasse
213
10.2.1 Erzeugung ohne Factory
213
10.2.2 Erzeugung mit konkreter Factory
214
10.2.3 Erzeugung mit abstrakter Factory
215
10.3 Abhängigkeitsarten zwischen Klassen
217
10.3.1 Innere Abhängigkeit
218
10.3.2 Äußere Abhängigkeit
219
10.4 Interfaces einer Klasse
220
10.4.1 Berechtigungsspezifische Interfaces
220
10.4.2 Rollenspezifische Interfaces
221
10.4.3 Interface-Prinzipien
222
10.5 Abstraktionsebenen innerhalb einer Klasse
222
10.5.1 Entitätsmengenklasse mit Tabellen
224
10.5.2 Entitätsmengenklasse mit Objekten
226
10.6 Katalog-Entwurfsmuster
229
10.7 Innerer Zusammenhalt
231
10.7.1 Komponentengraph
232
10.7.2 Horizontale Zerlegung einer Klasse
233
10.7.3 Vertikale Zerlegung einer Klasse
234
10.7.4 Beispiel für die Zerlegung einer Klasse
235
11 Design von Paketen
237
11.1.2 Paketschnittstellen
240
11.1.3 Verwendungserklärungen
242
12.1.1 Parameterorientierte Testverfahren
250
12.1.2 Zustandsorientiertes Testverfahren
253
12.2.1 Weiterentwicklung von Bestandscode
253
12.2.2 Neuentwicklung
254
12.3.1 Zuständigkeiten der Testtypen
257
12.3.2 Schrittweise Vervollständigung der Testabdeckung
257
13.1 Vorteile von Testdoubles
259
13.1.1 Abhängigkeiten eines Tests
260
13.1.2 Überprüfung des Verhaltens einer Methode
261
13.2 Spezifikation von Testdoubles
263
13.2.1 Testdoubletypen
264
13.2.2 Testdoubles verwenden
268
13.3 Design von Testdoubles
269
13.3.1 Interface- und Unterklassendoubles
270
13.3.3 Änderungen des Produktdesigns zugunsten der Testbarkeit
273
13.4 Injektion von Testdoubles
275
13.4.1 Von der CUT-Produktklasse angebotene Injektionsmechanismen
275
13.4.2 Von der CUT-Klasse ermöglichte Injektionsmechanismen
277
13.4.3 Von einem DOC-Singleton ermöglichte Injektionsmechanismen
280
13.4.4 Von einer statischen Factory ermöglichte Injektionsmechanismen
283
13.4.5 Von einer Singleton-Factory ermöglichte Injektionsmechanismen
284
13.4.6 Von einer abstrakten Factory ermöglichte Injektionsmechanismen
285
14 Globale Testdoubles
289
14.1 Testdouble für eine DOM-Methode
290
14.1.1 Doubleklasse mit vielen Erzeugungsmethoden
292
14.1.2 Doubleklasse mit einer Erzeugungsmethode
294
14.2 Testdouble für zwei DOM-Methoden
295
14.2.1 Doubleklasse für mehrere DOM-Methoden
295
14.2.2 Definition und Implementierung der Testklasse
298
14.3 Kombination zweier Methodendoubles
301
14.3.1 Starker Zusammenhalt einer Doubleklasse
301
14.3.2 Decorator-Doubleklasse
303
14.4 Globalisierung von Testdoubles
307
14.5 Design globaler Testdoubles
310
14.6 Anpassung globaler Testdoubles
313
14.6.2 Globale Jobdoubleklasse
314
14.6.3 Testklasse für eine Jobverwenderklasse
316
15.1 Lokale Testklassen
321
15.2.1 Gegeben-Wenn-Dann-Entwurfsmuster
324
15.2.2 Testklassen-Entwurfsmuster
325
15.3 Testklassenhierarchien
327
15.4 Globale Testklassen
331
15.5 Namenskonventionen für Testcode
333
16.1 Testdatencontainer
335
16.1.1 Verwendung von Testdatencontainern in ABAP Unit
335
16.1.2 Vor- und Nachteile von Testdatencontainern
336
16.2 Testdatenobjekte
343
17.1 Anwendungsszenarien für eine globale Testinfrastruktur
357
17.1.1 Komponententests
357
17.1.2 Integrationstests
359
17.2 Entwicklungsprozesse mithilfe einer Testinfrastruktur
362
17.2.1 Entwicklung einer API für Legacy-Komponenten
362
17.2.2 Teamübergreifende Testinfrastruktur für ein Produkt
364
17.3 Zusammenfassung des zweiten Teils
365
TEIL III Agile Neuentwicklung
367
18 Planung und Vorarbeit
369
18.1 Spezifikation der Beispielanwendung
370
18.2 Architektur und Design der Beispielanwendung
372
18.3 Teststrategie für die Beispielanwendung
377
18.3.1 Akzeptanztests
377
18.3.2 Prozesskomponententests
378
18.3.3 Modellkomponententests
379
18.3.4 Zugriffsintegrationstests
379
18.4 Vorbereitung der testgetriebenen Entwicklung
380
18.4.1 Skelett aller Komponenten
380
18.4.2 Skelett der Modellkomponente
383
18.4.3 Externe Factory eines Pakets
384
18.4.4 Interne Factory eines Pakets
386
18.4.5 API eines Pakets
387
18.4.6 Datenklasse in einem Paket
388
18.4.7 Basisklasse für die Komponententests eines Pakets
392
19 Testgetriebene Entwicklung
393
19.1 Akzeptanztestgetriebene Entwicklung
393
19.1.1 Basisklasse für die Akzeptanztests
394
19.1.2 Akzeptanztest (Gegeben- und Wenn-Phase)
395
19.2 Komponententestgetriebene Entwicklung
396
19.2.1 Komponententestklasse für den Erzeugungsprozess
397
19.2.2 Globales Double für den Vertragsmanager
398
19.2.3 Entwicklungstaktik
400
19.3 Unit-Test-getriebene Entwicklung
401
19.4 Objektbasierte Überprüfung
403
19.4.1 Akzeptanztest (Dann-Phase)
403
19.4.2 Objektbasierter Vergleich
404
19.4.3 Refactoring des Akzeptanztests
406
19.5 Testen des Änderns und Sicherns eines Vertrags
407
19.5.1 Komponententest
410
19.5.2 Integrationstest
412
19.6 Zusammenfassung des dritten Teils
413
TEIL IV Agile Methoden
415
20.1.1 Produkt-Backlog
418
20.1.2 Ready-Kriterien
418
20.1.3 Done-Kriterien
419
20.1.4 Sprint-Backlog
421
20.1.5 Sprint-Burndown-Chart
422
20.1.6 Release-Burndown-Chart
422
20.3.1 Backlog-Grooming
424
20.3.2 Sprintplanung – Teil 1
425
20.3.3 Sprintplanung – Teil 2
425
20.3.6 Sprint-Retrospektive
427
21 Agile Software Engineering
433
21.1.2 Vor- und Nachteile
434
21.2 Testgetriebene Entwicklung
437
21.2.2 Vor- und Nachteile
439
21.3 Paarweise Programmierung
441
21.3.2 Vor- und Nachteile
444
21.4 Walking Skeleton
447
21.4.2 Vor- und Nachteile
452
21.5 Gemeinsame Codeverantwortung
453
21.5.2 Vor- und Nachteile
456
21.6 Kontinuierliche Integration
459
21.6.1 Kontinuierliche Integration mit ABAP
459
21.6.2 Quasilokale Änderung
460
22 Lean-Entwicklungsmodell
463
22.2 Umsetzung der Lean-Prinzipien mit Agile Software Engineering
465
22.2.2 Testgetriebene Entwicklung
465
22.2.3 Paarweise Programmierung
466
22.2.4 Walking Skeleton
466
22.2.5 Gemeinsame Codeverantwortung
467
22.3 Testinfrastruktur
467
23 Entwicklung der Teams
469
23.1 Nachhaltige Ausbildung
469
23.2 Lücken in der Ausbildung
473
23.2.1 Keine Unit-Tests
473
23.2.2 Lange Methoden
474
23.2.3 Ausbildungsplan
474
23.3.2 Vor- und Nachteile
481
23.4 Netzwerk für Agile Coaching
483
24 Entwicklung des Backlogs
485
24.1.3 Sichtweise definieren
490
24.1.5 Prototypen entwickeln
491
24.2 User Story Mapping
492
24.2.1 Aufbau einer User Story Map
492
24.2.2 Überprüfung einer User Story Map
495
25 Entwicklung des Produkts
497
25.1 Nachhaltige Entwicklung
498
25.1.1 Erhaltung der Produktivität
498
25.1.2 Verbesserung der Produktivität
499
25.2 Entwicklungsstrategien für Legacy Code
501
25.2.1 Charakterisierung
501
25.2.2 Transformation
501
25.3 Entwicklungsstrategien für neuen Code
502
25.4 Zusammenfassung des vierten Teils
504
TEIL V Testorientierte ABAP-Werkzeuge
505
26.1 Klasse CL_ABAP_UNIT_ASSERT
507
26.2 Ausführung von Tests
512
26.2.1 Statische Grundlagen der Testausführung
512
26.2.2 Dynamische Grundlagen der Testausführung
513
26.2.3 Testbeziehungen
516
26.3 Entwicklungsobjekte
518
27 ABAP Development Tools
521
27.1.2 Projekt anlegen
523
27.1.3 Produktklasse anlegen
523
27.2 Testgetriebene Entwicklung mit den ABAP Development Tools
525
27.2.1 Berechtigungsprüfung als Test-Stub
526
27.2.2 Berechtigungsprüfung als Test-Spy
534
27.2.3 Berechtigungsprüfung als Mock-Objekt
540
28 ABAP-Werkzeuge zur Testisolierung
545
28.2 Open SQL Test Double Framework
548
28.4 ABAP Test Double Framework
553
28.5 Zusammenfassung des fünften Teils und des gesamten Buches
557
B Literaturverzeichnis
563