Czy Kątomierz i Karma mogą być używane razem?


104

Jeśli Protractor zastępuje Angular Scenario Runner do testowania E2E, czy to oznacza, że ​​nadal będę mógł go używać z Karmą jako moją platformą testową E2E?


IMO powinieneś być w stanie. Karma to tylko biegacz testowy. Kiedy już napiszesz / zbudujesz swoje przypadki testowe w Protractorze ... karma powinna być w stanie go po prostu uruchomić, gdy zostaniesz o to poproszony. W ten sam sposób możesz poprosić Karmę o przeprowadzenie obecnych testów E2E.
skeep

1
@skeep Webdriver uruchamia się i łączy z przeglądarkami za pośrednictwem protokołu WebDriver - coś, czego Karma nie obsługuje (zamiast tego używa WebSockets i strony internetowej). Wykonują podobne zadania na bardzo różne sposoby. Obecnie przestarzałe testy Karma E2E nie używają WebDriver i cierpią z tego powodu - muszą utrzymywać stan w przeglądarce (stan WebDriver jest całkowicie poza procesem przeglądarki).
Andy,

Odpowiedzi:


102

Niezalecane przez obecnego opiekuna Protractora:

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

Kątomierz i Karma nie powinny być używane razem; zamiast tego zapewniają oddzielne systemy do przeprowadzania testów. Kątomierz i Karma obejmują różne aspekty testowania - Karma jest przeznaczona głównie do testów jednostkowych, podczas gdy Kątomierz powinien być używany do testowania od końca do końca.

Protractor jest zbudowany na bazie WebDriverJS, który wykorzystuje serwer Selenium / WebDriver do udostępniania przeglądarek i wykonywania testów. Przykłady czystego WebDriverJS można znaleźć tutaj: http://code.google.com/p/selenium/wiki/WebDriverJs

I

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

Georgios - myślę, że oddzielenie Protractora i Karmy ma sens - w przypadku testów end-to-end potrzebujesz natywnego sterowania zdarzeniami i elastyczności webdrivera, podczas gdy do testów jednostkowych potrzebujesz szybkiego wykonywania i automatycznego sprawdzania plików.


Czy to nadal prawda, że ​​nie powinniśmy uruchamiać Protractora przed Karmą?
ErikAGriffin

@theLateWizard Absolutnie prawda, nie tylko nie powinieneś, nie możesz :)
Dmitri Zaitsev

74

AKTUALIZACJA. Oto prosty pakiet, który stworzyłem, aby dodać minimalną konfigurację Karmy do dowolnego projektu za pomocą jednego polecenia npm install min-karma.


Chciałbym wyjaśnić kilka możliwych błędnych przekonań na temat Karmy i Kątomierz . Karma FAQ faktycznie odnosi się do Adapter for Angular's Scenario Runner , który jednak wydaje się być porzucony, a zamiast tego zalecany jest Protractor .


Karma

