Die Theorie der Stückprüfung, Teil 2

Im letzten Artikel haben wir begonnen, über die Theorie des Unit-Tests in WordPress zu sprechen. Insbesondere haben wir unsere Arbeit zu Unit-Test-Themen und Plugins überprüft und dann mit Code-Einheiten, deren Auswirkungen auf unsere Tests begonnen. Außerdem haben wir die Unit-Tests in der größeren Welt der Softwareentwicklung überprüft.

Wir werden die Theorie des Einheitentests in WordPress weiter diskutieren, werden dies jedoch anhand der Perspektive, wie Probleme gelöst werden können, die Architektur des Laufwerks zu steuern, das Projekt zu dokumentieren und vieles mehr.


Probleme finden, Zeit sparen

Erinnern Sie sich an früher in dieser Serie, dass der traditionelle Test von Komponententests folgendermaßen ist:

  • Schreiben Sie einen Test, führen Sie ihn aus (wissen Sie, dass er fehlschlagen wird)
  • Schreiben Sie die Funktion, damit die Methode erfolgreich ist.
  • Führen Sie die Tests aus. Schlägt der Test fehl, arbeiten Sie weiter an der Funktion. Fahren Sie andernfalls mit dem nächsten fort.

Ja, der erste Schritt ist ein bisschen dogmatisch. Warum verschwenden Sie Minuten, wenn etwas läuft, von dem Sie wissen, dass es nicht funktioniert? Trotzdem hast du die Idee. Wenn Sie jedoch anfangen, diese bestimmte Technik in der Entwicklung anzuwenden, werden Sie feststellen, dass Sie einen bestimmten Rhythmus beim Schreiben Ihres Codes entwickeln. Dies ist Teil des gesamten Ziels.

Aber das ist nur die Hälfte davon - Unit-Tests können tatsächlich dazu beitragen, Probleme früher in der Entwicklung zu erkennen.

Um dies zu verstehen, ist es wahrscheinlich am besten, sich wieder mit der Idee zu beschäftigen.

Angenommen, Sie arbeiten an einer Funktion für ein WordPress-basiertes Projekt, in der Benutzer ein Benutzerkonto erstellen können, ohne sich im WordPress-Dashboard anmelden zu müssen. Dies setzt voraus, dass Sie über eine Seitenvorlage für die Registrierung, die erforderliche Validierung und den Code zum Generieren von Kennwörtern und E-Mails verfügen.

Sie laden die Seite in Ihren Browser und versuchen, ein paar Benutzer zu erstellen - einige mit derselben E-Mail-Adresse, einige mit unpassenden Kennwörtern, einige mit unzulässigen Zeichen usw. Sie verstehen, worauf es ankommt - es gibt n Möglichkeiten für die Überprüfung passieren und scheitern Das ist grob! Dies bedeutet, dass Sie bei jeder Änderung der Benutzerregistrierungsfunktion die gleiche Anzahl von Registrierungen durchführen müssen, um sicherzustellen, dass nichts beschädigt ist.

Oder Sie können eine Reihe von Tests schreiben, um sich darum zu kümmern, und diese bei jeder Änderung des Codes ausführen.

Ja, das Schreiben von Unit-Tests kann im Vorfeld viel Zeit in Anspruch nehmen. Beachten Sie jedoch, wie viel Zeit Sie sparen, wenn Sie eine Code-Einheit ändern. Es lohnt sich, und dies kann dazu beitragen, Probleme frühzeitig zu erkennen - d. H. Bevor sie in die Produktion gehen -, die möglicherweise übersehen wurden, weil jemand vergessen hat, eine Testvariante zu simulieren.


Selbstdokumentierend

Beim Schreiben von Komponententests verbessern Sie nicht nur die Qualität Ihres Codes, indem Sie sicherstellen, dass er tatsächlich funktioniert, sondern Sie bieten inhärent Entwickler-orientierte Dokumentation.

Wenn Sie die Funktionalität, die Sie in Ihr Produkt integrieren, testen, werden Sie Dokumentation darüber liefern, wie Funktionen funktionieren sollen, wann sie ausfallen sollten und wann sie bestehen sollten.

Dazu gibt es einige Annahmen: Insbesondere, dass Sie Ihre Funktionen und die zugehörigen Tests logisch benennen und gruppieren und jede Funktion ordnungsgemäß testen.

Mit PHPUnit können Sie mit den WordPress-Komponententests leicht lesbare Assertions durchführen. Sie geben einfach assertTrue, assertFalse oder andere Assertions an, die für die Funktionen verfügbar sind, aus denen Ihr Projekt besteht.

