Es gibt Dutzende von JavaScript-Testframeworks, aber die meisten funktionieren mehr oder weniger auf dieselbe Weise. Douglas Crockfords JSCheck unterscheidet sich jedoch erheblich von den meisten. In diesem Tutorial zeige ich Ihnen, wie es anders ist und warum Sie es in Betracht ziehen sollten!
Crockford beschreibt JSCheck als „spezifikationsorientiertes Testwerkzeug.
Crockford beschreibt JSCheck als „spezifikationsgesteuertes Testwerkzeug“. Wenn Sie die von Ihnen gewohnten Frameworks verwenden, schreiben Sie einen Test für einen bestimmten Funktionsbestandteil. Wenn dieser Test erfolgreich ist, geben Sie an, dass die angegebene Funktionalität ordnungsgemäß funktioniert . Es ist jedoch möglich, dass Sie einige Randfälle oder Ausnahmen verpassen, die Ihre Tests nicht abdecken.
Das Aufdecken von Randfällen ist zwar kein ausdrücklicher Zweck von JSCheck, aber es ist ein schöner Nebeneffekt. Die Hauptidee hinter JSCheck ist folgende: Die Spezifikation, die Sie schreiben, beschreibt tatsächlich, wie der von Ihnen getestete Code funktionieren sollte. Dann übernimmt JSCheck diese Spezifikation (genannt a Anspruch in JSCheck-lingo), und generieren Sie Stichproben, um die Behauptung zu beweisen. Zum Schluss werden Ihnen die Ergebnisse angezeigt.
Hört sich interessant an? Weiter lesen! Kommt mir bekannt vor? Möglicherweise haben Sie das Haskell-Testwerkzeug QuickCheck verwendet, auf dem JSCheck basiert.
Bevor wir unseren Antrag tatsächlich verfassen, möchten wir natürlich etwas Code zum Testen haben. Vor kurzem habe ich einen Mini-Passwort-Scanner geschrieben, der der Funktionalität von HowSecureIsMyPassword.net ähnelt. Es ist wirklich nichts Besonderes: Sie geben der Funktion einfach ein Passwort und erhalten eine Punktzahl zurück. Hier ist der Code:
(Funktion () var PasswordScorer = ; PasswordScorer.score = Funktion (Kennwort) var len = password.length, lengthScore = 0, letterScore = 0, Zeichen = if (len> = 21) lengthScore = 7 ; else if (len> = 16) lengthScore = 6; else if (len> = 13) lengthScore = 5; else if (len> = 10) lengthScore = 4; else if (len> = 8) lengthScore = 3; else if (len> = 5) lengthScore = 2; var re = [null, / [az] / g, / [AZ] / g, / \ d / g, / [ ! @ # $% \ ^ & \ * \ (\) = _ + -] / g]; for (var i = 1; i < re.length; i++) letterScore += (password.match(re[i]) || []).length * i; return letterScore + lengthScore; ; (typeof window !== 'undefined' ? window : exports).PasswordScorer = PasswordScorer; ());
Es ist ziemlich einfacher Code, aber hier ist was los ist: Die Partitur besteht aus zwei Subscores. Es gibt eine Startpunktzahl, die auf der Länge des Kennworts basiert, und dann eine zusätzliche Punktzahl für jedes Zeichen, 1 Punkt für jeden Kleinbuchstaben, 2 Punkte für jeden Großbuchstaben, 3 Punkte für jede Zahl und 4 Punkte für jedes Symbol ( aus einer begrenzten Menge).
Dies ist der Code, den wir testen werden: Wir werden mit JSCheck zufällig einige Passwörter generieren und sicherstellen, dass sie eine angemessene Punktzahl erhalten.
Jetzt können wir unsere Ansprüche schreiben. Gehen Sie zuerst über die JSCheck Github-Seite und laden Sie die jscheck.js
Datei. Ich führe meine Tests gerne über NodeJS im Terminal aus. Fügen Sie diese Zeile am Ende der Datei hinzu:
(typof window! == 'undefined'? window: exportiert) .JSC = JSC;
Dies wirkt sich nicht auf das Verhalten der Datei im Browser aus, sie wird jedoch als Modul innerhalb des Knotens funktionieren. Beachten Sie, dass die jscheck.js
Datei wird freigegeben JSC
als einzige globale Variable für die gesamte Bibliothek. Wenn wir diese Anpassung nicht vornehmen würden, würden wir auf diese Weise zugreifen.
Öffnen wir es passwordScorerSpec.js
und anfangen
JSC = erfordern ("./… /vendor/jschec";).JSC; PasswordScorer = required ("./… /lib/passwordScore";).PasswordScorer;
Da ich diese Tests in NodeJS durchführe, müssen wir die gewünschten Module benötigen. Natürlich sollten Sie sicherstellen, dass die Pfade Ihren Dateispeicherorten entsprechen.
Nun können wir unseren ersten Anspruch schreiben. Natürlich benutzen wir die JSC.claim
Methode. Diese Methode akzeptiert drei Parameter, optional einen vierten. Der erste Parameter ist nur eine Zeichenfolge, a Name für den Anspruch. Der zweite Parameter heißt Prädikat: Es ist die eigentliche Testfunktion. Sehr einfach sollte diese Funktion zurückkehren wahr
wenn der Anspruch wahr ist, und falsch
wenn die Behauptung falsch ist. Die zufälligen Werte, die JSCheck für den Test generiert, werden als Parameter an das Prädikat übergeben.
Aber woher weiß JSCheck, welche Art von Zufallswerten das Prädikat bereitstellt? Das ist der dritte Parameter, der Bezeichner kommt ins Spiel. Dies ist ein Array mit einem Element für jeden Parameter für das Prädikat. Die Elemente im Array geben an, welche Typen das Prädikat mithilfe der JSCheck-Bezeichnerfunktionen angeben sollen. Hier einige davon:
JSC.boolean ()
gibt entweder wahr oder falsch zurück.JSC.character ()
nimmt ein min und max Zeichen und gibt ein einzelnes Zeichen aus diesem Bereich zurück. Es kann auch einen einzelnen Zeichencode verwenden und dieses Zeichen zurückgeben.JSC.integer ()
wird eine Primzahl zurückgeben. Oder übergeben Sie einen einzelnen Parameter, um eine ganze Zahl (ganze Zahl) zwischen 1 und dem Parameter zu erhalten, oder zwei Parameter für eine ganze Zahl in diesem Bereich.Du hast die Idee. Es gibt andere Spezifizierer, und wir werden jetzt einige verwenden, wenn wir unseren ersten Anspruch schreiben.
JSC.claim ("All Lowercase Password" ;, Funktion (Kennwort, maxScore)) return PasswordScorer.score (Kennwort) <= maxScore; , [ JSC.string(JSC.integer(10, 20), JSC.character('a', 'z')), JSC.literal(26) ]);
Unser erster Parameter ist ein Name. Die zweite ist die Testfunktion: Sie erhält ein Kennwort und eine Höchstpunktzahl und gibt "Wahr" zurück, wenn die Punktzahl für dieses Kennwort kleiner oder gleich der Höchstpunktzahl ist. Dann haben wir unser Spezifikationsfeld. Unser erster Parameter (das Passwort) sollte eine Zeichenfolge sein, also verwenden wir den JSC.string ()
Methode: Es können zwei Parameter verwendet werden, die Anzahl der Zeichen in der Zeichenfolge und der Wert für diese Zeichen. Wie Sie sehen, bitten wir Sie um ein Passwort mit 10 bis 20 Zeichen. Für den Wert verwenden wir die JSC.Zeichen ()
Methode um zufällige Zeichen zwischen 'a' und 'z' zu erhalten.
Der nächste Wert ist unser maxScore
Parameter. Manchmal wollen wir nicht die Zufälligkeit, die JSCheck bietet, und dies ist eine dieser Zeiten. Deshalb gibt es JSC.literal
: um einen Literalwert zu übergeben, das Prädikat. In diesem Fall verwenden wir 26, was die maximale Punktzahl für alle Kleinbuchstaben zwischen 10 und 20 Zeichen sein sollte.
Jetzt können wir den Test ausführen.
Bevor wir den Antrag tatsächlich ausführen und den Bericht abrufen, müssen wir die Funktion einrichten, die den Bericht erhalten soll. JSCheck übergibt den Bericht an eine Rückruffunktion von JSC.on_report
. Daher:
JSC.on_report (function (str) console.log (str););
Nichts Außergewöhnliches. Jetzt müssen Sie nur noch anrufen JSC.check ()
. Jetzt können wir zu unserem Terminal gehen und das ausführen:
Knotenpfad / to / passwordScorerSpec.js
Hinter den Kulissen führt JSCheck das Prädikat 100 Mal aus und generiert jedes Mal verschiedene Zufallswerte. Sie sollten Ihren Bericht ausgedruckt sehen.
Alle Passwörter für Kleinbuchstaben 100 von 100 bestehen aus 100
Sie sind alle bestanden, aber das ist kein großer Bericht, oder? Wenn einer unserer Tests fehlgeschlagen wäre, wären sie in den Bericht aufgenommen worden. Sie können den Ausgabepegel jedoch mit einstellen JSC.detail
Funktion: Übergeben Sie eine Zahl zwischen 0 und 4 (einschließlich), um alle Testfälle ohne Ausgabe ausgeben zu können. Der Standardwert ist 3.
Erinnere dich, wie ich das gesagt habe JSC.claim
könnte einen vierten Parameter annehmen? Es heißt a Klassifizierer, und es empfängt die gleichen Parameter, die das Prädikat erhält. Dann kann eine Zeichenfolge zurückgegeben werden, um unsere Testfälle zu klassifizieren oder zu gruppieren. Ich gebe zu, ich war mir nicht wirklich sicher, wo dies nützlich wäre, bis ich den obigen Beispielanspruch erstellt hatte. Ich habe im Prädikat einen Fehler gemacht und die Punktzahl mit der verglichen maxScore
mit dem Operator anstelle von
Operator, so dass alle Passwörter, die 26 Punkte erzielten, fehlgeschlagen sind. Ich sah Berichte, die ungefähr so aussahen:
Alle Kleinbuchstaben-Passwörter 96 von 100 FAIL [12] ("vqfqkqqbwkdjrvplkrx";), 26) FAIL [21] ("nhgkznldvoenhqqlfza"; 26). , 26) Durchlauf 96 nicht bestanden 4
Es ist immer noch nicht ganz offensichtlich, warum einige Tests fehlschlagen. Also habe ich eine Klassifizierungsfunktion hinzugefügt, die die Testfälle nach Bewertung gruppiert: Wie ich sagte, nimmt die Funktion die gleichen Parameter wie das Prädikat auf und gibt einen String zurück. Jeder Testfall, der dieselbe Zeichenfolge vom Klassifizierer zurückbekommt, wird im Bericht zusammengefasst.
Funktion (Passwort, maxScore) return PasswordScorer.score (Passwort) + "Punkte" ;;
Diese Funktion sollte der letzte Parameter unseres Anspruchs sein. Nun erhalten Sie einen Bericht, der ungefähr so aussieht:
Alle Kleinbuchstabenkennwörter 96 von 100 FAIL [4] 26 Punkte :( "illqbtiubsmrhxdwjfo";, 26) FAIL [22] 26 Punkte :( "gruvmmqjzqlcyaozgfh";; ) FAIL [65] 26 Punkte :( "kskqdjhtonybvfewdjm";, 26) 14 Punkte: Pass 8 15 Punkte: Pass 5 16 Punkte: Pass 12 18 Punkte: Pass 10 19 Punkte: Pass 12 20 Punkte: Pass 11 22 Punkte: Pass 12 23 Punkte: Pass 8 24 Punkte: Pass 10 25 Punkte: Pass 8 26 Punkte: Pass 0 Fail 4
Sie können sehen, wie die Tests nach dem Wert der Kennwörter gruppiert werden. Nun ist es leicht zu sehen, dass die einzigen Passwörter, die die Tests nicht bestehen, die Passwörter sind, die 26 Punkte erreichen. Und obwohl das Problem hier mit dem Test und nicht mit dem Code bestand, zeigt es dennoch, wie es nützlich sein kann, Ihren Ansprüchen eine Klassifizierungsfunktion hinzuzufügen.
Also, am Ende des Tages ist es JSCheck wert zu verwenden? Ich denke, das ist nicht etwas, das Sie nicht unbedingt mit jeder Codebasis verwenden werden, aber manchmal ist es nützlich, zufällige Testfälle erstellen zu können, die einen bestimmten Code genau testen. Wenn Sie das wollen, habe ich kein besseres Tool als JSCheck gesehen.
JSCheck bietet einige andere Optionen und eine Reihe von Spezifizierern, die wir in diesem Lernprogramm nicht überprüft haben. Gehen Sie zu JSCheck.og, um mehr darüber zu erfahren. Ansonsten würde ich gerne Ihre Meinung zu JSCheck in den Kommentaren hören!