© IR Stone/Shutterstock.com
Informationen zu PHPUnit 9.0 aus erster Hand

Änderungen Schritt für Schritt


Für das PHP Testing Framework PHPUnit ist Anfang Februar eine neue Major-Version erschienen. PHPUnit 9.0 bringt einige Änderungen mit sich. Zwar enthält das Update keine signifikanten neuen Features, da diese erst ab 9.1 geplant sind. Doch der Code, der sich um das Laden der XML-Konfigurationsdatei kümmert, wurde neu geschrieben.

Die deutsche Sprache erlaubt durch die Verkettung von Substantiven die Bildung von praktisch endlos langen Wörtern. Wörter, wie beispielsweise „Hauptversionsnummerehöhungsangst“. Mit diesem Wort, oder vielleicht eher Unwort, beschreibt man die Angst vieler Softwareprojekte vor dem Erhöhen der Hauptversionsnummer (Englisch: Major Version), etwa von 8.5 auf 9.0. So lagen beispielsweise elf Jahre zwischen der Veröffentlichung von PHP 5.0 und der Veröffentlichung von PHP 7.0. Dass es auch anders geht, hat Mozilla mit dem Releaseprozess für den Firefox-Browser gezeigt, von dem alle sechs bis acht Wochen eine neue Major-Version erscheint. Ab diesem Jahr will Mozilla sogar alle vier Wochen eine neue Major-Version von Firefox veröffentlichen. Vor diesem Hintergrund ist die jährliche Erhöhung der Hauptversionsnummer von PHPUnit geradezu zahm.

Am 7. Februar 2020 ist mit PHPUnit 9 eine neue Major-Version des Standard-Test-Frameworks der PHP-Welt erschienen. Mit einer neuen Hauptversionsnummer wie 9 verbindet man üblicherweise eine Flut von neuen Features oder andere Leistungsverbesserungen. Das PHPUnit-Projekt handhabt das jedoch anders, und so bringt PHPUnit 9.0 keine signifikant neuen Features. Diese werden erst im Lauf des Jahres mit PHPUnit 9.1 etc. kommen.

Alle zwei Monate, und zwar am ersten Freitag im Februar, April, Juni, August, Oktober und Dezember, erscheint eine neue Version von PHPUnit. Bei der neuen Version im Februar handelt es sich um eine Major-Version, bei den anderen Versionen um Minor-Versionen. Den Grundsätzen von Semantic Versioning folgend bedeutet das, dass die Februar-Version nicht abwärtskompatibel mit den Vorgängerversionen ist und beispielsweise Features entfernt wurden. Die anderen Versionen hingegen sind zu ihren Vorgängern abwärtskompatibel und führen beispielsweise neue Features ein. Aber warum werden jedes Jahr im Februar Features aus PHPUnit entfernt oder so geändert, dass ein Anpassen der eigenen Tests notwendig wird?

Der Releaseplan für PHPUnit

PHPUnit ist fast zwanzig Jahre alt. Das bedeutet zum einen, dass Features, die vor fünf, zehn, fünfzehn oder gar zwanzig Jahren noch notwendig waren, heute keinen Nutzen mehr haben. In vielen Fällen, beispielsweise bei der Unterstützung des direkten Testens von privaten Objektattributen, hat alte Funktionalität nicht nur keinen Nutzen mehr, sondern vielmehr sogar einen negativen Effekt: Entwickler denken, nur weil es eine Funktionalität in PHPUnit gibt, ist es eine gute Idee, sie auch zu verwenden. Das kann im schlimmsten Fall dazu führen, dass man Software unsauber entwickelt. Zum anderen muss eine Software wie PHPUnit ständig an Änderungen im Ökosystem angepasst werden: neue Versionen von PHP sind ebenso zu unterstützen wie neue Distributionskanäle. Die Migration einer Codebasis wie der von PHPUnit ist eben nicht über Nacht von PHP 5 nach PHP 7 zu bewerkstelligen. Und auch die Ablösung von PEAR-Paketen durch die Unterstützung für Composer, PHP Archive (PHAR) hat damals einiges an Zeit gekostet. Darüber hinaus steigt die Komplexität des Codes durch Workarounds für Bugs in bestimmten PHP-Versionen und durch die Unterstützung unterschiedlicher PHP-Versionen in derselben PHPUnit-Version ebenso wie durch das Hinzufügen neuer Funktionalität. Lange Zeit war ich mehr oder weniger der einzige Entwickler von PHPUnit, weil eben nur ich bereit war, mit dieser Codebasis zu arbeiten. Das war meine Schuld, da ich vor zwanzig Jahren nicht schon wusste, was ich heute über Architektur und Programmierung weiß, und die Konsequenzen von Designentscheidungen nicht absehen konnte.

Alberto Brandolini beschreibt eine solche Situation wie folgt: „The dark secret of the Dungeon Master is that he knows every trap in the existing legacy software, because he was the one to leave the traps around. [...] Knowledge, in the form of accidental complexity starts accumulating in the head of the Dungeon Master, and silently grows.“ [1]

Es tröstet mich ein wenig, dass ich damit nicht alleine bin. Erich Gamma und Kent Beck, die ursprünglichen Autoren von JUnit, haben ähnliche Probleme: „The problem is in software design often the consequences of your decisions don’t become apparent for years. One of the advantages of having to live with JUnit for 8 years, is now we can look back and see which decisions we made worked nicely and which we would have done differently.“ [2]

Mittlerweile hat sich die Situation deutlich gebessert. Zum einen tragen die jährlichen Major-Versionen, die sowohl Funktionalität aus PHPUnit entfernen beziehungsweise so verändern, dass Implementierung und Verwendung einfacher werden, als auch Unterstützung für alte PHP-Versionen entfernen, dazu bei, dass die Codebasis von PHPUnit verständlicher und wartbarer wird. Zum anderen haben die regelmäßigen Code-Sprints der letzten Jahre dazu beigetragen, dass neue Entwickler zum PHPUnit-Projekt hinzugekommen sind, die mich nun bei meiner Arbeit unterstützen. Marco Pivetta fasst das wie folgt zusammen: „[PHPUnit] has been very stale for ages, and is now moving much faster thanks to people now willing to invest time in it (thanks to constant rework and cleaning).“ [3]

Die Änderungen von PHPUnit 9.0

Nachdem das Warum der jährlichen Änderungen nun hoffentlich klarer geworden ist, ist es Zeit, dass wir uns die Änderungen von PHPUnit 9 genauer anschauen.

PHPUnit 9 benötigt PHP 7.3 (oder neuer)

Die aktive Unterstützung von PHP 7.2 durch das PHP-Projekt endete am 30. November 2019. Nach heutigem Stand werden nur PHP 7.3 und PHP 7.4 offiziell und aktiv unterstützt. PHPUnit 9 wird auf PHP 7.3 und PHP 7.4 unterstützt. Wenn Ende des Jahres PHP 8 erscheint, so wird auch diese Version sehr wahrscheinlich von PHPUnit 9 unterstützt werden. Wenn Sie noch PHP 7.2 einsetzen, dann sollten Sie jetzt mit der Migration auf eine a...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang