Können Winkelmesser und Karma zusammen verwendet werden?

104

Wenn Winkelmesser Angular Scenario Runner für E2E-Tests ersetzt, bedeutet dies, dass ich es weiterhin mit Karma als E2E-Testframework verwenden kann?

holographisches Prinzip
quelle
IMO solltest du können. Karma ist nur der Testläufer. Sobald Sie Ihre Testfälle in Protractor geschrieben / erstellt haben, sollte Karma in der Lage sein, sie einfach auszuführen, wenn Sie dazu aufgefordert werden. Auf die gleiche Weise können Sie Karma bitten, aktuelle E2E-Tests durchzuführen.
Skeep
1
@skeep Webdriver wird über das WebDriver-Protokoll erzeugt und mit Browsern verbunden - etwas, das Karma nicht unterstützt (stattdessen werden WebSockets und eine Webseite verwendet). Sie führen ähnliche Aufgaben auf sehr unterschiedliche Weise aus. Die jetzt veralteten Karma E2E-Tests verwenden WebDriver nicht und leiden darunter - sie müssen den Status innerhalb des Browsers beibehalten (der WebDriver-Status liegt vollständig außerhalb des Browserprozesses).
Andy

Antworten:

102

Vom aktuellen Winkelmesser-Betreuer nicht empfohlen:

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

Winkelmesser und Karma sollten nicht zusammen verwendet werden. Stattdessen bieten sie separate Systeme zum Ausführen von Tests. 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.

Protractor basiert auf WebDriverJS, das einen Selenium / WebDriver-Server verwendet, um Browser bereitzustellen und die Testausführung zu steuern. Beispiele für reines 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 getrennt zu halten - für End-to-End-Tests möchten Sie das native Ereignis-Fahren und die Flexibilität des Web-Treibers, während Sie für Unit-Tests eine schnelle Ausführung und automatische Überwachung von Dateien wünschen.

Jack
quelle
Stimmt das immer noch, dass wir Winkelmesser nicht von Karma aus betreiben sollten?
ErikAGriffin
@theLateWizard Absolut wahr, nicht nur du solltest nicht, du kannst nicht :)
Dmitri Zaitsev
74

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 über Karma und Winkelmesser klären . Die Karma-FAQ beziehen sich tatsächlich auf den Adapter für Angulars Scenario Runner , der jedoch offenbar aufgegeben wird. Stattdessen wird der Winkelmesser empfohlen.


Karma

Karma ist ein Testläufer, der die in Ihrer Konfigurationsdatei angegebenen JavaScript- Dateien explizit oder mithilfe von Node-Globs ausführt . (Für externe Vorlagen , die kein JavaScript sind , empfiehlt Angulars Unit Testing Guide die Verwendung des Karma-HTML-Präprozessors , um sie zuerst in JavaScript zu kompilieren.)

Dies können alle Ihre Quelldateien sein, einige davon, einige davon sowie einige zusätzliche Dateien oder Dateien , die für Ihr Projekt irrelevant sind und nur eine zusätzliche Konfiguration bieten - 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) .

Diese Funktion von Karma, mit der nur eine Reihe von Dateien ausgeführt werden kann, macht es perfekt für schnelle Tests, die bei jeder Bearbeitung der Quelldatei im Hintergrund ausgeführt werden, und um sofortiges Feedback zu erhalten, was brillant ist! Der einzige Nachteil ist die "laute" Fehlerberichterstattung, die sich hoffentlich verbessern wird!


Karma ist nicht nur für Unit-Tests

Der Komponententest bezieht sich auf eine einzelne Einheit Ihres Quellcodes. In Angulars Fall ist Angular Component ( Service, Factory, Provider, Controller, Filter, Directiveetc) eine typische Einheit . Denken Sie daran, Controllersdünn zu bleiben , so dass zu viele Unit-Tests für spätere eine rote Fahne sind .

Bei einem Komponententest sollten nicht alle anderen Codeeinheiten, von denen diese Einheit abhängt (sogenannte Einheitenabhängigkeiten), gleichzeitig getestet werden. Stattdessen sollten sie "verspottet" werden, z. B. durch etwas Einfaches wie Dummy-Instanzen ersetzt werden. Angular bietet großartige Unterstützung für Scheinumgebungen . Idealerweise möchten Sie all diese Mocks direkt in Ihren Tests sehen, sodass Sie sich nie fragen müssen, woher all diese Abhängigkeiten stammen.

Karma ist ebenso nützlich für Integrationstests , bei denen eine Gruppe von Quellcodeeinheiten zusammen getestet wird, wobei nur einige ihrer Abhängigkeiten verspottet werden. Es ist wichtig zu beachten, dass Abhängigkeiten standardmäßig von Ihren Quellcodemodulen bereitgestellt werden (sofern diese Module entweder direkt in Ihre Tests eingefügt wurden oder Abhängigkeiten von anderen eingefügten Modulen sind (in diesem Fall müssen Sie sie nicht einfügen) , aber kein Schaden, dies zu tun). Die verspotteten Abhängigkeiten überschreiben die bereitgestellten.

