tdlcr - oio · 2020-06-08 · orientation in objects gmbh weinheimer str. 68 68309 mannheim...
TRANSCRIPT
![Page 1: TDLCR - OIO · 2020-06-08 · Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim Version: info@oio.de TDLCR Test Driven Legacy Code Refactoring Java Forum Nord Hannover,](https://reader034.vdocuments.site/reader034/viewer/2022050417/5f8d1b79b9f227111b7f7110/html5/thumbnails/1.jpg)
Orientation in Objects GmbH
Weinheimer Str. 68
68309 Mannheim
www.oio.de
TDLCRTest Driven Legacy Code Refactoring
Java Forum Nord Hannover, 20.10.2016
1.0
![Page 2: TDLCR - OIO · 2020-06-08 · Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim Version: info@oio.de TDLCR Test Driven Legacy Code Refactoring Java Forum Nord Hannover,](https://reader034.vdocuments.site/reader034/viewer/2022050417/5f8d1b79b9f227111b7f7110/html5/thumbnails/2.jpg)
Test Driven Legacy Code Refactoring© Orientation in Objects GmbH
Abstract
2
Bestandsanwendungen müssen gewartet und ggf. weiterentwickelt
werden, bergen aber meist viele Defekte. Als Entwickler fürchten wir uns
zudem, mehr Schaden anzurichten, weil das Verständnis für den Legacy
Code fehlt. Refactoring kann zum Verstehen beitragen, endet aber
aufgrund der typischerweise fehlenden automatisierten Tests in einem
Blindflug.
Mit testgetriebener Entwicklung scheint es eine Allzweckwaffe für gutes
Design und eine geringe Fehlerrate zu geben. Aber TDD und Legacy
Code scheinen sich eigentlich auszuschließen. Anhand von Live Coding
schauen wir, wie die testgetriebene Entwicklung trotzdem helfen kann,
den Code ohne allzu große Bauchschmerzen anzupassen. Schöner
Nebeneffekt wird das Entstehen eines automatisierten Testbetts sein,
welches zukünftige Refactorings leichter machen wird.
![Page 3: TDLCR - OIO · 2020-06-08 · Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim Version: info@oio.de TDLCR Test Driven Legacy Code Refactoring Java Forum Nord Hannover,](https://reader034.vdocuments.site/reader034/viewer/2022050417/5f8d1b79b9f227111b7f7110/html5/thumbnails/3.jpg)
Test Driven Legacy Code Refactoring© Orientation in Objects GmbH
Über mich
3
Falk Sippach (@sippsack)
Trainer, Berater, Entwickler
SchwerpunkteArchitektur
Agile SoftwareentwicklungCodequalitätCo-Organisator
![Page 4: TDLCR - OIO · 2020-06-08 · Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim Version: info@oio.de TDLCR Test Driven Legacy Code Refactoring Java Forum Nord Hannover,](https://reader034.vdocuments.site/reader034/viewer/2022050417/5f8d1b79b9f227111b7f7110/html5/thumbnails/4.jpg)
Test Driven Legacy Code Refactoring© Orientation in Objects GmbH
Java, XML und Open Source seit 1998
) Competence Center)) Object Rangers )
• Schulungen, Coaching,
Weiterbildungsberatung,
Train & Solve-Programme
• Methoden, Standards und
Tools für die Entwicklung
von offenen, unternehmens-
weiten Systemen
• Unterstützung laufender
Java Projekte
• Perfect Match
• Rent-a-team
• Coaching on the project
• Inhouse Outsourcing
• Schlüsselfertige Realisierung
von Java Software
• Individualsoftware
• Pilot- und Migrationsprojekte
• Sanierung von Software
• Software Wartung
) Software Factory )
4
![Page 5: TDLCR - OIO · 2020-06-08 · Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim Version: info@oio.de TDLCR Test Driven Legacy Code Refactoring Java Forum Nord Hannover,](https://reader034.vdocuments.site/reader034/viewer/2022050417/5f8d1b79b9f227111b7f7110/html5/thumbnails/5.jpg)
Test Driven Legacy Code Refactoring© Orientation in Objects GmbH 5
TDLCRLegacy Code
![Page 6: TDLCR - OIO · 2020-06-08 · Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim Version: info@oio.de TDLCR Test Driven Legacy Code Refactoring Java Forum Nord Hannover,](https://reader034.vdocuments.site/reader034/viewer/2022050417/5f8d1b79b9f227111b7f7110/html5/thumbnails/6.jpg)
Test Driven Legacy Code Refactoring© Orientation in Objects GmbH 6
Foto von smpcas, CC0 Public Domain Lizenz, https://pixabay.com/de/pula-kroatien-amphitheater-erbe-827909/
Vermächtnis
Erbe
Altlast
Hinterlassenschaft
![Page 7: TDLCR - OIO · 2020-06-08 · Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim Version: info@oio.de TDLCR Test Driven Legacy Code Refactoring Java Forum Nord Hannover,](https://reader034.vdocuments.site/reader034/viewer/2022050417/5f8d1b79b9f227111b7f7110/html5/thumbnails/7.jpg)
Test Driven Legacy Code Refactoring© Orientation in Objects GmbH 7
// TODO: refactor thisGreenfield, Agile, TDD, …
![Page 8: TDLCR - OIO · 2020-06-08 · Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim Version: info@oio.de TDLCR Test Driven Legacy Code Refactoring Java Forum Nord Hannover,](https://reader034.vdocuments.site/reader034/viewer/2022050417/5f8d1b79b9f227111b7f7110/html5/thumbnails/8.jpg)
Test Driven Legacy Code Refactoring© Orientation in Objects GmbH 8
"Some crap made by someone else"
Alter Code, geerbter Code, Code
den niemand mehr versteht …
Code entstanden unter Zeitdruck
und ohne automatisierte Tests
Technische Schulden
Was ist
Legacy Code?
Was ist mit unserem
eigenen Code?
![Page 9: TDLCR - OIO · 2020-06-08 · Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim Version: info@oio.de TDLCR Test Driven Legacy Code Refactoring Java Forum Nord Hannover,](https://reader034.vdocuments.site/reader034/viewer/2022050417/5f8d1b79b9f227111b7f7110/html5/thumbnails/9.jpg)
Test Driven Legacy Code Refactoring© Orientation in Objects GmbH 9
Verstehen
Erweitern
Bugfixing
Warum
Legacy Code
anfassen?
Optimierung
![Page 10: TDLCR - OIO · 2020-06-08 · Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim Version: info@oio.de TDLCR Test Driven Legacy Code Refactoring Java Forum Nord Hannover,](https://reader034.vdocuments.site/reader034/viewer/2022050417/5f8d1b79b9f227111b7f7110/html5/thumbnails/10.jpg)
Test Driven Legacy Code Refactoring© Orientation in Objects GmbH 10
Legacy code is
valuable code
that we feel afraid
to change.
J. B. Rainsberger
Foto von PublicDomainPictures, CC0 Public Domain Lizenz, https://pixabay.com/de/menschen-abdeckung-schrei-314481/
“
![Page 11: TDLCR - OIO · 2020-06-08 · Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim Version: info@oio.de TDLCR Test Driven Legacy Code Refactoring Java Forum Nord Hannover,](https://reader034.vdocuments.site/reader034/viewer/2022050417/5f8d1b79b9f227111b7f7110/html5/thumbnails/11.jpg)
Test Driven Legacy Code Refactoring© Orientation in Objects GmbH 11
Code
without tests
is bad code.Michael Feathers
“
Legacy Code Dilemma
![Page 12: TDLCR - OIO · 2020-06-08 · Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim Version: info@oio.de TDLCR Test Driven Legacy Code Refactoring Java Forum Nord Hannover,](https://reader034.vdocuments.site/reader034/viewer/2022050417/5f8d1b79b9f227111b7f7110/html5/thumbnails/12.jpg)
Test Driven Legacy Code Refactoring© Orientation in Objects GmbH 12
refactoren bräuchte man Tests, Tests würden helfen, Code zu
verstehen, um Code zu verstehen könnte man Code refactoren, um
Code zu refactoren bräuchte man Tests, Tests würden helfen, Code zu
verstehen, um Code zu verstehen könnte man Code refactoren, um
Code zu refactoren bräuchte man Tests, Tests würden helfen, Code zu
verstehen, um Code zu verstehen könnte man Code refactoren, um
Code zu refactoren bräuchte man Tests, Tests würden helfen, Code zu
verstehen, um Code zu verstehen könnte man Code refactoren, um
Code zu refactoren bräuchte man Tests, Tests würden helfen, Code zu
verstehen, um Code zu verstehen könnte man Code refactoren, um
Code zu refactoren bräuchte man Tests, Tests würden helfen, Code zu
verstehen, um Code zu verstehen könnte man Code refactoren, um
Code zu refactoren bräuchte man Tests, Tests würden helfen, Code
zu verstehen, um Code zu verstehen könnte man Code refactoren, um
Code zu refactoren bräuchte man Tests, Tests würden helfen, Code zu
verstehen, um Code zu verstehen könnte man Code refactoren, um
Code zu refactoren bräuchte man Tests, Tests würden helfen, Code zu
Henne-Ei-
Problem
![Page 13: TDLCR - OIO · 2020-06-08 · Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim Version: info@oio.de TDLCR Test Driven Legacy Code Refactoring Java Forum Nord Hannover,](https://reader034.vdocuments.site/reader034/viewer/2022050417/5f8d1b79b9f227111b7f7110/html5/thumbnails/13.jpg)
Test Driven Legacy Code Refactoring© Orientation in Objects GmbH 13
um Tests zu schreiben muß der Code testbar sein, um testbaren Code
zu erhalten müßte man refactoren, um zu refactoren könnte man Tests
schreiben, um Tests zu schreiben muß der Code testbar sein, um
testbaren Code zu erhalten müßte man refactoren, um zu refactoren
könnte man Tests schreiben, um Tests zu schreiben muß der Code
testbar sein, um testbaren Code zu erhalten müßte man refactoren,
um zu refactoren könnte man Tests schreiben, um Tests zu
schreiben muß der Code testbar sein, um testbaren Code zu erhalten
müßte man refactoren, um zu refactoren könnte man Tests schreiben,
um Tests zu schreiben muß der Code testbar sein, um testbaren Code
zu erhalten müßte man refactoren, um zu refactoren könnte man Tests
schreiben, um Tests zu schreiben muß der Code testbar sein, um
testbaren Code zu erhalten müßte man refactoren, um zu refactoren
könnte man Tests schreiben, um Tests zu schreiben muß der Code
testbar sein, um testbaren Code zu erhalten müßte man refactoren, um
zu refactoren könnte man Tests schreiben, um Tests zu schreiben muß
der Code testbar sein, um testbaren Code zu erhalten müßte man refact
Die Katze beißt sich
in den Schwanz!
![Page 14: TDLCR - OIO · 2020-06-08 · Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim Version: info@oio.de TDLCR Test Driven Legacy Code Refactoring Java Forum Nord Hannover,](https://reader034.vdocuments.site/reader034/viewer/2022050417/5f8d1b79b9f227111b7f7110/html5/thumbnails/14.jpg)
Test Driven Legacy Code Refactoring© Orientation in Objects GmbH 14
TDLCRTest Driven Refactoring
![Page 15: TDLCR - OIO · 2020-06-08 · Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim Version: info@oio.de TDLCR Test Driven Legacy Code Refactoring Java Forum Nord Hannover,](https://reader034.vdocuments.site/reader034/viewer/2022050417/5f8d1b79b9f227111b7f7110/html5/thumbnails/15.jpg)
Test Driven Legacy Code Refactoring© Orientation in Objects GmbH
TDD hilft beim Verbessern des Codes
15
![Page 16: TDLCR - OIO · 2020-06-08 · Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim Version: info@oio.de TDLCR Test Driven Legacy Code Refactoring Java Forum Nord Hannover,](https://reader034.vdocuments.site/reader034/viewer/2022050417/5f8d1b79b9f227111b7f7110/html5/thumbnails/16.jpg)
Test Driven Legacy Code Refactoring© Orientation in Objects GmbH 16
RED
GREENREFACTOR
Test
Driven
Development
![Page 17: TDLCR - OIO · 2020-06-08 · Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim Version: info@oio.de TDLCR Test Driven Legacy Code Refactoring Java Forum Nord Hannover,](https://reader034.vdocuments.site/reader034/viewer/2022050417/5f8d1b79b9f227111b7f7110/html5/thumbnails/17.jpg)
Test Driven Legacy Code Refactoring© Orientation in Objects GmbH
"Gesetze" von TDD
• Schreibe einen fehlschlagenden Test, bevor du
Code für das Produktivsystem verfasst.
• Schreibe nur so viel Code für den Test, damit er
kompiliert (Rot)
• Schreibe nur so viel Code, um den Test zu
bestehen (Grün)
• Refactor: Duplikation entfernen
17
![Page 18: TDLCR - OIO · 2020-06-08 · Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim Version: info@oio.de TDLCR Test Driven Legacy Code Refactoring Java Forum Nord Hannover,](https://reader034.vdocuments.site/reader034/viewer/2022050417/5f8d1b79b9f227111b7f7110/html5/thumbnails/18.jpg)
Test Driven Legacy Code Refactoring© Orientation in Objects GmbH 18
Verstehen
Erweitern
Bugfixing
Wo kann TDD
bei Legacy
Code helfen?
Optimierung
![Page 19: TDLCR - OIO · 2020-06-08 · Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim Version: info@oio.de TDLCR Test Driven Legacy Code Refactoring Java Forum Nord Hannover,](https://reader034.vdocuments.site/reader034/viewer/2022050417/5f8d1b79b9f227111b7f7110/html5/thumbnails/19.jpg)
Test Driven Legacy Code Refactoring© Orientation in Objects GmbH 19
TDD vs. Legacy Code
Test vor dem Code vs.
Code schon da
![Page 20: TDLCR - OIO · 2020-06-08 · Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim Version: info@oio.de TDLCR Test Driven Legacy Code Refactoring Java Forum Nord Hannover,](https://reader034.vdocuments.site/reader034/viewer/2022050417/5f8d1b79b9f227111b7f7110/html5/thumbnails/20.jpg)
Test Driven Legacy Code Refactoring© Orientation in Objects GmbH 20
TDLCRTest Driven Legacy Code Refactoring
![Page 21: TDLCR - OIO · 2020-06-08 · Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim Version: info@oio.de TDLCR Test Driven Legacy Code Refactoring Java Forum Nord Hannover,](https://reader034.vdocuments.site/reader034/viewer/2022050417/5f8d1b79b9f227111b7f7110/html5/thumbnails/21.jpg)
Test Driven Legacy Code Refactoring© Orientation in Objects GmbH 21
Erweitern Strategie 1:
Edit and Pray!
Foto von Myriams-Fotos: https://pixabay.com/en/rosary-faith-pray-folded-hands-1211064/ (CC0 Public Domain Lizenz)
![Page 22: TDLCR - OIO · 2020-06-08 · Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim Version: info@oio.de TDLCR Test Driven Legacy Code Refactoring Java Forum Nord Hannover,](https://reader034.vdocuments.site/reader034/viewer/2022050417/5f8d1b79b9f227111b7f7110/html5/thumbnails/22.jpg)
Test Driven Legacy Code Refactoring© Orientation in Objects GmbH 22
Erweitern Strategie 2:
Canary in the
coal mine
Foto von janjf93: https://pixabay.com/en/canary-bird-warrant-canary-road-1606695/ (CC0 Public Domain Lizenz)
![Page 23: TDLCR - OIO · 2020-06-08 · Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim Version: info@oio.de TDLCR Test Driven Legacy Code Refactoring Java Forum Nord Hannover,](https://reader034.vdocuments.site/reader034/viewer/2022050417/5f8d1b79b9f227111b7f7110/html5/thumbnails/23.jpg)
Test Driven Legacy Code Refactoring© Orientation in Objects GmbH 23
1
2
3
Sicherheitsnetz
Testen des Bestands-Codes
Neue Funktionalität mit TDD
![Page 24: TDLCR - OIO · 2020-06-08 · Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim Version: info@oio.de TDLCR Test Driven Legacy Code Refactoring Java Forum Nord Hannover,](https://reader034.vdocuments.site/reader034/viewer/2022050417/5f8d1b79b9f227111b7f7110/html5/thumbnails/24.jpg)
Test Driven Legacy Code Refactoring© Orientation in Objects GmbH 24
Foto von bella67: https://pixabay.com/de/spinnennetz-mit-wasserperlen-netz-921039/ (CC0 Public Domain Lizenz)
Sicherheitsnetz
1
![Page 25: TDLCR - OIO · 2020-06-08 · Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim Version: info@oio.de TDLCR Test Driven Legacy Code Refactoring Java Forum Nord Hannover,](https://reader034.vdocuments.site/reader034/viewer/2022050417/5f8d1b79b9f227111b7f7110/html5/thumbnails/25.jpg)
Test Driven Legacy Code Refactoring© Orientation in Objects GmbH 25
Foto von istara: https://pixabay.com/de/gold-bar-goldbarren-reich-geld-296115/ (CC0 Public Domain Lizenz)
Golden Master
gegenwärtiges Verhalten
dokumentieren und erhalten
![Page 26: TDLCR - OIO · 2020-06-08 · Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim Version: info@oio.de TDLCR Test Driven Legacy Code Refactoring Java Forum Nord Hannover,](https://reader034.vdocuments.site/reader034/viewer/2022050417/5f8d1b79b9f227111b7f7110/html5/thumbnails/26.jpg)
Test Driven Legacy Code Refactoring© Orientation in Objects GmbH 26
![Page 27: TDLCR - OIO · 2020-06-08 · Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim Version: info@oio.de TDLCR Test Driven Legacy Code Refactoring Java Forum Nord Hannover,](https://reader034.vdocuments.site/reader034/viewer/2022050417/5f8d1b79b9f227111b7f7110/html5/thumbnails/27.jpg)
Test Driven Legacy Code Refactoring© Orientation in Objects GmbH
Konsolenausgaben abprüfen
27
![Page 28: TDLCR - OIO · 2020-06-08 · Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim Version: info@oio.de TDLCR Test Driven Legacy Code Refactoring Java Forum Nord Hannover,](https://reader034.vdocuments.site/reader034/viewer/2022050417/5f8d1b79b9f227111b7f7110/html5/thumbnails/28.jpg)
Test Driven Legacy Code Refactoring© Orientation in Objects GmbH
Was mache ich bei GUI-Anwendungen?
28
public static void main(String... args) throws Exception {
WebDriver driver = new FirefoxDriver();
driver.get("http://www.retest.de");
while (true) {
List<WebElement> links = driver.findElements(By.tagName("a"));
links.get(random.nextInt(links.size())).click();
Thread.sleep(500);
List<WebElement> fields =
driver.findElements(By.xpath("//input[@type='text']"));
WebElement field = fields.get(random.nextInt(fields.size()));
field.sendKeys(randomString());
Thread.sleep(500);
}
}
https://entwicklertag.de/frankfurt/2016/sites/entwicklertag.de.frankfurt.2016/files/slides/Bei%20uns%20testen%20lauter%20Affen_0.pdf
1
2
3
4
![Page 29: TDLCR - OIO · 2020-06-08 · Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim Version: info@oio.de TDLCR Test Driven Legacy Code Refactoring Java Forum Nord Hannover,](https://reader034.vdocuments.site/reader034/viewer/2022050417/5f8d1b79b9f227111b7f7110/html5/thumbnails/29.jpg)
Test Driven Legacy Code Refactoring© Orientation in Objects GmbH 29
Neue Features
ausliefern …2
Foto von PublicDomainPictures: https://pixabay.com/en/adorable-baby-basket-beautiful-boy-21259/ (CC0 Public Domain Lizenz)
![Page 30: TDLCR - OIO · 2020-06-08 · Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim Version: info@oio.de TDLCR Test Driven Legacy Code Refactoring Java Forum Nord Hannover,](https://reader034.vdocuments.site/reader034/viewer/2022050417/5f8d1b79b9f227111b7f7110/html5/thumbnails/30.jpg)
Test Driven Legacy Code Refactoring© Orientation in Objects GmbH
Aufhören Legacy Code zu schreiben!
• sonst wird die Codebasis nur schlimmer und man entfernt sich
immer mehr davon, jemals Tests hinzuzufügen
• Keine neuen Features mehr ohne Unit-Testing!
• Sprout Method + Wrap Method als Hilfen
30
![Page 31: TDLCR - OIO · 2020-06-08 · Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim Version: info@oio.de TDLCR Test Driven Legacy Code Refactoring Java Forum Nord Hannover,](https://reader034.vdocuments.site/reader034/viewer/2022050417/5f8d1b79b9f227111b7f7110/html5/thumbnails/31.jpg)
Test Driven Legacy Code Refactoring© Orientation in Objects GmbH
Sprout Method
public int berechne(int a, int b) {
int c = a + b;
// weitere wichtige Aufgaben
// neues Verhalten
return verdoppeleResult(c);
}
protected int verdoppeleResult(int result) {...}
31
testgetrieben
entwickeln
neues Feature
in eigene Methode
![Page 32: TDLCR - OIO · 2020-06-08 · Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim Version: info@oio.de TDLCR Test Driven Legacy Code Refactoring Java Forum Nord Hannover,](https://reader034.vdocuments.site/reader034/viewer/2022050417/5f8d1b79b9f227111b7f7110/html5/thumbnails/32.jpg)
Test Driven Legacy Code Refactoring© Orientation in Objects GmbH
Sprout Method und TDD (1)
// nicht kompilierenden Test schreiben
@Test
public void testVerdoppeleResult() {
assertEquals(2, rechner.verdoppeleResult(1);
}
// Kompilerfehler
protected int verdoppeleResult(int result) {
return 0;
}
// Test ist rot
32
![Page 33: TDLCR - OIO · 2020-06-08 · Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim Version: info@oio.de TDLCR Test Driven Legacy Code Refactoring Java Forum Nord Hannover,](https://reader034.vdocuments.site/reader034/viewer/2022050417/5f8d1b79b9f227111b7f7110/html5/thumbnails/33.jpg)
Test Driven Legacy Code Refactoring© Orientation in Objects GmbH
Sprout Method und TDD (2)
// einfachste Lösung, damit Test grün wird
protected int verdoppeleResult(int result) {
return 2;
}
// nichts zu refactoren
// von vorn beginnen, weiteren Test schreiben usw.
@Test
public void testVerdoppeleResult() {
assertEquals(2, rechner.verdoppeleResult(1);
assertEquals(4, rechner.verdoppeleResult(2);
}
33
![Page 34: TDLCR - OIO · 2020-06-08 · Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim Version: info@oio.de TDLCR Test Driven Legacy Code Refactoring Java Forum Nord Hannover,](https://reader034.vdocuments.site/reader034/viewer/2022050417/5f8d1b79b9f227111b7f7110/html5/thumbnails/34.jpg)
Test Driven Legacy Code Refactoring© Orientation in Objects GmbH
Tipps TDD
• kleine Schritte
• Workflow (Red – Green - Refactor) einhalten
• Ideen für weitere Testfälle in eine Liste schreiben und nach und
nach abarbeiten (kleine Schritte!)
34
![Page 35: TDLCR - OIO · 2020-06-08 · Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim Version: info@oio.de TDLCR Test Driven Legacy Code Refactoring Java Forum Nord Hannover,](https://reader034.vdocuments.site/reader034/viewer/2022050417/5f8d1b79b9f227111b7f7110/html5/thumbnails/35.jpg)
Test Driven Legacy Code Refactoring© Orientation in Objects GmbH
Wrap Method
• ähnlich zu Sprout Method, neues Verhalten aber vor oder am Ende der zu ändernden Methode
public int berechne(int a, int b) {
logResult(c);
return berechnePrivate(a, b);
}
private int berechnePrivate(int a, int b) {
int c = a + b;
// weitere wichtige Aufgaben
return c;
}
protected void logResult(int result) {...}
35
![Page 36: TDLCR - OIO · 2020-06-08 · Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim Version: info@oio.de TDLCR Test Driven Legacy Code Refactoring Java Forum Nord Hannover,](https://reader034.vdocuments.site/reader034/viewer/2022050417/5f8d1b79b9f227111b7f7110/html5/thumbnails/36.jpg)
Test Driven Legacy Code Refactoring© Orientation in Objects GmbH 36
Foto von StockSnap: https://pixabay.com/de/codierung-gesch%C3%A4ft-arbeiten-macbook-699318/ (CC0 Public Domain Lizenz)
Live-Coding
![Page 37: TDLCR - OIO · 2020-06-08 · Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim Version: info@oio.de TDLCR Test Driven Legacy Code Refactoring Java Forum Nord Hannover,](https://reader034.vdocuments.site/reader034/viewer/2022050417/5f8d1b79b9f227111b7f7110/html5/thumbnails/37.jpg)
Test Driven Legacy Code Refactoring© Orientation in Objects GmbH 37
Bestandscode testen, aber:
3
Foto von geralt: https://pixabay.com/en/board-school-uni-learn-work-test-361516/ (CC0 Public Domain Lizenz)
teuer und langwierig
Code meist kaum/nicht testbar
kein TDD möglich
![Page 38: TDLCR - OIO · 2020-06-08 · Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim Version: info@oio.de TDLCR Test Driven Legacy Code Refactoring Java Forum Nord Hannover,](https://reader034.vdocuments.site/reader034/viewer/2022050417/5f8d1b79b9f227111b7f7110/html5/thumbnails/38.jpg)
Test Driven Legacy Code Refactoring© Orientation in Objects GmbH 38
1. Identify what to change
2. Identify what to test
3. Break dependencies
4. Write the tests
5. Modify and refactoring
Foto von olafpictures: https://pixabay.com/en/germany-hermekeil-damphlok-museum-1349350/ (CC0 Public Domain Lizenz)
![Page 39: TDLCR - OIO · 2020-06-08 · Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim Version: info@oio.de TDLCR Test Driven Legacy Code Refactoring Java Forum Nord Hannover,](https://reader034.vdocuments.site/reader034/viewer/2022050417/5f8d1b79b9f227111b7f7110/html5/thumbnails/39.jpg)
Test Driven Legacy Code Refactoring© Orientation in Objects GmbH 39
Seam (Nahtstelle)Ein Seam ist eine Stelle, an der man das Verhalten editieren kann, ohne direkt an
dieser Stelle zu ändern.
Aufbrechen stark gekoppelter Abhängigkeiten aka Subclass and Extract
aka Extract and Override Call
aka … (weitere verschiedene Varianten)
![Page 40: TDLCR - OIO · 2020-06-08 · Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim Version: info@oio.de TDLCR Test Driven Legacy Code Refactoring Java Forum Nord Hannover,](https://reader034.vdocuments.site/reader034/viewer/2022050417/5f8d1b79b9f227111b7f7110/html5/thumbnails/40.jpg)
Test Driven Legacy Code Refactoring© Orientation in Objects GmbH
Subclass and Override
• es gibt protected Methoden für die externen Dependencies
• in einer Subklasse mit leerem oder speziellem Inhalt überschreiben
• Verwenden der Subklasse in den Tests
public void saveOrder(int orderId) {
Order order = orderRepository.getOrderById(orderId);
getOrderChanges();
saveOrderToFile(order);
}
protected void saveOrderToFile(Order order) {
// File IO
}
40
![Page 41: TDLCR - OIO · 2020-06-08 · Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim Version: info@oio.de TDLCR Test Driven Legacy Code Refactoring Java Forum Nord Hannover,](https://reader034.vdocuments.site/reader034/viewer/2022050417/5f8d1b79b9f227111b7f7110/html5/thumbnails/41.jpg)
Test Driven Legacy Code Refactoring© Orientation in Objects GmbH
Subclass and Override (2)
public class OrderServiceForTests extends OrderService {
@Override
protected void saveOrderToFile(Order order) {
// nichts tun (keine IO, keine externen Dependenies)
// oder order-Parameter extern überprüfbar machen
}
}
41
![Page 42: TDLCR - OIO · 2020-06-08 · Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim Version: info@oio.de TDLCR Test Driven Legacy Code Refactoring Java Forum Nord Hannover,](https://reader034.vdocuments.site/reader034/viewer/2022050417/5f8d1b79b9f227111b7f7110/html5/thumbnails/42.jpg)
Test Driven Legacy Code Refactoring© Orientation in Objects GmbH
Extract and Override Call
• zu überschreibenden Code zunächst herauslösen (Extract Method)
• dann wie Subclass and Override
public void sendOrderConfirmation(int orderId) {
Order order =
orderRepository.getOrderById(orderId);
Mail email = new MailMessage(defaultSender,
subject, ...));
smtpClient.send(email);
}
42
![Page 43: TDLCR - OIO · 2020-06-08 · Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim Version: info@oio.de TDLCR Test Driven Legacy Code Refactoring Java Forum Nord Hannover,](https://reader034.vdocuments.site/reader034/viewer/2022050417/5f8d1b79b9f227111b7f7110/html5/thumbnails/43.jpg)
Test Driven Legacy Code Refactoring© Orientation in Objects GmbH
Extract and Override Call
• zu überschreibenden Code zunächst herauslösen (Extract Method)
• dann wie Subclass and Override
public void sendOrderConfirmation(int orderId) {
Order order =
orderRepository.getOrderById(orderId);
Mail email = new MailMessage(defaultSender,
subject, ...));
smtpClient.send(email);
}
43
![Page 44: TDLCR - OIO · 2020-06-08 · Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim Version: info@oio.de TDLCR Test Driven Legacy Code Refactoring Java Forum Nord Hannover,](https://reader034.vdocuments.site/reader034/viewer/2022050417/5f8d1b79b9f227111b7f7110/html5/thumbnails/44.jpg)
Test Driven Legacy Code Refactoring© Orientation in Objects GmbH
Extract Pure Method/Function
• Codestellen isolieren
• Ziel: separat testen, Duplikation reduzieren
• Vorteil von reinen Methoden: seiteneffektfrei, keine Statusänderung
• Vorsicht: wir müssen Code ändern bevor Tests da sind
– immer kleine Schritte, Tools/IDEs für das Refactoring verwenden
– Extract Method ist typischerweise sicher
44
![Page 45: TDLCR - OIO · 2020-06-08 · Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim Version: info@oio.de TDLCR Test Driven Legacy Code Refactoring Java Forum Nord Hannover,](https://reader034.vdocuments.site/reader034/viewer/2022050417/5f8d1b79b9f227111b7f7110/html5/thumbnails/45.jpg)
Test Driven Legacy Code Refactoring© Orientation in Objects GmbH
Extract Interface
• Klasse extrahieren (Methode verschieben)
• Interface herausziehen
• Aufrufer ändern und das Interface verwenden
• leichter austauschbar gegen Dummy, Stub, Mock
45
![Page 46: TDLCR - OIO · 2020-06-08 · Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim Version: info@oio.de TDLCR Test Driven Legacy Code Refactoring Java Forum Nord Hannover,](https://reader034.vdocuments.site/reader034/viewer/2022050417/5f8d1b79b9f227111b7f7110/html5/thumbnails/46.jpg)
Test Driven Legacy Code Refactoring© Orientation in Objects GmbH
Viele weitere Refactorings für Legacy Code
46
![Page 47: TDLCR - OIO · 2020-06-08 · Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim Version: info@oio.de TDLCR Test Driven Legacy Code Refactoring Java Forum Nord Hannover,](https://reader034.vdocuments.site/reader034/viewer/2022050417/5f8d1b79b9f227111b7f7110/html5/thumbnails/47.jpg)
Test Driven Legacy Code Refactoring© Orientation in Objects GmbH
Weitere Tools/Hilfsmittel
• private Methoden testen
– nicht schön, aber praktisch
– per Reflection oder mit Frameworks
– z. B. private Pure- und Sprout-Methoden testen
• Mocking
– Exctract and Override und noch mächtiger
– Interaktion mit Umgebung testen
– erwartete Parameter und Aufrufreihenfolge sicherstellen
47
![Page 48: TDLCR - OIO · 2020-06-08 · Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim Version: info@oio.de TDLCR Test Driven Legacy Code Refactoring Java Forum Nord Hannover,](https://reader034.vdocuments.site/reader034/viewer/2022050417/5f8d1b79b9f227111b7f7110/html5/thumbnails/48.jpg)
Test Driven Legacy Code Refactoring© Orientation in Objects GmbH
Tools
48
Code Coverage
Approval Tests
Infinitest
Eclipse Metrics
![Page 49: TDLCR - OIO · 2020-06-08 · Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim Version: info@oio.de TDLCR Test Driven Legacy Code Refactoring Java Forum Nord Hannover,](https://reader034.vdocuments.site/reader034/viewer/2022050417/5f8d1b79b9f227111b7f7110/html5/thumbnails/49.jpg)
Test Driven Legacy Code Refactoring© Orientation in Objects GmbH 49
Legacy Code Retreat
Foto von Jmabel: https://commons.wikimedia.org/wiki/File:Seattle_-_Budokan_Dojo_judo_demo_04.jpg?uselang=de (CC BY-SA 3.0 Lizenz)
https://github.com/jbrains/trivia
![Page 50: TDLCR - OIO · 2020-06-08 · Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim Version: info@oio.de TDLCR Test Driven Legacy Code Refactoring Java Forum Nord Hannover,](https://reader034.vdocuments.site/reader034/viewer/2022050417/5f8d1b79b9f227111b7f7110/html5/thumbnails/50.jpg)
Test Driven Legacy Code Refactoring© Orientation in Objects GmbH
Links
• Code-Beispiel der Live-Demo
– https://github.com/sippsack/BadTelefon-Test-Driven-Legacy-Code-
Refactoring
• anderes Code-Beispiel für Legacy Code
– https://github.com/jbrains/trivia
• Blog: Techniken zu Legacy Code-Retreat
– http://blog.adrianbolboaca.ro/2014/04/legacy-coderetreat/
50
![Page 51: TDLCR - OIO · 2020-06-08 · Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim Version: info@oio.de TDLCR Test Driven Legacy Code Refactoring Java Forum Nord Hannover,](https://reader034.vdocuments.site/reader034/viewer/2022050417/5f8d1b79b9f227111b7f7110/html5/thumbnails/51.jpg)
Test Driven Legacy Code Refactoring© Orientation in Objects GmbH
Literaturhinweise
51
• Refactoring
– Sprache: Englisch
Gebunden - 464 Seiten - Addison Wesely
Erscheinungsdatum: 1. Juni 1999
ISBN: 0201485672
• Working Effectively with Legacy Code
– Sprache: Englisch
– Gebunden
![Page 52: TDLCR - OIO · 2020-06-08 · Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim Version: info@oio.de TDLCR Test Driven Legacy Code Refactoring Java Forum Nord Hannover,](https://reader034.vdocuments.site/reader034/viewer/2022050417/5f8d1b79b9f227111b7f7110/html5/thumbnails/52.jpg)
Orientation in Objects GmbH
Weinheimer Str. 68
68309 Mannheim
www.oio.de
? ?
??
?Fragen ?
![Page 53: TDLCR - OIO · 2020-06-08 · Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim Version: info@oio.de TDLCR Test Driven Legacy Code Refactoring Java Forum Nord Hannover,](https://reader034.vdocuments.site/reader034/viewer/2022050417/5f8d1b79b9f227111b7f7110/html5/thumbnails/53.jpg)
Orientation in Objects GmbH
Weinheimer Str. 68
68309 Mannheim
www.oio.de
Vielen Dank für Ihre
Aufmerksamkeit !