Was soll in Javascript getestet werden?

12

Bei der Arbeit haben wir gerade mit einer stark auf Javascript basierenden Anwendung begonnen (tatsächlich mit Coffeescript, aber immer noch), von der ich ein automatisiertes Testsystem mit JsTestDriver und Fabric implementiert habe.

Wir haben noch nie etwas mit so viel Javascript geschrieben, also haben wir bis jetzt noch nie Javascript getestet. Ich bin mir nicht sicher, was genau wir in unseren Unit-Tests testen sollen. Wir haben JQuery-Plugins für verschiedene Dinge geschrieben, daher ist es ziemlich offensichtlich, dass sie mit JsTestDriver so weit wie möglich auf ihre Richtigkeit überprüft werden sollten. Alle anderen in meinem Team sind jedoch der Meinung, dass wir auch Javascript auf Seitenebene testen sollten.

Ich denke nicht, dass wir Javascript auf Seitenebene als Unit-Tests testen sollten, sondern stattdessen ein System wie Selenium verwenden, um zu überprüfen, ob alles wie erwartet funktioniert. Mein Hauptgrund dafür ist, dass Javascript-Tests auf Seitenebene derzeit über JsTestDriver garantiert fehlschlagen, da sie versuchen, auf Elemente im DOM zuzugreifen, die möglicherweise nicht vorhanden sind.

Also, was sollte in Javascript Unit-getestet werden?

Nathan Hoad
quelle
3
Sie isolieren jeden Javascript-Code, den Sie in Module geschrieben haben. Dann testen Sie einfach die Ein- und Ausgänge dieser Module. Jedes Modul, das sich mit dem DOM befasst, bedeutet, dass Sie das DOM testen müssen. Verwenden Sie ein besseres Tool als jsTestDriver.
Raynos
Sie sollten Unit-Testing-Geschäftslogik sein. Wenn Ihre Geschäftslogik und die Elemente im DOM miteinander verflochten sind, liegt ein Konstruktionsfehler vor. Extrahieren Sie so viel Geschäftslogik wie möglich aus den Seitenelementen, damit diese ordnungsgemäß auf der Einheit getestet werden können. Für die Überprüfung der Interaktion mit DOM-Elementen sollten Sie Selen verwenden.
maple_shaft
1
@ NathanHoad Sie schreiben Unit-Tests, die im Browser selbst ausgeführt werden. Nodeunit, Qunit und Jasmin sind sinnvolle Tools. Wenn Sie im Browser laufen, haben Sie das DOM. Sie können ein Tool wie testling verwenden, um das Testen von Browsern zu automatisieren.
Raynos
1
Vielen Dank. Ich habe mich nach jsTestDriver umgesehen, da es angeblich im Browser ausgeführt werden kann. Technisch gesehen habe ich festgestellt, dass dies nicht mit dem Ausführen mit QUnit identisch ist. Ich arbeite zurzeit an meinem eigenen Tool, das QUnit verwendet, mit einem benutzerdefinierten Django-Debug-Toolbar-Panel. Mit Selen kann ich fehlerhafte Tests erkennen. Außerdem bezweifle ich, dass mein Chef für das Testen bezahlen würde, obwohl es ziemlich gut aussieht!
Nathan Hoad

Antworten:

4

Testen Sie alles, was Sie können.

Reine Logik kann einfach getestet werden.

Wenn Ihr Code mit dem DOM oder dem Netzwerk interagiert, ist es viel schwieriger.

Wenn Sie einen Code abstrahieren können, um an einem beliebigen DOM-Element statt an einem bestimmten zu arbeiten, können Sie ihn einfacher testen. (Lassen Sie das Element an einem Parameter arbeiten).

Code, der Ajax verwendet, kann getestet werden, indem einfach die Rückruffunktion mit festen Daten aufgerufen wird. Ich habe einige Tests gehabt, bei denen ich $.ajaxmit meiner eigenen Funktion überschrieben habe. Stellen Sie einfach sicher, dass Sie den echten zurücklegen, wenn Sie fertig sind!