Schnelles und häufiges Laufen ist das Hauptmerkmal von Karma . Dies bedeutet, dass Sie Serveranforderungen, Datenbankabfragen und alles vermeiden möchten, was länger als Sekundenbruchteile dauern kann. ( Sonst geht es NICHT schnell! ) Diese langen Prozesse möchten Sie verspotten . Dies erklärt auch, warum es eine schlechte Praxis ist, rohe Low-Level-Services wie $httpdirekt in Ihre Controller oder komplizierte Geschäftslogikeinheiten zu integrieren. Indem Sie diese externen Kommunikationsdienste auf niedriger Ebene in kleinere dedizierte Dienste einbinden, können Sie sie viel einfacher "verspotten".

Was Karma nicht tut, ist, Ihre Site so zu betreiben, wie sie ist, was End-to-End-Tests (E2E) sind. Im Prinzip können Sie die internen Methoden von Angular verwenden, um die Site oder ihre Teile neu zu erstellen. Was für kleine Stücke nützlich sein kann und eine schnelle Möglichkeit ist, z. B. Anweisungen zu testen.

Es wird jedoch nicht empfohlen , komplizierten Code in Ihre Tests zu werfen. Je mehr Sie es tun, desto größer ist die Wahrscheinlichkeit, dass Sie Fehler in diesem Code machen , anstatt in dem, was Sie tatsächlich testen.

Aus diesem Grund mag ich persönlich die oft erwähnte komplizierte Art, Methoden mit Low-Level-Methoden wie zu testen, nicht $http. Es funktioniert sauberer, alle Verweise auf Low-Level-Methoden in eigene Methoden zu isolieren , deren einzige Verantwortung darin besteht, http-Anfragen zu stellen. Diese dedizierten Methoden sollten mit echtem Backend arbeiten können , nicht mit gefälschten! Was Sie leicht testen können - manuell oder sogar perfekt, wenn Karma mit einer anderen speziellen Konfiguration ausgeführt wird , solange Sie diese Konfiguration nicht mit der Konfiguration mischen, die normalerweise zum Ausführen von Karma verwendet wirdregelmäßig und schnell. 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äres Karma- Setup zu integrieren.


Zusammenfassen. Verwenden Sie Karma , um einen beliebigen Satz von JavaScript-Dateien auszuführen. Es ist (sollte) schnell. Sie sehen nicht Ihre vollständige App und können das Endergebnis daher nicht effektiv und zuverlässig testen . Würde ich es mit Winkelmesser ausführen ? Warum sollte ich? Das Ausführen von Winkelmesser würde meine Tests verlangsamen und den Zweck von Karma zunichte machen . Es ist einfach, den Winkelmesser separat auszuführen .


Winkelmesser

Winkelmesser ist:

Ein End-to-End-Testframework für AngularJS-Anwendungen. Der Winkelmesser führt Tests für Ihre Anwendung durch, die in einem echten Browser ausgeführt wird, und interagiert damit wie ein Benutzer.

So Protractor tut genau das, was Karma nicht - führen Sie Ihre wirkliche Endanwendung. Dies zeigt sowohl seine Kraft als auch seine Grenzen:

Das Ausführen einer vollständigen Anwendung ist der einzige zuverlässige Abschlusstest, bei dem Ihre Anwendung wie erwartet funktioniert. Sie können komplette User Story-Szenarien schreiben und in Ihre Tests einbeziehen!

Es ist jedoch schwieriger, Fehler zu verfolgen, ohne einzelne Einheiten Ihres Quellcodes zu isolieren. Aus diesem Grund benötigen Sie immer noch Karma , um zuerst Ihren JavaScript-Code zu testen.


Würde ich jetzt Winkelmesser mit Karma ausführen wollen ? Ich kann sie sicher in separaten Terminalfenstern parallel ausführen. Ich könnte sie im Prinzip dazu bringen, Testdateien zu teilen, wenn ich muss, aber normalerweise würde ich es lieber nicht. Warum? Weil ich meine Tests mit einem einzigen Zweck klein halten möchte.

Die einzige Ausnahme wäre eine Datei , die Testmakros definiert, die für beide Läufer nützlich sind. Dies wäre jedoch keine Testdatei, sondern eine Makrodefinitionsdatei .

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 zwischen der Verwendung von Karma und dem Winkelmesser .

Dmitri Zaitsev
quelle
Wenn ich sowohl Unit-Tests als auch E2E-Tests durchführen möchte, muss ich die Karma-Umgebung für Unit-Tests und Winkelmesser für UI-Tests oder E2E-Tests konfigurieren.
Sunil Garg
@SunilGarg Ja, wenn Sie beide verwenden möchten, aber wie ich schrieb, ist Karma nicht nur für Unit-Tests.
Dmitri Zaitsev
1

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 eckige js kann Karma + Jasmin verwendet werden

Jasmine ist ein JavaScript-Unit-Test-Framework 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. Winkelmesser führt Tests für Ihre Anwendung durch, die in einem echten Browser, Headless-Browsern und Cross-Browser-Tests ausgeführt werden, und kann auf Saucelabs gehostet werden.

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

Shahin
quelle
1

Ja, Sie können Karma und Winkelmesser zusammen verwenden. Karma wird zum Testen der Komponente verwendet, die Sie mit dem Winkelbefehl erstellt haben. Sie können diese Komponenten mit Karma testen. Der Winkelmesser wird für den End-to-End-Test verwendet. Es wird hauptsächlich für UI-Tests verwendet.

Rahul Solanki
quelle
Um dies zu erreichen, müssen Sie die Konfiguration für Karma und Winkelmesser hinzufügen
Rahul Solanki