Karma to program uruchamiający testy, który będzie uruchamiał pliki JavaScript określone w twoim pliku konfiguracyjnym jawnie lub za pomocą node-globs . (W przypadku zewnętrznych szablonów innych niż JavaScript , przewodnik po testach jednostkowych Angular zaleca użycie preprocesora Karma html do skompilowania ich najpierw do JavaScript.

Mogą to być wszystkie twoje pliki źródłowe, niektóre z nich, niektóre z nich plus dodatkowe pliki lub pliki nieistotne dla twojego projektu, zapewniające tylko dodatkową konfigurację - możesz to nazwać! Możesz mieć wiele plików konfiguracyjnych karmy do różnych celów, które możesz uruchamiać równolegle lub jeden po drugim. Każdy proces karmy uruchamia własny zestaw przeglądarek (są one obecnie dostępne) .

Ta cecha stanowi Karmy uruchomić tylko zestaw plików , co czyni go idealnym do szybkich testów uruchomiony w tle po każdej edycji pliku źródłowego i uzyskać natychmiastową informację zwrotną, która jest genialna! Jedynym minusem jest „głośne” raportowanie błędów, które, miejmy nadzieję, ulegnie poprawie!


Karma to nie tylko testy jednostkowe

Test jednostkowy dotyczy pojedynczej jednostki kodu źródłowego. W przypadku Angulara typową jednostką jest komponent kątowy ( Service, Factory, Provider, Controller, Filter, Directiveitp.). Pamiętaj, aby zachować Controllersszczupłość, więc zbyt wiele testów jednostkowych dla ostatnich to czerwona flaga .

W teście jednostkowym nie powinny być testowane jednocześnie wszystkie inne jednostki kodu, od których ta jednostka zależy (tzw. Zależności jednostek). Zamiast tego powinny być „wyszydzane”, np. Zastąpione przez coś prostego, np. Atrapy. Angular zapewnia doskonałą obsługę makiety . Idealnie byłoby, gdybyś chciał zobaczyć wszystkie te makiety bezpośrednio w swoich testach, więc nigdy nie musisz się zastanawiać, skąd pochodzą te wszystkie zależności.

Karma jest równie przydatna w testach integracji , w których grupa jednostek kodu źródłowego jest testowana razem, a tylko niektóre z ich zależności są mockowane. Należy pamiętać, że każda zależność jest domyślnie dostarczana z modułów kodu źródłowego (o ile te moduły albo są wstrzykiwane bezpośrednio w twoich testach , albo są zależnościami innych wstrzykniętych modułów (w takim przypadku nie musisz ich wstrzykiwać , ale bez szkody) .Zmokowane zależności zastąpią te dostarczone.

Bieganie szybko i często to główna cecha Karmy . Oznacza to, że chcesz uniknąć żądań serwera, zapytań do bazy danych, wszystkiego, co może zająć więcej niż ułamki sekund. ( W przeciwnym razie NIE będzie to szybkie! ) Te długie procesy to te, z których chcesz kpić . Wyjaśnia to również, dlaczego złą praktyką jest umieszczanie surowych usług niskiego poziomu, takich jak $httpbezpośrednio wewnątrz kontrolerów lub jakichkolwiek skomplikowanych jednostek logiki biznesowej. Pakując te niskopoziomowe zewnętrzne usługi komunikacyjne w mniejsze dedykowane usługi, znacznie łatwiej jest je „wyszydzać”.

To, czego Karma nie robi, to prowadzenie witryny w takiej postaci, w jakiej jest, czyli testowanie typu End-to-End (E2E). Zasadniczo możesz użyć wewnętrznych metod Angulara, aby odtworzyć witrynę lub jej fragmenty. Które dla małych kawałków mogą być przydatne i szybkie np. Do testowania dyrektyw.

Nie jest to jednak zalecany sposób wrzucania skomplikowanego kodu do testów. Im częściej to robisz, tym większa szansa, że ​​popełnisz błędy w tym kodzie, a nie w tym, co faktycznie testujesz.

Dlatego osobiście nie lubię często wspominanego skomplikowanego sposobu testowania metod niskopoziomowych, takich jak $http. Wyodrębnienie wszelkich odwołań do metod niskiego poziomu do własnych, dedykowanych metod , których jedynym obowiązkiem jest wykonywanie żądań http, działa czyściej . Te dedykowane metody powinny działać z prawdziwym zapleczem , a nie fałszywym! Które możesz łatwo przetestować - ręcznie lub nawet idealnie, jeśli Karma działa z inną specjalną konfiguracją , o ile nie mieszasz tej konfiguracji z tą zwykle używaną do uruchamiania Karmyregularne i szybkie. Teraz, po przetestowaniu dedykowanych małych usług, możesz bezpiecznie i łatwo z nich kpić, aby przetestować inną logikę i umieścić te testy w swojej zwykłej konfiguracji Karma .


Podsumowując. Użyj Karmy, aby uruchomić dowolny zestaw plików JavaScript. To jest (powinno być) szybkie. Nie widzisz całej aplikacji, więc nie możesz skutecznie i niezawodnie przetestować końcowego wyniku . Czy uruchomiłbym to z Protractorem ? Dlaczego miałabym? Uruchomienie Protractora spowolniłoby moje testy, pokonując cel Karmy . Kątomierz można łatwo uruchomić oddzielnie.


Kątomierz

Kątomierz to:

kompleksowe środowisko testowe dla aplikacji AngularJS. Protractor przeprowadza testy aplikacji działającej w prawdziwej przeglądarce, wchodząc z nią w interakcję tak, jak robiłby to użytkownik.

Tak więc Protractor robi dokładnie to, czego nie robi Karma - uruchamia Twoją ostateczną aplikację. To ujawnia zarówno jego moc, jak i ograniczenia:

Uruchomienie kompletnej aplikacji to jedyny wiarygodny test końcowy, w którym aplikacja działa zgodnie z oczekiwaniami. Możesz napisać kompletne scenariusze historyjek użytkownika i umieścić je w swoich testach!

Ale trudniej jest śledzić błędy bez izolowania poszczególnych jednostek kodu źródłowego. Dlatego nadal potrzebujesz Karmy, aby najpierw przetestować kod JavaScript.


Czy teraz chciałbym uruchomić Protractora z Karmą ? Z pewnością mogę je uruchomić równolegle w osobnych oknach terminala. W zasadzie mógłbym poprosić ich o udostępnienie plików testowych, jeśli zajdzie taka potrzeba, ale normalnie wolałbym tego nie robić. Czemu? Ponieważ chcę, aby moje testy były małe i miały jeden cel.

Jedynym wyjątkiem byłby plik definiujący makra testowe przydatne dla obu runnerów. Nie byłby to jednak plik testowy, ale plik definicji makr .

Poza tym lubię wyraźne oddzielenie moich testów. Te, które mają być uruchamiane często i szybko, oraz te dla całej aplikacji. To wyraźnie rozdziela użycie Karmy i Kątomierz .


Jeśli chcę testy jednostkowe, a także testy e2e, muszę skonfigurować środowisko karma do testów jednostkowych i kątomierz do testów interfejsu użytkownika lub testów e2e?
Sunil Garg

@SunilGarg Tak, jeśli chcesz używać obu, ale jak napisałem, Karma to nie tylko testy jednostkowe.
Dmitri Zaitsev

1

Karma to tester dostarczony przez zespół Angular, Karma wykona Twoje testy w wielu przeglądarkach, co zapewni kompatybilność naszej aplikacji ze wszystkimi przeglądarkami. Test jednostkowy dla kątowego js może być użyty karma + jaśmin

Jasmine to platforma do testowania jednostkowego javascript i zapewni nam narzędzia do testowania naszej aplikacji. Działa to najlepiej na frameworku Angular, dlatego też wybieramy „zautomatyzowane narzędzie do testowania jednostkowego”. https://github.com/shahing/testingangularjs

Protractor to kompleksowe środowisko testowe dla aplikacji Angular i AngularJS. Protractor przeprowadza testy aplikacji działającej w prawdziwej przeglądarce, przeglądarkach bezgłowych, testach między przeglądarkami i może być hostowany na saucelabs.

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


1

Tak, możesz używać razem karmy i kątomierza. Karma służy do testowania jednostkowego komponentu, który utworzyłeś za pomocą polecenia kątowego, możesz przetestować te komponenty za pomocą karmy. Kątomierz służy do testu od końca do końca. Jest używany głównie do testowania interfejsu użytkownika.


Aby to osiągnąć, musisz dodać konfigurację zarówno dla karmy, jak i kątomierza
Rahul Solanki
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.