Unit-Testing und Refactoring sind zwei wichtige Disziplinen, die im Kern der heutigen professionellen Softwareentwicklung liegen. Sie ermöglichen es, den Code gegenüber Änderungen abzusichern und in einer guten Form zu halten.
Manchmal werden diese Disziplinen jedoch als zweitrangig betrachtet und vernachlässigt. Das Ergebnis der "eigentlichen Entwicklung" ist stark-gekoppelter Code ohne Tests. Solch ein Code, auch wenn er vor kurzem geschrieben wurde, wird von Software-Craftsmanship Pionieren wie Michael Feathers und Robert C. Martin als Legacy betrachtet und zum Verrotten vorbestimmt. Denn dem fehlt eine gute Test-Suite, die das Degenerieren verhindert.
Hier ist die oft empfohlene Strategie, den Code zuerst mit Tests abzudecken und erst dann Änderungen und Refactorings einzubringen. Bei der Arbeit mit Legacy Code ist jedoch die nachträgliche Abdeckung mit Tests kein leichtes Ziel. Exzessive Abhängigkeiten zwischen den Klassen, die wegen der Abwesenheit von Unit-Testing bei der "eigentlichen Entwicklung" unbemerkt entstanden sind, machen ein isoliertes Testen der Klassen unmöglich.
Oftmals steht man vor dem von Refactoring-Dilemma, welches Michael Feathers in seinem Buch "Working Effectively with Legacy Code" beschrieben hat -- um sicher zu refaktorisieren, braucht man Tests, aber um überhaupt irgendwelche Tests schreiben zu können, muss der Code vorher durch Refactoring testbar gemacht werden.
Wenn man sich dafür entscheidet, den Code mit Tests abzudecken, in der Form wie er, dann steht man vor einigen subobtimalen Optionen. Die exzessiven Abhängigkeiten verhindern isolierte Unit-Tests oder ermöglichen nur sehr schlechte Unit-Tests. Man muss dann entweder auf Integrationstests ausweichen oder "Power-Mocking"-Frameworks einsetzen, welche die schlechten Strukturen weiter zementieren.
In diesem interaktiven Workshop fokussieren wir uns auf Refactorings, die den Code testbar machen. Diese können gezielt für das nachträgliche Einbringen von Unit-Tests in legacy Code eingesetzt werden. Wir werden typische Situationen ausarbeiten und einige wichtige Aspekte vom objektorientierten Entwurf beleuchten, die für die Testbarkeit entscheidend sind.
Sources: https://github.com/rusio/refactoring-for-tests