Hier ist ein grundlegendes Beispiel, wie mein Komponententest mit qunit aussehen muss:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
<link rel="stylesheet" href="qunit/qunit-1.13.0.css">
<script src = "qunit/qunit-1.13.0.js"></script>
<script src = "../js/fuzzQuery.js"></script>
<script>
test("Fuzz Query Basics", function()
{
equal(fuzzQuery("name:(John Smith)"), "name:(John~ Smith~)");
equal(fuzzQuery("name:Jon~0.1"), "name:Jon~0.1");
equal(fuzzQuery("Jon"), "Jon~");
//etc
}
);
</script>
</head>
<body>
<div id="qunit"></div>
</body>
</html>
Jetzt dachte ich, das ist ein bisschen repetitiv.
Könnte alle Ein- / Ausgänge in ein Array setzen und durchschleifen.
test("Fuzz Query Basics", function()
{
var equals = [
["name:(John Smith)", "name:(John~ Smith~)"],
["name:Jon~0.1", "name:Jon~0.1"],
["Jon", "Jon~"]
];
for (var i = 0; i<equals.length; i++)
{
equal(fuzzQuery(equals[i][0]), equals[i][1]);
}
}
);
Und das funktioniert gut.
Der einzige Vorteil, den ich mir für diese zweite Methode vorstellen kann, ist, dass equal
es einfacher ist, diese Änderung an einer Stelle vorzunehmen, wenn sich herausstellt, dass Sie sie nicht wirklich verwenden möchten .
In Bezug auf die Lesbarkeit denke ich nicht, dass es so oder so schlüssig ist, obwohl ich wahrscheinlich die zweite bevorzuge.
Wenn Sie es weiter abstrahieren, können Sie die Eingabe- / Ausgabefälle in einer separaten CSV-Datei ablegen, was die Änderung möglicherweise vereinfacht.
Die Frage ist: Wie lauten die allgemeinen Konventionen für das Schreiben solcher Komponententests?
Gibt es einen Grund, warum Sie sie nicht in Arrays einordnen sollten?
quelle
Antworten:
Ihre überarbeiteten Tests haben einen Geruch: Bedingte Testlogik .
Es gibt zwei Gründe, warum Sie es vermeiden sollten, in Ihren Tests bedingte Logik zu schreiben. Das erste ist, dass es Ihre Fähigkeit untergräbt, sicher zu sein, dass Ihr Testcode korrekt ist, wie im Artikel über verknüpfte xUnit-Muster beschrieben.
Das zweite ist, dass es die Bedeutung der Tests verschleiert. Wir schreiben Testmethoden, weil sie die Logik zum Testen eines bestimmten Verhaltens an einer Stelle platzieren und es uns ermöglichen, ihm einen beschreibenden Namen zu geben (siehe Dan Norths Original-BDD-Artikel für eine Untersuchung des Werts guter Namen für Tests). Wenn Ihre Tests in einer einzelnen Funktion mit einer
for
Schleife versteckt sind , wird die Bedeutung des Codes für den Leser verdeckt. Der Leser muss nicht nur die Schleife verstehen, sondern auch alle unterschiedlichen Verhaltensweisen, die innerhalb der Schleife getestet werden, mental aufdecken.Die Lösung besteht wie immer darin, eine Abstraktionsebene nach oben zu bringen. Verwenden Sie ein Testframework, mit dem Sie parametrisierte Tests durchführen können , wie dies xUnit.NET oder Contexts tun (Haftungsausschluss: Ich habe Contexts geschrieben). Auf diese Weise können Sie Triangulationstests für dasselbe Verhalten auf natürliche Weise in Gruppen zusammenfassen und Tests für unterschiedliche Verhalten voneinander trennen.
quelle
Anscheinend möchten Sie wirklich einen datengesteuerten Unit-Test. Da Sie die Verwendung von QUnit erwähnt haben, habe ich ein Plugin gefunden, das parametrisierte Tests ermöglicht:
https://github.com/AStepaniuk/qunit-parameterize
An einem datengetriebenen Test ist ideologisch nichts auszusetzen, solange der Testcode selbst nicht bedingt ist. Wenn Sie Ihren Testcode betrachten, scheint er ein sehr guter Kandidat für einen datengesteuerten Test zu sein.
Beispielcode für die GitHub README:
quelle
Sie wiederholen sich weniger, indem Sie das Array verwenden, das besser gewartet werden kann. Ein Ansatz, den ich gerne verwende, ist eine separate Methode, die die Tests anordnet, durchführt und bestätigt, aber die Eingabeparameter akzeptiert, mit denen ich teste, sodass ich 1 Testmethode pro Eingabesatz habe.
Auf diese Weise kann ich sofort feststellen, welche Tests / Eingaben fehlschlagen.
quelle
Ich mag Ihren zweiten Ansatz, aber ich würde 2 Punkte hinzufügen
for
Schleifen`
Ich bin mir bei qunit nicht sicher, aber ein guter Testläufer zeigt Ihnen, welche Eingabezeichenfolge fehlgeschlagen ist und was das erwartete Ergebnis war
quelle