Sie werden feststellen, dass "Javascript auf Seitenebene" in Wirklichkeit "eng gekoppelter Code" bedeutet. Wenn Sie die Teile des Codes entkoppeln, können Sie sie unabhängig testen.

(Selen ist kein Unit-Test-Tool. Es eignet sich hervorragend für Szenarien auf hoher Ebene, aber Sie können keine Probefahrten damit durchführen, und es funktioniert nicht in einer isolierten Umgebung.)

Sean McMillan
quelle
Jasmin kann Funktionsaufrufe und Antwortdaten verspotten, Sie können sich das ansehen, anstatt Funktionen zu überschreiben.
Steve
Ich sollte klarstellen - wir haben Funktionen und solche auf jeder Seite. Ich habe mehr darüber gesprochen, den Code zu testen, der darin ausgeführt wird $(document).ready(...).
Nathan Hoad
1
Es ist alles eine Frage der Größe .... :-) Ich denke, Sie sollten in der Lage sein, dies auf eine einzige benannte Funktion zurückzuführen, die auch getestet wird. Dann ist Ihr ungetesteter Code eine einzelne Zeile. (Nun, das ist ein Ziel, nicht vorgegeben. In der Praxis hatte ich immer mehr als eine Zeile ungetesteten Codes.)
Sean McMillan
@ SeanMcMillan - Ich finde es sehr schwierig, Teile einer Anwendung zu testen, die nur das DOM betreffen, beispielsweise eine Funktion, die nur mehrere Ereignisse an einige DOM-Elemente bindet. Wie würden Sie überprüfen, ob diese Ereignisse richtig geschrieben wurden? nicht etwas, was Unit-Tests können, aber echte Browser klicken und überprüfen (mit Selen oder was auch immer)
vsync
@vsync: Sie können testen, ob beispielsweise ein Klick-Handler an ein bestimmtes DOM-Element angehängt wurde. Ich glaube nicht, dass es möglich ist, zu testen, ob "click" der richtige Handler ist und ob Sie ihn dem richtigen Element zugeordnet haben.
Sean McMillan
5

Testalgorithmen. Teile, die eng mit der Benutzeroberfläche zusammenhängen, sind stärker vom jeweiligen Browser abhängig und müssen daher mit selenähnlichen Tools getestet werden.

Ihr Code muss natürlich Algorithmen als isolierte Codeteile enthalten, wenn dies nicht der Fall ist, ist ein Komponententest fast unmöglich.

jquery-plugins sind übrigens nicht einfach auf einheiten zu testen.

Sergey Stolyarov
quelle
Alles gute Punkte! Ich bin damit einverstanden, dass sie nicht einfach zu testen sind, je nachdem, wie sie geschrieben wurden.
Nathan Hoad
-1

Ich habe früher mit Java gearbeitet und nach dem, was ich sehe, ist das Testen von Java einfacher als das Testen von JavaScript, da Java starrer ist.

Ich bin davon überzeugt, dass die testgetriebene Entwicklung das Beste ist, und daher untersuche ich auch, wie man JavaScript in einem Stück testet. In Java habe ich den Code, der die Verbindung zur Datenbank hergestellt hat, und die Datenzugriffsobjekte verspottet, und ich vergleiche diesen mit dem Code in JavaScript, der das DOM ändert, und dem Code, der AJAX-Aufrufe an den Server ausführt.

Worauf ich hinaus will, ist, dass es mir so scheint, als ob die Logik explizit getestet werden sollte. Sie möchten beispielsweise keinen AJAX-Aufruf tätigen, wenn Sie Komponententests ausführen, weil (a) der Server ausgeführt werden muss und (b) er langsam ist und eine der Richtlinien für Komponententests lautet, dass er ausgeführt werden muss superschnell, damit die Entwickler es nicht vermeiden, sie wie jede Minute laufen zu lassen.

Eine weitere Richtlinie für den kontinuierlichen Integrationsprozess ist das Senden einer E-Mail mit dem Hinweis, dass ein fehlgeschlagener Komponententest gefunden wurde.

SBel
quelle