Die Theorie der Stückprüfung, Teil 1

Wir haben uns mit Unit-Tests für die WordPress-Entwicklung befasst. Anhand von praktischen Beispielen haben wir überprüft, wie Unit-Tests sowohl für Plugins als auch für Themes aussehen. Wir haben jedoch nicht wirklich über die Theorie der Unit-Tests gesprochen.

Das heißt, dass wir uns nicht auf höchster Ebene angeschaut haben, was es ist, warum es von Vorteil ist und wie wir es in unseren Workflow integrieren können. In der nächsten Artikelserie werden wir Unit-Tests definieren, die wichtigsten Vorteile abdecken, warum wir uns darum kümmern sollten, und einige der Ressourcen, die wir für unsere Arbeit nutzen können.

Es gibt zwar keinen Code, der für dieses spezielle Lernprogramm durchgearbeitet werden muss, es sollte jedoch eine solide Grundlage für die praktische Anwendung der vorherigen Artikel bieten.


On Unit Testing Themes und Plugins

Bevor ich in den Artikel eintauche, denke ich, ist es wichtig zu überlegen, warum man Themen und Plugins überhaupt testen sollte.

Bis vor kurzem wurde WordPress hauptsächlich als Blogging-Plattform und als Content-Management-System angesehen. Es tut beides sehr Nun, aber da die Entwickler ihre umfangreiche API entdecken, wird es immer beliebter, bestimmte Arten von Anwendungen zu erstellen, die WordPress als zugrunde liegende Plattform verwenden.

Darüber hinaus sind Designs mehr als Skins für eine Website - sie sind mehr als ein Stylesheet und einige Vorlagendateien zur Anzeige von Daten. In der Tat, jetzt, mehr als je zuvor, widmen ganze Teams Zeit (und leben sogar davon), Themes für WordPress zu produzieren. Lassen Sie sich also nicht vom Wort "Thema" in die Irre führen - Themen sind wie Anwendungen für WordPress. Sie fügen Funktionen hinzu, sie bereiten Daten vor und nach und geben oft wichtige Funktionen in WordPress ein, die weit über das bloße Facelift Ihrer Website hinausgehen.

Schließlich sind Plugins fast mehr anwendungsähnlicher als Themen. Betrachten Sie es so: Plugins erweitern den Kern von WordPress und arbeiten oft unabhängig von Themen. Stattdessen fügen sie dem Kern von WordPress brandneue Funktionen hinzu, von denen alle Designs profitieren können.

Ich sage das alles, um eine Perspektive zu geben, warum Unit-Tests, wie wir gleich entdecken werden, sich vielfach auszahlen werden, wenn sie im Zusammenhang mit komplexeren Themes und Plugins verwendet werden.


Was ist Unit Testing??

Darauf haben wir im ersten Artikel der Serie kurz eingegangen. Ich möchte keine vollständige Zusammenfassung des bereits Geschriebenen geben, deshalb fasse ich die Punkte hier zusammen:

  • Es ist die Praxis, sicherzustellen, dass funktionale Codeeinheiten wie erwartet funktionieren
  • Es gibt uns die Möglichkeit, Fehler in unserem Code zu finden, bevor er in die Wildnis entlassen wird
  • Code wird widerstandsfähiger gegen Änderungen, da er ständig getestet wird

Aber das kratzt nur an der Oberfläche.

Einheiten definieren

Um die Einheiten Ihres Themas oder Plugins wirklich zu verstehen, müssen Sie darüber nachdenken, was ein Theme ausmacht. Normalerweise ist dies eine Kombination aus:

  • Stylesheets, die dem Thema seine Präsentation geben
  • JavaScript (normalerweise jQuery-basiert), das das clientseitige Verhalten verwaltet
  • PHP, das serverseitige Verarbeitung abwickelt

Obwohl es Framework-Testframeworks speziell für JavaScript gibt, werden wir uns mehr auf den PHP-Aspekt der WordPress-Entwicklung konzentrieren. Wäre es nicht um die serverseitige Funktionalität gegangen, gäbe es in WordPress kaum eine einzigartige Funktionalität.

Nachdem dies gesagt wurde, gibt es mehrere Möglichkeiten, eine Einheit zu definieren, aber ich würde wetten, dass die meisten Leute eine Einheit als Funktion definieren. In den meisten Fällen ist das richtig, aber es bedeutet nicht, dass unsere Funktionen die optimalsten Einheiten zum Testen sind. Zum Beispiel bestehen Funktionen oft aus mehreren Blöcken - vielleicht Schleifen, vielleicht Bedingungen oder Aufrufen anderer Funktionen.

Wie dem auch sei, in Methoden sind oft kleinere Funktionalitätseinheiten enthalten.

Ist es wirklich richtig zu sagen, dass beim Komponententest jede Funktion eines Themas getestet wird? Nicht wirklich. Da ein einzelner Codeblock - oder in einigen Fällen eine einzelne Anweisung - für das Erreichen einer bestimmten Aufgabe verantwortlich ist, diese würde wahre Codeeinheiten ausmachen.

Und wenn wir Unit-Tests schreiben sollen, wie schreiben wir Tests für die Einheiten, die in unseren Funktionen vorhanden sind?

Weitere Tests, mehr Methoden