In unserem Beispiel oben bedeutet dies, dass Sie eine Funktion schreiben können, um sicherzustellen, dass die Benutzerregistrierungsfunktion fehlschlägt, wenn Sie versuchen, sich mit einer leeren E-Mail-Adresse zu registrieren:

 $ this-> assertFalse (registerNewUser ("));

Ein einfaches Beispiel vielleicht, aber der Punkt bleibt: Ihr Code wird selbstdokumentierend, und Sie müssen lediglich eindeutige Komponententests schreiben.


Die Architektur

Einer der am meisten unterschätzten Vorteile des Komponententests besteht darin, dass er die Architektur Ihres Projekts vorantreiben kann. Normalerweise kann die Entwicklung von Designs oder Plugins auf zwei Arten erfolgen:

  1. Auflisten von Funktionen, Skizzieren der Benutzeroberfläche und Schreiben von Code
  2. Zeichnen Sie ein Diagramm, wie die Dateien zusammenarbeiten, und schreiben Sie dann Code

Diese sind nicht von Natur aus schlecht, aber ich denke, sie sind schwach (und ich gebe als erster zu, dass ich beides mehr getan habe, als ich teilen möchte!). Der Schritt "Code schreiben" setzt jedoch voraus viel, ist es nicht?

Für jeden, der lange Zeit Code geschrieben hat, ist Ihnen nur allzu bekannt, dass Sie an diesem Punkt an dem Punkt ankommen, an dem Sie erkennen: "Oh ... ich habe nicht daran gedacht."

Wenn Sie Glück haben, bedeutet dies normalerweise, dass Sie eine Hilfsmethode oder eine andere Bedingung schreiben können, um den Fall zu behandeln, den Sie vernachlässigt haben. Im schlimmsten Fall bedeutet dies, dass Sie möglicherweise Ihre gesamte Klasse oder Ihren gesamten Funktionssatz überarbeiten müssen um dieses Problem zu lösen.

Die Prüfung von Einheiten ist zwar nicht perfekt, kann jedoch Abhilfe schaffen.

Bedenken Sie die Tatsache, dass Sie von Anfang an alle Funktionen auflisten, die Ihr Theme oder Plugin bieten soll. Sie haben noch keinen Code geschrieben, aber möglicherweise haben Sie eine Art Skizze der Benutzeroberfläche und / oder eine Reihe von Klassendiagrammen.

Als Nächstes schreiben Sie die Tests aus, die Sie schreiben werden, um Ihr Projekt zu testen. Denken Sie daran, dass ein Teil der Komponententests den Code auf die atomarste mögliche Einheit aufschlüsselt. Daher müssen Sie für jede dieser Tests Einzeltests schreiben, Hm, Einheiten.

Aufgrund der Art der Komponententests denken Sie von Natur aus über Ihren Code anders nach: Sie denken nicht an "Code schreiben", sondern "Schreibtests". Und weil Sie auf atomarer Ebene nachdenken müssen, können Sie dies Es hilft nicht, aber betrachten Sie Randfälle, die so oft in "Schreibcode" zusammengefasst werden.


Die Sprache Ihres Codes

Als Entwickler sind wir viel zu bequem, Konventionen zu verwenden, die das Schreiben von Code ständig untermauern. Damit meine ich, dass wir in der Regel abgekürzte Variablennamen, kryptische Funktionsnamen und Klassennamen bereitstellen, die für niemanden außerhalb von Ihnen oder dem Team, das an Ihrem Projekt arbeitet, möglicherweise nichts bedeuten.

Komponententests sind nicht unbedingt der Schlüssel zum Schreiben von Code, der einfacher zu lesen ist, aber er kann ein bisschen weiter gehen und dabei helfen, sauberere Funktionsnamen bereitzustellen.

Wenn Sie sich an das erste Programmierbuch erinnern, das Sie gelesen haben, den ersten Informatikkurs, den Sie besucht haben, oder den ersten Open-Source-Code, den Sie gesehen haben, sind Methodennamen normalerweise Verben. Warum sollten sie nicht sein? Methoden sind Methoden, um diesen Code einzukapseln macht Sachen. Aber da wir immer länger an Projekten arbeiten, werden wir fauler und fauler und unser Code geht von "register_user_and_email_password ()"bis"neues Konto()".

Natürlich ist der erstere sauberer als der letztere, aber wenn wir qualitativ hochwertige Komponententests anstreben und sicherstellen möchten, dass unsere Komponententests gut lesbar sind und um leicht lesbar zu sein, müssen unsere Funktionsnamen sein leicht zu lesen.

Ist das nicht einfacher zu lesen:

 $ this-> assertFalse (register_user_and_email_password ("));

An Stelle von?

 $ this-> assertFalse (new_account ("));

Vielleicht ist dies wiederum ein einfaches Beispiel, aber das Prinzip bleibt bestehen: Das Schreiben guter Komponententests, um den Code zu dokumentieren, der die Sprache Ihrer Funktionen bestimmt.


Fazit

Wir haben über die Grundlagen des Komponententests sowie über die wichtigsten Vorteile gesprochen, aber wir haben noch nicht die mit dem Komponententest verbundenen Nachteile besprochen, und wir haben uns noch nicht einmal mit der Einbindung in unseren Workflow beschäftigt.

Im nächsten Artikel versuchen wir genau das zu tun.