Heim >Web-Frontend >js-Tutorial >Ein Anfängerhandbuch zum Testen funktionaler JavaScript
Schlüsselpunkte
Funktionelle Programmierung und Tests. Sie haben sie vielleicht separat ausprobiert, aber irgendwie haben Sie nie beide in Ihre reguläre Praxis integriert. Sie mögen selbst einfach klingen, aber Tests und funktionale Programmierung können eine unwiderstehliche Versuchung erzeugen, die Sie fast dazu zwingt, klarere, kompaktere und wartbare Code zu schreiben.
Die gute Nachricht ist, dass die Verwendung beider Technologien gleichzeitig einige praktische Vorteile bietet. Sobald Sie die Süße dieser Kombination erlebt haben, sind Sie möglicherweise wie ich süchtig danach, und ich wette, Sie werden mehr wollen.
Sehen Sie sich den Kurs "Schreiben des klaren Codes an. Befolgen Sie die funktionalen JavaScript -Prinzipien", um Ihren Code aufzubrechen und die Aufrechterhaltung zu erleichtern ... warum nicht? Sehen Sie sich diesen Kurs in diesem Artikel an, ich werde Sie in die Prinzipien des Testen funktionaler JavaScript vorstellen. Ich werde Ihnen zeigen, wie Sie das Jasmine-Framework verwenden und reine Funktionen mit testgetriebenen Methoden erstellen.
Warum es testen?
Tests besteht darin, sicherzustellen, dass der Code in der Anwendung wie erwartet ausgeführt wird, und läuft weiterhin wie erwartet, wenn Sie Änderungen vornehmen, damit Sie die verfügbaren Produkte erhalten, wenn Sie Ihre Arbeit beenden. Sie schreiben einen Test, der die in einem festgelegte Situation erwartete Funktionen definiert, den Test gegen den Code durchführen, und Sie erhalten eine Warnung, wenn das Ergebnis nicht mit dem übereinstimmt, was der Test sagt. Und Sie erhalten diese Warnung, bis Sie den Code beheben.
Dann erhalten Sie eine Belohnung.
Ja, das lässt Sie sich gut fühlen.
Es gibt viele Arten von Tests, und es gibt viel Raum für Diskussionen darüber, wo Grenzen unterteilt sind, aber kurz:
HINWEIS: Lassen Sie sich nicht durch eine Art von Test, die als Funktionstest bezeichnet werden, abgelenkt. Dies ist nicht das, worauf wir uns in diesem Artikel über das Testen funktionaler JavaScript konzentrieren möchten. Unabhängig davon, ob Sie funktionelle Programmierechniken in JavaScript verwenden oder nicht, ändert sich die Funktionstestmethoden, mit denen Sie das Gesamtverhalten Ihrer Anwendung testen, möglicherweise nicht viel. Was bei der funktionalen Programmierung wirklich hilft, ist beim Erstellen von Unit -Tests.
Sie können während des Codierungsprozesses jederzeit Tests schreiben, aber ich finde es immer am effektivsten, Unit -Tests zu schreiben, bevor sie Funktionen schreiben, die sie testen möchten. Diese Praxis, die als testgetriebene Entwicklung (TDD) bekannt ist dieses Ergebnis zu erzeugen.
Ein Nebeneffekt ist, dass TDD Sie häufig dazu zwingt, detaillierte Diskussionen mit den Personen zu führen, die Sie dafür bezahlen, Programme zu schreiben, um sicherzustellen, dass das Programm, das Sie schreiben, tatsächlich das ist, nach dem sie suchen. Schließlich ist es einfach, einen einzigen Test zu bestehen. Die Schwierigkeit besteht darin, festzustellen, ob alle möglichen Eingaben verarbeitet werden, denen Sie begegnen können, und alle Eingaben korrekt zu verarbeiten, ohne etwas zu brechen.
Warum eine funktionale Programmierung wählen?
Wie Sie sich vorstellen können, hängt die Art und Weise, wie Sie Ihren Code schreiben, eng mit der Schwierigkeit des Tests zusammen. Einige Codemuster, wie z. B. eng das Verhalten einer Funktion an eine andere, oder es stützt sich stark auf globale Variablen, erschweren die Einheitstests des Codes. Manchmal müssen Sie möglicherweise unbequeme Techniken verwenden, z. Diese Fälle sind nicht immer vermeidbar, aber es ist häufig möglich, dort zu isolieren, wo diese Fälle im Code benötigt werden, damit der Rest des Codes leichter getestet werden kann.
Mitfunktionale Programmierung können Sie Daten und Verhalten in Ihrer Anwendung unabhängig umgehen. Sie können Ihre Anwendung erstellen, indem Sie eine separate Reihe von Funktionen erstellen, die unabhängig funktionieren und nicht vom externen Zustand abhängen. Infolgedessen wird Ihr Code zu einem fast selbstdokumentierten Code und kombiniert kleine, klar definierte Funktionen, die sich konsequent verhalten und leicht zu verstehen haben.
funktionale Programmierung steht normalerweise im Gegensatz zu imperativen Programmierungen und objektorientierter Programmierung. JavaScript kann all diese Technologien unterstützen und sogar mischen. Funktionelle Programmierung kann als eine weitere wertvolle Alternative zum Erstellen von imperativen Codesequenzen dienen, die die Anwendungszustände verfolgen, bis das Ergebnis zurückgegeben wird. Oder erstellen Sie Ihre Anwendung durch Interaktionen über komplexe Objekte hinweg, die alle Methoden einschließen, die für eine bestimmte Datenstruktur gelten.
wie man reine Funktionen arbeitet
funktionale Programmierung ermutigt Sie, Ihre Anwendung mit winzigen, wiederverwendbaren und komponierbaren Funktionen zu erstellen, die nur eine bestimmte Sache ausführen und jedes Mal den gleichen Wert für dieselbe Eingabe zurückgeben. Solche Funktionen werden als reine Funktionen bezeichnet. Reine Funktionen sind die Grundlage für die funktionale Programmierung und haben alle die folgenden drei Merkmale:
Ein weiterer Vorteil des Schreibens von Funktionscode besteht darin, dass die Unit -Tests erleichtert werden. Je mehr Code Sie Unit -Test haben können, desto einfacher wird es, sich auf Ihre Fähigkeit zu verlassen, Ihren Code in Zukunft neu zu gestalten, ohne die Grundfunktionalität zu brechen.
Was macht den Funktionscode einfach zu testen?
Wenn Sie das Konzept betrachten, das wir gerade besprochen haben, verstehen Sie möglicherweise bereits, warum der Funktionscode einfacher zu testen ist. Das Schreiben von Tests für reine Funktionen ist sehr einfach, da jeder Eingang eine konsistente Ausgabe aufweist. Sie setzen nur die erwarteten Werte und führen sie gegen den Code aus. Es ist nicht erforderlich, einen Kontext festzulegen, nicht erforderlich, Abhängigkeiten zwischen Funktionen zu verfolgen, den Änderungsstatus außerhalb der Funktion nicht zu simulieren, und es muss auch nicht die externe Datenquelle von Variablen simulieren.
Es gibt viele Testoptionen, von vollständigen Frameworks bis hin zu Versorgungsbibliotheken und einfachen Testwerkzeugen. Dazu gehören Jasmine, Mokka, Enzym, Scherz und viele andere Werkzeuge. Jedes Tool verfügt über unterschiedliche Vor- und Nachteile, beste Anwendungsfälle und eine treue Anhängerschaft. Jasmine ist ein leistungsstarker Rahmen, der in einer Vielzahl von Situationen verwendet werden kann. Hier finden Sie eine kurze Demonstration, wie Sie reine Funktionen mit Jasmine und TDD in Ihrem Browser entwickeln können.
Sie können ein HTML -Dokument erstellen, das Jasmin -Testbibliotheken aus lokalen oder CDN extrahiert. Ein Beispiel für eine Seite, die die Jasmine -Bibliothek und den Testläufer enthält, könnte so aussehen:
<code class="language-html"><!DOCTYPE html> <meta charset="utf-8"> <title>Jasmine Test</title> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jasmine/2.6.1/jasmine.min.css"> </code>
Dies führt die Jasmine -Bibliothek sowie die Jasmine HTML -Bootskripte und -stile vor. In diesem Fall ist der Körper des Dokuments leer und wartet darauf, dass Ihr JavaScript getestet wird und Ihre Jasmintests.
Test funktionaler JavaScript - unser erster Test
<script></script>
Schreiben wir zuerst den ersten Test. Wir können dies in einem separaten Dokument tun oder es in das describe
-Element auf der Seite aufnehmen. Wir werden die von der Jasmine -Bibliothek definierte
isPalindrome
Die neue Funktion, die wir schreiben werden, heißt true
, und wenn die in der in den Gäste bestandene Zeichenfolge vor und nach dem gleichen Ab false
die gleiche ist, wird sie
<code class="language-javascript">describe("isPalindrome", () => { it("returns true if the string is a palindrome", () => { expect(isPalindrome("abba")).toEqual(true); }); });</code>
Wenn wir dies dem Skript in der Seite hinzufügen und in den Browser laden, erhalten wir eine funktionierende Jasmine -Berichtsseite, die den Fehler zeigt. Das wollen wir in diesem Moment. Wir möchten wissen, ob der Test ausgeführt wird und ob er fehlschlägt. Auf diese Weise wissen unser Gehirn, die sich bemüht, erkannt zu werden, dass wir etwas reparieren müssen.
Schreiben wir also eine einfache Funktion in JavaScript, bei der es nur genügend Logik gibt, um unsere Tests zu bestehen. In diesem Fall ist es nur eine Funktion, die einen unserer Tests durch die Rückgabe des erwarteten Wertes verabschiedet hat.
<code class="language-html"><!DOCTYPE html> <meta charset="utf-8"> <title>Jasmine Test</title> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jasmine/2.6.1/jasmine.min.css"> </code>
Ja, wirklich. Ich weiß, dass es lächerlich aussieht, aber bitte bleiben Sie dabei.
Wenn Sie das Testprogramm erneut ausführen, wird es verabschiedet. sicherlich. Aber natürlich erfüllt dieser einfache Code unsere Erwartungen für das Palindrome -Testprogramm nicht. Was wir jetzt brauchen, ist die zusätzliche Erwartung. Fügen wir also unserer describe
-Funktion eine weitere Behauptung hinzu:
<code class="language-javascript">describe("isPalindrome", () => { it("returns true if the string is a palindrome", () => { expect(isPalindrome("abba")).toEqual(true); }); });</code>
Nach dem Laden unserer Seite wird nun die Testausgabe rot und scheitert. Wir erhielten eine Nachricht, in der das Problem war und das Testergebnis rot wurde.
rot!
Unser Gehirn fühlt, dass etwas nicht stimmt.
Natürlich gibt es ein Problem. Jetzt gibt unsere einfache isPalindrome
-Funktion jedes Mal nur true
zurück und hat sich als nicht in der Lage, diesen neuen Test effektiv abzunehmen. Aktualisieren wir also isPalindrome
und fügen Sie die Möglichkeit hinzu, die Funktionen vor und nach der eingehenden Zeichenfolge zu vergleichen.
<code class="language-javascript">const isPalindrome = (str) => true;</code>
Tests sind süchtig
Gehen Sie wieder grün. Das ist befriedigend. Wenn Sie die Seite neu laden, erhalten Sie diesen kleinen Dopaminschub?
Bei diesen Änderungen geht unser Test erneut ab. Unser neuer Code vergleicht effektiv die Vor- und Nachbekämpfungsketten und gibt true
zurück, wenn die Vor- und Nachfolger gleich sind, ansonsten false
.
Dieser Code ist eine reine Funktion, da er nur eine Sache ausreicht und bei einem konsistenten Eingabwert ohne Nebenwirkungen konsistent ausgeführt wird, wodurch Variablen oder Abhängigkeiten außerhalb von sich selbst oder im Anwendungsstatus geändert werden. Jedes Mal, wenn Sie eine Zeichenfolge an diese Funktion übergeben, vergleicht sie zwischen den Vorder- und Rückschnitten und gibt das Ergebnis zurück, wann oder wie es aufgerufen wird.
Sie können sehen, wie einfach diese Konsistenz die Einheitsprüfung dieser Funktion macht. Tatsächlich kann das Schreiben von Test-gesteuerten Code Sie dazu ermutigen, reine Funktionen zu schreiben, da sie leichter zu testen und zu ändern sind.
Und Sie möchten die Zufriedenheit des Tests erhalten. Ich weiß, dass du es wirst.
rekonstruieren reine Funktion
Zu diesem Zeitpunkt ist es sehr einfach, andere Funktionen hinzuzufügen (z. B. Umgang mit Nicht-String-Eingaben, das ignorieren Unterschiede zwischen den oberen und unteren Fallbuchstaben usw.). Fragen Sie einfach den Produktbesitzer, wie das Programm ausgeführt wird. Da wir bereits Tests haben, um zu überprüfen, ob die Zeichenfolge konsequent verarbeitet wird, können wir jetzt Fehlerprüfung oder String-Casting oder ein Verhalten hinzufügen, das wir nicht ausstrahlen möchten.
Lassen Sie uns zum Beispiel sehen, was passiert, wenn wir einen Test für die Nummer 1001 hinzufügen, die als Palindrome interpretiert werden kann, wenn es sich um eine Zeichenfolge handelt:
<code class="language-javascript">describe("isPalindrome", () => { it("returns true if the string is a palindrome", () => { expect(isPalindrome("abba")).toEqual(true); }); it("returns false if the string isn't a palindrome", () => { expect(isPalindrome("Bubba")).toEqual(false); }); });</code>
Dies macht unseren Bildschirm erneut rot und lässt den Test fehlschlagen, da unsere aktuelle isPalindrome
-Funktion nicht weiß, wie er nicht betroffene Eingaben behandelt.
Die Panik begann. Wir sehen rot. Der Test ist fehlgeschlagen.
Aber jetzt können wir es sicher aktualisieren, um Nicht-String-Eingänge zu verarbeiten, sie in Saiten zu werfen und dann zu überprüfen. Wir könnten eine Funktion entwickeln, die mehr so aussieht:
<code class="language-html"><!DOCTYPE html> <meta charset="utf-8"> <title>Jasmine Test</title> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jasmine/2.6.1/jasmine.min.css"> </code>
Jetzt, da alle Tests bestanden werden, sehen wir grüne, süße Dopamin in unser testgetriebenes Gehirn.
Durch Hinzufügen von toString()
zur Bewertungskette können wir uns vor dem Testen an die Nicht-String-Eingabe anpassen und in eine Zeichenfolge konvertieren. Das Beste von allen, da unsere anderen Tests jedes Mal durchgeführt werden, können wir sicher sein, dass wir durch Hinzufügen dieser neuen Funktion zu unseren reinen Funktionen die zuvor erhaltenen Funktionen nicht brechen. Das Endergebnis ist wie folgt:
(Der Codepen -Code sollte hier eingefügt werden, aber da ich nicht auf die externe Website zugreifen kann, kann ich den CodePen -Link nicht angeben.)
Probieren Sie diesen Test aus und schreiben Sie Ihre eigenen Tests mit Jasmine oder einer anderen Testbibliothek, die für Sie funktioniert.
Sobald Sie Tests in Ihren Code -Design -Workflow einbezogen und reine Funktionen für Unit -Tests schreiben, fällt es Ihnen möglicherweise schwierig, in Ihr früheres Leben zurückzukehren. Aber das werden Sie niemals tun wollen.
(Dieser Artikel wurde von Vildan Softic überprüft. Dank aller SitePoint-Peer-Rezensenten für die Erhöhung des SidePoint-Inhalt FAQs über funktionale JavaScript -Tests (FAQ)
Was ist funktionale JavaScript -Tests?
Wie schreibe ich Funktionstests in JavaScript?
Wie lautet die Regexp -Testmethode in JavaScript?
zurückgibt. Diese Methode ist besonders nützlich, wenn Sie die Benutzereingaben oder die Suche nach Mustern in Zeichenfolgen überprüfen müssen. true
false
Wie verwenden Sie die Regexp -Testmethode in JavaScript?
zurück. true
Funktionstests und Unit -Tests sind beide wichtige Komponenten des Testprozesses, ihr Zweck ist jedoch unterschiedlich. Die Unit -Tests konzentrieren sich auf die Isolierung verschiedener Teile des Testcode (z. B. Funktionen oder Methoden) und das Isolieren des Restes des Systems. Funktionstests dagegen testen die größeren Merkmalsbrocken des Systems (z. B. Module oder ganze Anwendungen), um sicherzustellen, dass sie bei der Integration wie erwartet funktionieren.
Verbesserung der Funktionstests in JavaScript beinhaltet normalerweise die Gewährleistung, dass Ihre Tests alle möglichen Situationen, einschließlich extremer Situationen und potenziellen Fehlerbedingungen, abdecken. Es ist auch wichtig sicherzustellen, dass Ihre Tests unabhängig sind und in jeder Reihenfolge durchgeführt werden können, da dies zuverlässiger und leichter zu warten ist. Die Verwendung eines Testframeworks kann auch dazu beitragen, Tests zu erstellen und nützliche Tools zur Überprüfung von Ergebnissen und Berichtensfehlern bereitzustellen.
Einige gute Praktiken für Funktionstests in JavaScript umfassen das Schreiben klarer und prägnanter Testfälle, das Testen positiver und negativer Szenarien und die Sicherstellung, dass die Tests unabhängig sind und in jeder Reihenfolge ausgeführt werden können. Die Verwendung eines Testframeworks ist auch eine gute Idee, da es nützliche Werkzeuge und Strukturen für Ihre Tests bietet.
Eine Vielzahl von Tools und Techniken kann verwendet werden, um Funktionstests in JavaScript zu debuggen. Eine gemeinsame Methode ist die Verwendung der console.log
-Antage, um den Wert während der Testausführung auszudrucken. Sie können auch Debugging -Tools verwenden, die von der Entwicklungsumgebung oder der Test -Frameworks bereitgestellt werden, mit denen Sie den Code durchlaufen und Variablen zu verschiedenen Zeitpunkten überprüfen können.
Einige häufige Herausforderungen bei der Funktionstests in JavaScript umfassen die Handhabung asynchroner Code, Testcode, die mit externen Systemen interagieren und die Komplexität großer Testsuiten verwalten. Eine Vielzahl von Technologien und Tools kann verwendet werden, um diese Herausforderungen zu lösen, z. async/await
Das obige ist der detaillierte Inhalt vonEin Anfängerhandbuch zum Testen funktionaler JavaScript. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!