it-swarm.com.de

Können Winkelmesser und Karma zusammen verwendet werden?

Wenn Protractor Angular Scenario Runner für E2E-Tests ersetzt, bedeutet das, dass ich ihn weiterhin mit Karma als E2E-Testframework verwenden kann?

100

Wird vom aktuellen Betreuer von Protractor nicht empfohlen: 

https://github.com/angular/protractor/issues/9#issuecomment-19927049

Winkelmesser und Karma sollten nicht zusammen verwendet werden; Stattdessen stellen sie separate Systeme für die Durchführung von Tests bereit. Winkelmesser und Karma decken verschiedene Aspekte des Testens ab - Karma ist hauptsächlich für Komponententests gedacht, während Winkelmesser für End-to-End-Tests verwendet werden sollte.

Der Winkelmesser basiert auf WebDriverJS, der einen Selenium/WebDriver-Server verwendet, um Browser bereitzustellen und die Testausführung zu steuern. Beispiele für reine WebDriverJS finden Sie hier: http://code.google.com/p/Selenium/wiki/WebDriverJs

Und

https://github.com/angular/protractor/issues/9#issuecomment-19931154

Georgios - Ich denke, es ist sinnvoll, Protractor und Karma voneinander zu trennen - für End-to-End-Tests möchten Sie die native Event-Steuerung und Flexibilität des Webtreibers, während Sie für Unit-Tests eine schnelle Ausführung und automatische Überwachung der Dateien wünschen.

97
jack

AKTUALISIEREN. Hier ist ein einfaches Paket, das ich erstellt habe um jedem Projekt mit einem einzigen Befehl ein minimales Karma-Setup hinzuzufügen npm install min-karma.


Ich möchte einige mögliche Missverständnisse überKarmaundWinkelmesserklären. Karma FAQ bezieht sich tatsächlich auf Adapter für Angulars Scenario Runner , was jedoch mitProtractorbeing aufgegeben zu sein scheint stattdessen empfohlen.


Karma

Karma ist ein Test-Runner, der dasJavaScriptfilesangibtin die Konfigurationsdatei explizit oder mithilfe von ausführt Node-Globs . (Für Nicht-JavaScriptexterne Vorlagen, Angulars Unit Testing Guide empfiehlt die Verwendung von Karma-HTML-Präprozessor , um sie zuerst in JavaScript zu kompilieren.)

Dies könnenalleIhre Quelldateien sein,einigevon ihnen, einige von ihnen plus einigeadditionalfiles oder filesirrelevantfür Ihr Projekt, nur eine zusätzliche Konfiguration - Sie nennen es! Sie können mehrere Karma-Konfigurationsdateien für verschiedene Zwecke haben, die Sie parallel oder einzeln ausführen können. Jeder Karma-Prozess startet seine eigenen Browser (diese sind derzeit verfügbar) .

DieseFunktionvonKarmanur eineDateigruppeauszuführen ist was macht es perfekt für schnelle Tests, die im Hintergrund bei jeder Quelldatei-Bearbeitung ausgeführt werden, und gibt sofortiges Feedback, was genial ist! Das einzig Negative ist die "laute" Fehlermeldung, die sich hoffentlich verbessern wird!


Karma ist nicht nur für Unit-Tests

Unit Test ist für eine einzelne Einheit Ihres Quellcodes. In Angulars Fall ist eine typische Einheit Angular= Component (Service, Factory, Provider, Controller, Filter, Directive Etc). Denken Sie daran, Ihr Controllers dünn zu halten, so dass zu viele Einheitentests für letztere einrote Fahne.

In einemEinheitentestsollten nicht alle anderen Codeeinheiten, von denen diese Einheit abhängt (sogenannte Einheitenabhängigkeiten), gleichzeitig getestet werden. Stattdessen sollten sie "verspottet" werden, z. ersetzt durch etwas einfaches wie Dummy-Instanzen. Angular bietet großartige Unterstützung für Scheinumgebungen . Idealerweise möchten Sie all diese Verspottungen direkt in Ihren Tests sehen, sodass Sie sich nie wundern müssen, wo all diese Abhängigkeiten herkommen.

Karmaist genauso nützlich für Integrationstests , wobei eineGruppe von Quellcodeeinheitenzusammen mit nur/getestet wird.einige ihrer Abhängigkeitenwerden verspottet. Es ist wichtig zu bedenken, dass Abhängigkeiten standardmäßig von Ihren Quellcodemodulen bereitgestellt werden (sofern diese Module entweder direkt in Ihre Tests eingespeist oder Abhängigkeiten von anderen eingespeisten Modulen sind (in diesem Fall nicht) Sie müssen injiziert werden, schaden aber nicht.) Die verspotteten Abhängigkeiten überschreiben die bereitgestellten.

Schnell und häufig laufenist das Hauptmerkmal vonKarma. Dies bedeutet, dass Sie Serveranforderungen und Datenbankabfragen vermeiden möchten, die länger als Sekundenbruchteile dauern können. (Sonst wird es NICHT schnell!) Diese langen Prozesse möchten Siemock. Dies erklärt auch, warum es eine schlechte Praxis ist, unformatierte Low-Level-Services wie $http Direkt in Ihre Controller oder in komplizierte Geschäftslogikeinheiten zu integrieren. Indem Sie diese niedrigenexternen Kommunikationsdienstein kleinere dedizierte Dienste einbinden, können Sie sie viel einfacher "verspotten".

