Kore Nordmann Qafoo GmbH

Funktionale Tests sind ein exzellentes Hilfsmittel, um funktionierenden Code auch während komplexerer Refactorings sicherzustellen. Refaktorierter Code kann die Produktivität maßgeblich steigern, ohne lange Pausen in der Weiterentwicklung einlegen zu müssen.

Wie schon oft diskutiert ist es nahezu nie sinnvoll, Software neu zu schreiben. Existierende Software sollte, insbesondere wenn niemand mehr genau versteht, was sie macht, refaktorisiert werden. Refactoring bezeichnet die Technik, die internen Strukturen von existierendem Code zu ändern, ohne dessen Funktionalität zu beeinträchtigen. Wie kann das, gerade bei größeren Applikationen, erreicht werden?

Kurz zusammengefasst erhöht sich bei einem Rewrite nur in den seltensten Fällen tatsächlich die Softwarequalität, es gehen Features verloren, denen sich keiner der Stakeholder mehr bewusst war (üblicherweise etwa 40 Prozent) und die Umsetzung dauert immer deutlich länger als antizipiert. Außerdem können oft während eines Rewrites keine neuen Features mehr implementiert werden, wenn man nicht ein neues Team schafft, dass dann entsprechend weniger Wissen über die existierende Softwarefunktionalität hat.

Die einfachste Variante, um sicherzustellen, dass Funktionalität erhalten bleibt, sind automatisierte Tests. Automatisierte Tests für Software werden jedoch oftmals mit Unit-Tests gleichgesetzt und genau diese lassen sich im Normalfall nicht für alte Software schreiben. Es ist immer noch üblich, dass exzessiv statische Methodenaufrufe stattfinden und Singletons oder statische Registries verwendet werden. Diese und andere veralteten Strukturen erschweren das Schreiben von Unit-Tests deutlich und sind nicht zuletzt oft entscheidende Gründe, warum ein Refactoring in Angriff genommen werden soll. Ein Teufelskreis.

Der Ablauf

Automatisierte Tests müssen nicht immer Unit-Tests sein. Andere Testformen wie Integrationstests, Akzeptanztests oder funktionale Tests haben ebenfalls ihre Daseinsberechtigung. Und genau die funktionalen Tests können uns beim Refactoring helfen. Funktionale Tests haben die Aufgabe sicherzustellen, dass Software eine gewisse Funktion oder Aufgabe erfüllt. Dabei wird bei einer Webapplikation zum Beispiel getestet, dass der Check-out in einem Onlineshop funktioniert, in dem dieser komplett ausgeführt wird. Die Idee ist folgende:

 

  1. Ein Anwendungsfall der Software wird durch einen funktionalen Test beschrieben.
  2. Wir stellen sicher, dass der zu refaktorisierende Code durch die Tests abgedeckt wird.
  3. Der Code kann refaktorisiert werden.
  4. Wir können Unit-Tests für wichtigen neuen Code schreiben.

 

Durch den angedeuteten Weg ist sichergestellt, dass zumindest der getestete Anwendungsfall weiter funktioniert. Der Code kann mit den hier später beschriebenen Techniken angepasst und aufgeräumt werden. Für den neuen sauberen Code können Unit-Tests geschrieben werden – dies sollte im Normalfall schon direkt während des Refactorings passieren.

Den vollständigen Artikel lesen Sie in der Ausgabe:

PHP Magazin 4.16 - "Expressive"

Refactoring ist oft ein notwendiges Übel. Wie man es schafft, dass man auch während des Refactorings funktionierenden Code hat, zeigt Kore Nordmann im PHP Magazin 4.16.

Alle Infos zum Heft
244272Funktionale Tests im Refactoring
X
- Gib Deinen Standort ein -
- or -