5 Tipps für bessere Testnamen
Tests erfüllen unterschiedliche Zwecke in der Softwareentwicklung. Ein oft vernachlässigter Zweck ist die Dokumentation des Codes und dessen Intention: Tests können die Nutzung des Codes und mögliche Grenzfälle demonstrieren.
Als Dokumentation sollten Tests einfach und schnell verständlich sein. Wichtig ist hierfür, dass der Entwickler nicht nur die technische Nutzbarkeit des Tests im Sinn hat, sondern bei der Formulierung auch die Menschen berücksichtigt, die den Code verstehen wollen. Aussagekräftige Testnamen sind hierbei essenziell. Sie dienen als Überschriften für die Testmethoden und geben erste Hinweise auf deren Inhalte.
Testnamen, die spezifische Anforderungen an den Code in der Domainsprache beschreiben, verbessern zum einen den Wert und zum anderen die Qualität von Tests. Dieser Artikel gibt fünf Tipps zum Erstellen solcher Testnamen.
Den Wert von Tests verbessern
Tests sind wertvoll, da sie Domänenwissen in den Code einbringen, eine lebende Dokumentation des Codes darstellen und Regression identifizieren. Durch gute Testnamen kann dieser Wert weiter gesteigert werden.
1.) Nutze Domänensprache in Testnamen
Die Nutzung der Domänensprache im Code, wo immer möglich, führt zu einer stärkeren Angleichung des Codes an die Anforderungen. Testnamen sind eine der seltenen Gelegenheiten, an denen Code ganze Sätze enthalten kann.
Werden hier Anforderungen prägnant formuliert, sind diese direkt im Code vorhanden und für die Tester trotzdem einfach lesbar. Dies ist ein großer Vorteil für die Dokumentation und Verständlichkeit des Codes.
2.) Beschreibe Anforderungen in einem prägnanten Satz
Beschreibe alle Anforderungen an das zu testende Objekt in jeweils einem prägnanten Satz in der Domänensprache, bevor du mit dem Schreiben der Tests beginnst.
Verwende diese Sätze als Testnamen, denn sie bilden eine solide Grundlage für die Implementierung der Tests. Dieses Vorgehen eignet sich besonders gut für Test-Driven Development.
Tests können als lebende Dokumentation des Produktionscodes fungieren, denn sie testen den Code, zeigen durch rote oder grüne Tests welche Anforderungen der Code erfüllt und bieten damit einen Überblick über - im besten Falle - alle Anforderungen an den Code.
Die Summe der Testnamen kann somit eine Speisekarte der Code-Fähigkeiten darstellen.
3.) Nutze einfach zu lesende Strings
Wenn möglich, nutze Strings als Testnamen (z.B. in Javascript oder Kotlin). Alternativ bietet wahrscheinlich snake_case die beste Lesbarkeit.
Fehlschlagende Tests identifizieren Regression des Codes schnell und ohne die Notwendigkeit aufwendigen Debuggings - und garantieren so die Funktionalität der Software. Prägnante Testnamen helfen dem Entwickler, Fehler zu verstehen, ohne einen Blick in die Testmethode werfen zu müssen.
Einfach lesbare Testnamen verbessern das schnelle Verständnis. Wenn es z.B. um das Mischen eines Kartendecks geht, ist aShuffledDeckIsInRandomOrder
weniger gut lesbar als
a shuffled deck is in random order
Die Qualität von Tests verbessern
Nur qualitativ hochwertige Tests können die zuvor beschriebenen Werte umsetzen. Wichtige Qualitäten sind kurze und prägnante Testmethoden, sowie das Testen der Intention anstatt der Implementierung des Codes.
4.) Vermeide das Wort "Test" im Namen
Vermeide das Wort ‘test’ im Namen, denn es führt meist zu überladenen Tests. Es kann stattdessen hilfreich sein, mit den Wörtern ‘must’ oder ‘should’ zu beginnen und den Satz mit dem zu testenden Element als implizitem Subjekt zu vollenden.
Kurze Tests spezifischer Anforderungen sind nicht nur einfacher verständlich, sie tragen außerdem enorm dazu bei, Regression zu identifizieren. Testnamen in der Domänensprache, die Anforderungen widerspiegeln, führen zu kurzen und prägnanten Tests.
Die spezifische Formulierung der Anforderung im Namen begrenzt den Testinhalt. Tests mit Namen wie testShuffling
oder testShufflingIsCorrect
sind nicht sehr spezifisch und laden dazu ein, mehrere Anforderungen in einer Testmethode zu prüfen. Spezifischere Anforderungen könnten hier z.B. sein:
a shuffled deck includes the same cards as the original deck
oder
a shuffled deck is in random order
Das Spezifizieren von Testnamen grenzt die Aufgabe eines bestimmten Tests ein und resultiert in einem prägnanten Testinhalt.
5.) Vermeide Implementierungsdetails
Formuliere Testnamen so, dass sie Anforderungen an die zu testende Einheit beschreiben, keine Implementierungsdetails beinhalten und keiner fixen Namensregel unterliegen. Füllwörter wie ‘given’, ‘when’ oder ‘then’ können hilfreich bei der Erstellung des Testnamens sein, führen aber häufig zu schlecht lesbaren Namen für die Tester.
Um sicherzustellen, dass der Code die Anforderungen genau erfüllt, sollten Tests die Intention des Codes testen und keine spezifische Implementierung. Das Testen der Intention kann durch die Nutzung von Testnamen forciert werden, die Anforderungen beschreiben ohne jedoch Implementationsdetails preiszugeben.
Oft genutzte Namensregeln für Tests wie methodName_expectedResult_whenInput
, z.B. genutzt in shuffle_deckContainsValidDeck_validDeck
, leaken Implementierungsdetails wie Methodennamen oder Rückgabewerte von Methoden. Diese Informationen sind schlecht lesbar und duplizieren den Inhalt der Testmethode.
Namen wie
a shuffled deck includes the same cards as the original deck
beschreiben die Anforderung genau, ohne Implementierungsdetails zu beinhalten.
Fazit
Testnamen, die spezifische Anforderungen prägnant in der Domänensprache beschreiben, können den Wert und die Qualität von Tests deutlich verbessern.
Sie führen zu einfachen, verständlichen Tests, bieten eine Dokumentation des Codes und seiner Intention, reichern den Code mit Domänenwissen und -sprache an, identifizeren Regression effektiv und führen daher zu einem effizienteren Software-Entwicklungsprozess.
Wer Interesse an weiteren Beispielen guter Testnamen in verschiedenen Anwendungsfällen hat, dem sei das folgende Video ans Herz gelegt. Hier wird außerdem auf die Themen Inhalt und Strukturierung von Tests näher eingegangen.
Wer noch mehr zum Thema "Tests" wissen will, dem empfehle ich einen Blick in die lise Academy zum Thema Behavior Driven Development und automatisierte Tests.