Dies ist ein großartiger Thread, und ich mag beide Antworten von @KAndy und @fschmengler sehr.
Ich möchte einige zusätzliche Gedanken hinzufügen, die ich wertvoll finde, wenn ich eine Frage stelle wie "Soll ich X testen?" oder "Wie soll ich X testen?".
Was könnte schiefgehen?
- Ich könnte einen dummen Tippfehler machen (passiert die ganze Zeit).
Dies rechtfertigt normalerweise nicht das Schreiben eines Tests.
- Kopiere ich den benötigten Code aus dem Core oder einem anderen Modul und passe ihn dann an meine Bedürfnisse an?
Ich finde das eigentlich eine sehr gefährliche Sache, die oft subtile Fehler hinterlässt. In diesem Fall schreibe ich lieber einen Test, wenn er nicht zu teuer ist. Wenn die Konfiguration der Quellmodelle tatsächlich basiert, werden sie IMO riskanter.
- Kann es einen Konflikt mit einem anderen Modul geben?
Dies gilt fast nur für Konfigurationscode. In einem solchen Fall möchte ich einen Integrationstest haben, der mir sagt, wann das passiert.
- Könnte Magento die API in einer zukünftigen Version ändern?
In diesem Fall sehr unwahrscheinlich, da Ihr Code nur von einer Schnittstelle abhängt. Aber je konkreter Klassen involviert sind oder wenn mein Code eine Kernklasse erweitert, wird dies zu einem potenziellen Risiko.
- Eine neue PHP-Version könnte meinen Code beschädigen. Oder vielleicht möchte ich PHP 5.6 für die kommenden Jahre unterstützen.
Auch hier sehr unwahrscheinlich, aber in einigen Fällen möchte ich einen Test, der mich warnt, sollte ich den Code in Zukunft ändern, um inkompatible Syntax zu verwenden.
Wie teuer ist es, den Code zu testen?
Dies hat zwei Aspekte:
- Der Aufwand und die Zeit, die zum Schreiben eines Tests benötigt werden
- Der Aufwand und die Zeit, die zum Testen des Codes benötigt werden, den ich manuell schreiben werde.
Während der Entwicklung eines Codeteils muss ich den Code, den ich schreibe, häufig ausführen, bis ich ihn für erledigt halte. Dies ist mit einem Unit-Test natürlich viel einfacher.
In Ihrem Fall ist das Schreiben eines Tests absolut billig. Es braucht nicht viel Zeit oder Mühe. @KAndy hat Recht, dass der gesamte Code beibehalten werden muss, aber andererseits müssen nicht alle Tests beibehalten werden.
Dies könnte ein Beispiel sein, in dem ich einen Komponententest schreibe, um zu überprüfen, ob ich keinen dummen Fehler mache, und ihn dann zu löschen, sobald die Klasse beendet ist. Wenn ein Test keinen langfristigen Wert liefert, halte ich das Löschen für sinnvoll.
Diese Frage ist auch wichtig für die Auswahl des zu schreibenden Testtyps: Einheit oder Integration zum Beispiel.
Wie wertvoll ist der Code, den ich schreibe?
Wenn ein Code, den ich schreibe, für den Service eines Moduls unerlässlich ist, teste ich ihn, unabhängig davon, wie trivial er ist.
Wenn es sich nur um eine kleine Dienstprogrammmethode handelt, die sich beispielsweise auf die Benutzeroberfläche konzentriert und nicht Teil der Geschäftslogik ist, ist dies möglicherweise nicht der Fall.
Muss sich der Code ändern?
Mit der Zeit habe ich mich so an die Testabdeckung gewöhnt, dass sich das Ändern von nicht abgedecktem Code sehr unsicher anfühlt. Dazu gehören so einfache Dinge wie das Hinzufügen einer Option zu einem Quellmodell, aber auch Dinge wie das Verschieben einer Klasse in einen anderen Ordner / Namespace oder das Umbenennen einer Methode.
Es ist von unschätzbarem Wert, Tests für solche Änderungen durchzuführen.
Benötigt es Dokumentation?
Wie schwer ist es, den Code zu verwenden? In Ihrem Beispiel ist es trivial, aber in einigen komplexeren Fällen ist ein Test für Dokumentationszwecke für andere Entwickler (oder mich selbst in einigen Monaten) großartig.
Erforschung und Lernen
Wenn ich an einem Code arbeite und nicht sicher bin, wie ich ihn testen soll, finde ich es sehr wertvoll, einen Test zu schreiben. Der Prozess gibt mir fast immer ein tieferes Verständnis dafür, womit ich es zu tun habe.
Dies gilt insbesondere für Entwickler, die sich immer noch als Testlerner betrachten.
Dies ist auch ein Beispiel, bei dem es möglicherweise sinnvoll ist, den Test anschließend zu löschen, da der Hauptwert darin bestand, zu lernen.
Disziplin und Stress
Das Festhalten an der Rot-Grün-Refaktor-Schleife hilft mir, schnell zu gehen. Dies gilt insbesondere unter Druck. Selbst wenn ein Teil des Codes nicht wirklich testwürdig ist, kann ich TDD dennoch folgen, insbesondere wenn der Code trivial zu testen ist.
Dies hält mich im Fluss und wachsam.
Was und wie testen?
Denken Sie auch daran, dass Sie den Test in sehr unterschiedlicher Granularität schreiben können.
- Testen des genauen Rückgabewerts.
Dies wird ein sehr strenger Test sein, der an jede Änderung angepasst werden muss. Möchten Sie, dass der Test beispielsweise unterbrochen wird, wenn sich die Reihenfolge der Elemente im Rückgabearray ändert?
- Testen der Struktur des Rückgabewerts.
Für das Quellmodell könnte dies sein, dass jedes Unterarray als zwei Datensätze überprüft wird, einer mit einem label
und einer mit einem value
Schlüssel.
- Überprüfen der Klassenimplemente
ArrayInterface
.
- Das Testen der Klasse bietet
getOptions()
, obwohl diese Methode nicht Teil der implementierten Schnittstelle ist.
Berücksichtigen Sie für jede mögliche Sache, die getestet werden kann, Wert, Wartbarkeit und Kosten.
Zusammenfassung
Um es zusammenzufassen: Es gibt keine echte Einzelantwort auf eine Frage, ob ein Code getestet werden soll oder nicht. Die Antwort ist je nach den Umständen für jeden Entwickler unterschiedlich.