WasKarmanicht tutführt Ihre Site so aus, wie sie ist, was End-to-End-Tests (E2E) sind. Im Prinzip können Sie Angulars interne Methoden verwenden, um die Site oder ihre Teile neu zu erstellen. Was für kleine Stücke nützlich sein kann und ein schneller Weg, z.B. Richtlinien zu testen.

Es ist jedochnicht empfehlenswert,komplizierten Code in Ihre Tests zu werfen. Je mehr Sie es tun, desto größer ist die Wahrscheinlichkeit, dass Sie Fehler indiesem Code machenanstelle dessen, was Sie tatsächlich testen.

Deshalb mag ich persönlich die oft erwähnte komplizierte Art, Methoden mit Low-Level-Methoden wie $http Zu testen, nicht. Es funktioniert übersichtlicher, Verweise auf einfache Methoden indedizierte MethodenIhrer eigenen zu isolieren, derenEinzelverantwortungist http-Anfragen zu machen. Diese dedizierten Methoden sollten mitrealem Backendarbeiten können, keine gefälschten! Was Sie leicht testen können - manuell oder sogar vollkommen in Ordnung mitKarmaläuft miteiner anderen speziellen Konfiguration, solange Sie nicht mischen Diese Konfiguration wird normalerweise verwendet, umKarmanormal und schnell auszuführen. Nachdem Sie Ihre dedizierten kleinen Dienste getestet haben, können Sie sie sicher und einfach verspotten, um Ihre andere Logik zu testen und diese Tests in Ihr reguläresKarmaSetup zu übernehmen.


Zum Zusammenfassen. Verwenden SieKarma, um einen beliebigen Satz von JavaScript-Dateien auszuführen. Es ist (sollte) schnell. Sie sehen Ihre vollständige App nicht, können dasEndergebnisalso nicht effektiv und zuverlässig testen. Würde ich esmit Winkelmesserausführen? Warum sollte ich? Das Ausführen vonWinkelmesserwürde meine Tests verlangsamen und den Zweck vonKarmazunichte machen. Es ist einfach,Winkelmesserseparat auszuführen.


Winkelmesser

Winkelmesser ist:

ein End-to-End-Testframework für AngularJS-Anwendungen. Protractor führt Tests mit Ihrer Anwendung durch, die in einem echten Browser ausgeführt wird, und interagiert mit ihr wie ein Benutzer.

Also machtWinkelmessergenau das, wasKarmanicht - Ihre eigentliche endgültige Anwendung ausführen. Dies offenbart seine Kraft und seine Grenzen:

Vollständige Anwendung ausführenist der einzige zuverlässige Abschlusstest, bei dem Ihre Anwendung wie erwartet funktioniert. Sie können komplette User Story-Szenarien aufschreiben und in Ihre Tests einbinden!

Aberes ist schwieriger, Fehlerzu verfolgen, ohne einzelne Einheiten Ihres Quellcodes zu isolieren. Aus diesem Grund benötigen Sie immer nochKarma, um Ihren JavaScript-Code zuerst zu testen.


Jetzt möchte ichWinkelmessermitKarmaausführen? Ich kann sie sicherlich parallel in separaten Terminalfenstern ausführen. Ich könnte sie im Prinzip Testdateien teilen lassen, wenn ich muss, aber normalerweise würde ich es lieber nicht tun. Warum? Weil ich meine Tests für einen bestimmten Zweck klein halten möchte.

Die einzige Ausnahme wäre eine Datei, die Testmakros definiertnützlich für beide Läufer. Dies wäre jedoch keineTestdatei, sondern eineMakrodefinitionsdatei.

Ansonsten mag ich eine klare Trennung zwischen meinen Tests. Die, die häufig und schnell ausgeführt werden sollen, und die für die gesamte App. Das macht eine klare Trennung zwischenKarmaundWinkelmesser.

73
Dmitri Zaitsev

Karma ist ein Testläufer, der vom Angular) -Team bereitgestellt wird. Karma führt Ihre Tests in mehreren Browsern durch, um sicherzustellen, dass unsere Anwendung in allen Browsern kompatibel ist. Unit Test für angular js kann Karma + Jasmin verwendet werden

Jasmine ist ein Framework zum Testen von Javascript-Einheiten und stellt uns Dienstprogramme zum Testen unserer Anwendung zur Verfügung. Dies funktioniert am besten mit dem Angular Framework und damit unserer Wahl des "automatisierten Unit-Test-Tools". https://github.com/shahing/testingangularjs

Und Protractor ist ein End-to-End-Testframework für Angular und AngularJS-Anwendungen. Protractor führt Tests für Ihre Anwendung aus, die in einem echten Browser, Headless-Browsern und Cross-Browser-Tests ausgeführt werden und auf Saucelabs gehostet werden können .

https://github.com/shahing/Protractor-Web-Automation

1
Shahin