Ich erinnere daran, dass ich früher in der Serie gesagt habe:

  • Schreiben Sie zuerst Ihre Tests und führen Sie sie dann aus (natürlich scheitern sie).
  • Schreiben Sie Code, um zu versuchen, die Tests zu bestehen
  • Führen Sie die Tests aus. Wenn sie vorübergehen, bist du gut; Andernfalls arbeiten Sie weiter an der Funktion

Dies ist der Punkt, an dem eine der größten Verschiebungen beim Schreiben von durch Testeinheiten geschriebenem Code auftritt: Sie brechen Funktionalitätseinheiten in das kleinste mögliche atomare Stück auf. Sicher, dies führt oft zu einer großen Anzahl sehr kleiner Funktionen, aber das ist eine schlechte Sache?

Dabei hat jede Funktion wirklich einen einzigen Zweck. Wenn Sie jedoch davon ausgehen, dass Ihre Funktion eine einzige Funktion ausführt, gibt es nur so viele Möglichkeiten, die Funktion zu benennen, was letztendlich zu deutlich lesbarerem Code führen kann.

Natürlich gibt es einen Kompromiss, da Sie beim Schreiben dieser zusätzlichen Funktionen tatsächlich ein paar weitere Codezeilen einführen, aber wenn Sie mit einem Team von anderen Personen an einem Produkt arbeiten, das von Tausenden von Kunden verwendet wird Sie müssen sich fragen, ob der zusätzliche Code die Qualität wert ist, die Sie beim ordnungsgemäßen Testen Ihrer Arbeit gewinnen können. Richtig gemacht, dein Team sollte Sie können der Logik des Codes leichter folgen und das Produkt wird ein Qualitätsniveau aufweisen, das ohne Schreiben von Komponententests oft schwer zu erreichen ist.

Einheiten und Suiten

Ein wichtiger Aspekt bei Unit-Tests ist, dass sie nicht voneinander abhängig sind. Ein einzelner Komponententest sollte nur eine Sache testen. Außerdem bedeutet dies, dass ein Unit-Test eigentlich nur eine einzige Assertion enthalten sollte (es gibt jedoch Ausnahmen, die hier gezeigt werden)..

Denken Sie daran: Der Zweck eines Komponententests besteht darin, die Qualität einer einzelnen Codeeinheit zu bewerten. Einige Einheiten akzeptieren Argumente, andere nicht, andere geben Werte zurück, andere nicht. In jedem Fall sollte Ihr Gerätetest alle Fälle auswerten. Eine einzelne Codeeinheit hat selten einen einzigen Test.

Stattdessen würde ich sagen, dass eine gute Faustregel lautet, dass die Anzahl der mit einer Codeeinheit verknüpften Tests exponentiell auf der Grundlage der Anzahl der akzeptierten Eingaben skaliert.

Zum Beispiel:

  • Wenn Ihr Gerät keine Argumente akzeptiert, wird es wahrscheinlich einen Test geben
  • Wenn Ihre Einheit ein Argument akzeptiert, gibt es wahrscheinlich zwei Tests - einen für das erwartete Argument und einen für das unerwartete
  • Wenn Ihr Gerät zwei Argumente akzeptiert, gibt es wahrscheinlich vier Tests - einen für jede Kombination von Argumenten: erwartet, erwartet; erwartet, unerwartet; unerwartet erwartet; und unerwartet, unerwartet

Sinn ergeben? Der Schlüssel zum Mitnehmen ist, dass Sie wesentlich mehr Tests durchführen werden, als Einheiten vorhanden sind. Es gibt kein Verhältnis von 1: 1.

Schließlich wird beim Komponententest häufig das Wort "Testsuite" oder "Suite" angezeigt, wenn die Tests besprochen werden. Dies kann je nach Kontext variieren, in dem der Test stattfindet. Wenn Sie jedoch mit WordPress arbeiten, bezieht sich dies normalerweise auf eine Sammlung von Komponententests.

Nehmen wir an, Sie haben eine Datei, die für das Testen aller Funktionen rund um das Schreiben und Veröffentlichen eines Posts verantwortlich ist. Diese Datei wäre die Testsuite für Posts. Einfach genug, richtig? Es ist wichtig, diese Terminologie zu verstehen, falls Sie in weiterführender Lektüre darauf stoßen, da sie sich leicht unterscheiden kann, wenn Sie beispielsweise mit Rails oder .NET arbeiten.

Plattform-Agnostiker

Schließlich ist das Testen von Einheiten keine neue Methode, und es ist nicht streng auf PHP beschränkt. In der Tat gibt es Unit-Testing (oder testgetriebene Entwicklung insgesamt) bereits seit über einem Jahrzehnt.

Sie können Gerätetest-Frameworks für Java, .NET, Rails, PHPUnit (natürlich) und so weiter finden.

Aber die Adoption ist gemischt - manche Menschen leben und sterben durch sie, andere hassen es, und dann gibt es diejenigen von uns, die damit beginnen wollen, aber die praktische Anwendung ausgleichen müssen, um sie in ein bestehendes Projekt zu integrieren und das zu verstehen Die Menge an Refactoring kann dies erfordern.


Als nächstes

Was die Theorie angeht, fangen wir gerade erst an.

Im nächsten Artikel werfen wir einen Blick auf die wichtigsten Vorteile von Unit-Tests und wie sich dies in unserer auf WordPress basierenden Entwicklung auszahlen kann. Wir untersuchen auch die Vorteile, die das Testen von Einheiten für Architektur, Design und Dokumentation bietet.

Natürlich sind Unit-Tests nicht ohne Nachteile, daher werden wir uns auch diese ansehen.