Testowanie jednostkowe AngularJS z Karma i Jasmine

โšก Inteligentne podsumowanie

Testowanie jednostkowe AngularJS z uลผyciem Karma i Jasmine weryfikuje kontrolery, dyrektywy i usล‚ugi w izolacji. Karma uruchamia specyfikacje w rzeczywistych przeglฤ…darkach, Jasmine dostarcza skล‚adniฤ™ asercji, a Angular-mocks wstrzykuje zaleลผnoล›ci bez serwera rzeczywistego.

  • ๐Ÿงฑ Podziaล‚ narzฤ™dzi: Karma jest narzฤ™dziem uruchamiajฤ…cym testy, Jasmine stanowi strukturฤ™ specyfikacji, a angular-mocks dostarcza narzฤ™dzi wspomagajฤ…cych wstrzykiwanie zaleลผnoล›ci.
  • โš™๏ธ ลšcieลผka instalacji: Zainstaluj karma, karma-chrome-launcher, karma-jasmine i karma-cli przez npm, a nastฤ™pnie wygeneruj karma.conf.js.
  • ๐Ÿ“ Reguล‚a konfiguracji: Tablica plikรณw musi zawieraฤ‡ (w podanej kolejnoล›ci) pliki angular.js, angular-mocks.js, ลบrรณdล‚a aplikacji i folder testowy.
  • ๐ŸŽ›๏ธ Testowanie kontrolera: Wstrzyknij usล‚ugฤ™ $controller, przekaลผ obiekt pozorowany $scope, a nastฤ™pnie potwierdลบ wartoล›ci przypisane przez kontroler.
  • ๐Ÿงฉ Testowanie dyrektywne: Uลผyj $compile z $rootScope, wywoล‚aj $digest i sprawdลบ wyrenderowany kod zwrรณcony przez dyrektywฤ™.
  • ๐ŸŒ Warstwa od koล„ca do koล„ca: ProtracTor steruje dziaล‚ajฤ…cฤ… aplikacjฤ… i zlicza powtarzajฤ…ce siฤ™ wiersze wygenerowane przez ng-repeat.
  • ๐Ÿ“Œ Status wsparcia: Wsparcie dla AngularJS zakoล„czyล‚o siฤ™ 31 grudnia 2021 r., dlatego traktuj ten przepล‚yw pracy jako wiedzฤ™ przeznaczonฤ… do utrzymania starszej wersji.

Testowanie jednostkowe AngularJS z uลผyciem Karma i Jasmine

Jednฤ… z najwspanialszych cech AngularJS jest Testy aspekt. Kiedy programiล›ci Google Tworzฤ…c AngularJS, pamiฤ™tali o testowaniu i upewnili siฤ™, ลผe caล‚a struktura AngularJS jest testowalna.

W AngularJS testowanie jest zazwyczaj przeprowadzane za pomocฤ… frameworka Karma. Testowanie w AngularJS moลผna przeprowadziฤ‡ bez Karmy, ale framework Karma oferuje tak znakomite funkcje testowania kodu AngularJS, ลผe korzystanie z niego ma sens.

โš ๏ธ Uwaga dotyczฤ…ca wersji: AngularJS (wersja 1.x) oficjalnie zakoล„czyล‚ wsparcie techniczne 31 grudnia 2021 r., a ProtracTor zostaล‚ wycofany w sierpniu 2023 roku. Przepล‚yw pracy opisany na tej stronie nadal obowiฤ…zuje w przypadku utrzymania istniejฤ…cych aplikacji AngularJS 1.x. Nowe projekty powinny korzystaฤ‡ z nowoczesnego Angulara z aktualnie obsล‚ugiwanym programem uruchamiajฤ…cym.

Wprowadzenie i instalacja frameworku Karma

Karma jest narzฤ™dzie do automatyzacji testรณw stworzone przez zespรณล‚ AngularJS w GooglePierwszym krokiem do korzystania z Karmy jest jej instalacja. Karmฤ™ instaluje siฤ™ za pomocฤ… npm (menedลผera pakietรณw sล‚uลผฤ…cego do ล‚atwej instalacji moduล‚รณw na komputerze lokalnym).

Instalacja Karmy

Instalacja Karmy poprzez npm odbywa siฤ™ w procesie dwuetapowym.

Krok 1) Wykonaj poniลผszฤ… liniฤ™ z poziomu wiersza poleceล„

npm install karma karma-chrome-launcher karma-jasmine --save-dev

W ktรณrym,

  1. npm to narzฤ™dzie wiersza poleceล„ dla menedลผera pakietรณw Node, sล‚uลผฤ…ce do instalowania niestandardowych moduล‚รณw na dowolnym komputerze. Jest dostarczane z node.js.
  2. Parametr install informuje narzฤ™dzie wiersza poleceล„ npm, ลผe wymagana jest instalacja.
  3. W wierszu poleceล„ okreล›lone sฤ… 3 biblioteki wymagane do pracy z karmฤ….
    • karma jest podstawowฤ… bibliotekฤ…, ktรณra bฤ™dzie uลผywana do celรณw testowych.
    • karma-chrome-launcher to osobna biblioteka, ktรณra umoลผliwia rozpoznawanie poleceล„ karmy przez przeglฤ…darkฤ™ Chrome.
    • karma-jasmine โ€“ instaluje jaล›min, ktรณry jest zaleลผnym frameworkiem dla Karmy.

Krok 2) Nastฤ™pnym krokiem jest instalacja narzฤ™dzia wiersza poleceล„ karma. Jest to wymagane do wykonywania poleceล„ linii karmy. Narzฤ™dzie karma line zostanie uลผyte do zainicjowania ล›rodowiska karmy do testรณw.

Aby zainstalowaฤ‡ narzฤ™dzie wiersza poleceล„, wykonaj poniลผszy wiersz z poziomu wiersza poleceล„

npm install -g karma-cli
  • Karma-cli sล‚uลผy do instalacji interfejsu wiersza poleceล„ dla programu Karma, ktรณry bฤ™dzie uลผywany do zapisywania poleceล„ programu Karma w interfejsie wiersza poleceล„. Flaga -g instaluje go globalnie, dziฤ™ki czemu polecenie Karma jest dostฤ™pne z dowolnego folderu.

Konfiguracja frameworku Karma

Nastฤ™pnym krokiem jest skonfigurowanie karmy, czego moลผna dokonaฤ‡ za pomocฤ… polecenia

karma init

Po wykonaniu powyลผszego kroku karma utworzy plik karma.conf.js. Plik prawdopodobnie bฤ™dzie wyglฤ…daล‚ jak fragment pokazany poniลผej

files: [
  'node_modules/angular/angular.js',
  'node_modules/angular-mocks/angular-mocks.js',
  'lib/app.js',
  'tests/*.js'
]

Powyลผsze pliki konfiguracyjne przekazujฤ… silnikowi wykonawczemu Karma nastฤ™pujฤ…ce informacje

  1. angular.js โ€“ Daje to karmie sygnaล‚, ลผe Twoja aplikacja zaleลผy od gล‚รณwnych moduล‚รณw AngularJS.
  2. angular-mocks.js โ€“ Polecenie to informuje karmฤ™, aby uลผyล‚a funkcjonalnoล›ci testรณw jednostkowych dla AngularJS z pliku angular-mocks.js.
  3. Wszystkie gล‚รณwne pliki aplikacji lub logiki biznesowej znajdujฤ… siฤ™ w folderze lib Twojej aplikacji.
  4. Folder testรณw bฤ™dzie zawieraล‚ wszystkie testy jednostkowe.

๐Ÿ’ก Wskazรณwka: Kolejnoล›ฤ‡ ma znaczenie w tablicy plikรณw. Plik angular.js musi zostaฤ‡ zaล‚adowany przed plikiem angular-mocks.js, a oba muszฤ… zostaฤ‡ zaล‚adowane przed kodem aplikacji. W przeciwnym razie wstrzykiwacz nie bฤ™dzie dostฤ™pny po uruchomieniu specyfikacji.

Aby sprawdziฤ‡ czy karma dziaล‚a utwรณrz plik o nazwie Sample.js, umieล›ฤ‡ w nim poniลผszy kod i umieล›ฤ‡ go w katalogu test.

describe('Sample test', function() {
  it('Condition is true', function() {
    expect('AngularJS').toBe('AngularJS');
  });
});

Powyลผszy kod ma nastฤ™pujฤ…ce aspekty

  1. Funkcja opisu sล‚uลผy do opisywania testu. W naszym przypadku do naszego testu nadajemy opis โ€žTest prรณbnyโ€.
  2. Funkcja โ€žitโ€ sล‚uลผy do nadania nazwy testowi. W naszym przypadku podajemy nazwฤ™ naszego testu jako โ€žWarunek jest prawdziwyโ€. Nazwa testu musi byฤ‡ zrozumiaล‚a.
  3. Kombinacja sล‚รณw kluczowych โ€žoczekiwaฤ‡โ€ i โ€žbyฤ‡โ€ okreล›la, jaka jest oczekiwana i rzeczywista wartoล›ฤ‡ wyniku testu. Jeล›li wartoล›ฤ‡ rzeczywista i oczekiwana sฤ… takie same, test zakoล„czy siฤ™ pomyล›lnie, w przeciwnym razie zakoล„czy siฤ™ niepowodzeniem.

Po wykonaniu poniลผszego wiersza poleceล„ zostanie wykonany powyลผszy plik testowy

karma start

Poniลผsze dane wyjล›ciowe pochodzฤ… z IDE Webstorm w ktรณrym wykonano powyลผsze czynnoล›ci.

Konfiguracja Frameworku Karma

  1. Dane wyjล›ciowe znajdujฤ… siฤ™ w eksploratorze Karmy Webstorm. To okno pokazuje wykonanie wszystkich testรณw zdefiniowanych w ramach karmy.
  2. Tutaj moลผesz zobaczyฤ‡, ลผe pokazany jest opis wykonanego testu, ktรณry jest โ€žTestem prรณbkiโ€.
  3. Nastฤ™pnie widaฤ‡, ลผe wykonywany jest sam test o nazwie โ€žWarunek jest prawdziwyโ€.
  4. Naleลผy pamiฤ™taฤ‡, ลผe obok wszystkich testรณw znajduje siฤ™ zielona ikona โ€žOKโ€, ktรณra symbolizuje pomyล›lne zakoล„czenie wszystkich testรณw.

Czym jest Jasmine w testach jednostkowych AngularJS?

Karma decyduje, gdzie uruchamiane sฤ… testy, a Jasmine decyduje, jak sฤ… one pisane. Jasmine to framework specyfikacji oparty na zachowaniu, ktรณry dostarcza sล‚ownictwa uลผywanego w kaลผdym przykล‚adzie na tej stronie. Dlatego adapter karma-jasmine jest instalowany wraz z programem uruchamiajฤ…cym.

Jasmine wnosi cztery podstawowe elementy:

  • opisaฤ‡(): Grupuje powiฤ…zane specyfikacje w zestaw i akceptuje czytelny opis testowanej jednostki.
  • To(): Deklaruje pojedynczฤ… specyfikacjฤ™. Nazwa powinna okreล›laฤ‡ weryfikowane zachowanie, a nie wywoล‚ywanฤ… metodฤ™.
  • expect() z matcherami: Porรณwnuje wartoล›ฤ‡ rzeczywistฤ… z oczekiwanฤ…. Typowe dopasowania to: toBe, toEqual, toContain i toBeDefined.
  • beforeEach() i afterEach(): Przeprowadลบ konfiguracjฤ™ i demontaลผ przed i po kaลผdej specyfikacji, dziฤ™ki czemu kaลผdy test pozostanie niezaleลผny.

Jasmine oferuje rรณwnieลผ szpiegรณw. Szpieg zastฤ™puje rzeczywistฤ… funkcjฤ™ zarejestrowanym zastฤ™pstwem, dziฤ™ki czemu kontroler moลผna testowaฤ‡ bez wywoล‚ywania aktywnego punktu koล„cowego HTTP. Poniewaลผ Jasmine nie potrzebuje DOM ani wล‚asnej biblioteki asercji, poล‚ฤ…czenie Karmy i Jasmine pozostaje najlลผejszym sposobem na uruchomienie AngularJS. JavaTesty jednostkowe skryptรณw.

Testowanie kontrolerรณw AngularJS

Struktura testowania karmy ma rรณwnieลผ funkcjฤ™ kompleksowego testowania kontrolerรณw. Obejmuje to testowanie obiektu $scope uลผywanego w kontrolerach.

Spรณjrzmy na przykล‚ad, jak moลผemy to osiฤ…gnฤ…ฤ‡.

W naszym przykล‚adzie

Najpierw musielibyล›my zdefiniowaฤ‡ kontroler. Ten kontroler wykona poniลผsze kroki

  1. Utwรณrz zmiennฤ… ID i przypisz jej wartoล›ฤ‡ 5.
  2. Przypisz zmiennฤ… ID do obiektu $scope.

Nasz test sprawdzi istnienie tego kontrolera, a takลผe sprawdzi, czy zmienna ID obiektu $scope jest ustawiona na 5.

Najpierw musimy siฤ™ upewniฤ‡, ลผe speล‚nione sฤ… nastฤ™pujฤ…ce warunki wstฤ™pne

Zainstaluj bibliotekฤ™ Angular-Mocks za pomocฤ… npm. Moลผesz to zrobiฤ‡, wykonujฤ…c poniลผszy wiersz polecenia w wierszu poleceล„.

npm install angular-mocks --save-dev

Nastฤ™pnie naleลผy zmodyfikowaฤ‡ plik karma.conf.js, aby upewniฤ‡ siฤ™, ลผe do testu zostanฤ… doล‚ฤ…czone odpowiednie pliki. Poniลผszy segment pokazuje tylko czฤ™ล›ฤ‡ plikรณw karma.conf.js, ktรณra wymaga modyfikacji

files: ['lib/angular.js', 'lib/angular-mocks.js', 'lib/index.js', 'test/*.js']
  • Parametr โ€žplikiโ€ w zasadzie informuje Karmฤ™ o wszystkich plikach wymaganych do przeprowadzenia testรณw.
  • Pliki angular.js i angular-mocks.js sฤ… wymagane do uruchomienia testรณw jednostkowych AngularJS
  • Plik Index.js bฤ™dzie zawieraล‚ nasz kod dla kontrolera
  • Folder test bฤ™dzie zawieraล‚ wszystkie nasze testy AngularJS

Poniลผej znajduje siฤ™ nasz kod AngularJS, ktรณry zostanie zapisany jako plik Index.js w folderze testowym naszej aplikacji.

Poniลผszy kod wykonuje nastฤ™pujฤ…ce czynnoล›ci

  1. Tworzenie Moduล‚ AngularJS o nazwie przykล‚adowa aplikacja
  2. Utwรณrz kontroler o nazwie AngularJSController
  3. Utwรณrz zmiennฤ… o nazwie ID, nadaj jej wartoล›ฤ‡ 5 i przypisz jฤ… do obiektu $scope
var sampleApp = angular.module('sampleApp', []);
sampleApp.controller('AngularJSController', function($scope) {
  $scope.ID = 5;
});

Po pomyล›lnym wykonaniu powyลผszego kodu nastฤ™pnym krokiem bฤ™dzie utworzenie pliku Przypadek testowy aby upewniฤ‡ siฤ™, ลผe kod zostaล‚ napisany i wykonany poprawnie.

Kod naszego testu bฤ™dzie taki, jak pokazano poniลผej.

Kod bฤ™dzie w osobnym pliku o nazwie ControllerTest.js, ktรณry zostanie umieszczony w folderze test. Poniลผszy kod wykonuje nastฤ™pujฤ…ce kluczowe czynnoล›ci

  1. Funkcja beforeEach โ€“ Ta funkcja sล‚uลผy do zaล‚adowania naszego moduล‚u AngularJS o nazwie โ€žsampleAppโ€ przed uruchomieniem testu. Naleลผy pamiฤ™taฤ‡, ลผe jest to nazwa moduล‚u w pliku index.js.
  2. Obiekt $controller jest tworzony jako obiekt-makieta dla kontrolera โ€žAngularJSControllerโ€, ktรณry jest zdefiniowany w pliku index.js. W kaลผdym rodzaju testรณw jednostkowych obiekt-makieta reprezentuje obiekt-fisz, ktรณry bฤ™dzie faktycznie uลผywany do testowania. Ten obiekt-makieta bฤ™dzie symulowaล‚ zachowanie naszego kontrolera.
  3. beforeEach(inject(function(_$controller_)) โ€“ Sล‚uลผy do wstrzykniฤ™cia prรณbnego obiektu w naszym teล›cie, tak aby zachowywaล‚ siฤ™ jak rzeczywisty kontroler.
  4. var $zakres = {}; To jest obiekt prรณbny tworzony dla obiektu $scope.
  5. var controller = $controller('AngularJSController', { $scope: $scope }); โ€“ Tutaj sprawdzamy istnienie kontrolera o nazwie โ€žAngularJSControllerโ€. Tutaj przypisujemy rรณwnieลผ wszystkie zmienne z obiektu $scope w kontrolerze w pliku Index.js do obiektu $scope w pliku testowym.
  6. Na koniec porรณwnujemy $scope.ID z 5
describe('AngularJSController', function() {
  beforeEach(module('sampleApp'));

  var $controller;

  beforeEach(inject(function(_$controller_){
    $controller = _$controller_;
  }));

  describe('$scope.ID', function() {
    it('Check the scope object', function() {
      var $scope = {};
      var controller = $controller('AngularJSController', { $scope: $scope });
      expect($scope.ID).toEqual(5);
    });
  });
});

Powyลผszy test zostanie uruchomiony w przeglฤ…darce karmy i da taki sam wynik pozytywny, jak pokazano w poprzednim temacie.

Testowanie dyrektyw AngularJS

Struktura testowania karmy oferuje rรณwnieลผ funkcjonalnoล›ฤ‡ testowania dyrektyw niestandardowych. Obejmuje to szablonURLktรณre sฤ… uลผywane w dyrektywach niestandardowych.

Spรณjrzmy na przykล‚ad, jak moลผemy to osiฤ…gnฤ…ฤ‡.

W naszym przykล‚adzie najpierw zdefiniujemy niestandardowฤ… dyrektywฤ™, ktรณra wykonuje nastฤ™pujฤ…ce czynnoล›ci

  1. Utwรณrz moduล‚ AngularJS o nazwie sampleApp
  2. Utwรณrz niestandardowฤ… dyrektywฤ™ o nazwie โ€“ guru99
  3. Utwรณrz funkcjฤ™ zwracajฤ…cฤ… szablon ze znacznikiem nagล‚รณwka wyล›wietlajฤ…cym tekst โ€žTo jest testowanie AngularJSโ€.
var sampleApp = angular.module('sampleApp', []);
sampleApp.directive('guru99', function () {
  return {
    restrict: 'E',
    replace: true,
    template: '<h1>This is AngularJS Testing</h1>'
  };
});

Po pomyล›lnym wykonaniu powyลผszego kodu nastฤ™pnym krokiem bฤ™dzie utworzenie przypadku testowego, aby upewniฤ‡ siฤ™, ลผe kod zostaล‚ napisany i wykonany poprawnie. Kod naszego testu bฤ™dzie taki, jak pokazano poniลผej

Kod bฤ™dzie w osobnym pliku o nazwie DirectiveTest.js, ktรณry zostanie umieszczony w folderze test. Poniลผszy kod wykonuje nastฤ™pujฤ…ce kluczowe czynnoล›ci

  1. Funkcja beforeEach โ€“ Ta funkcja sล‚uลผy do zaล‚adowania naszego moduล‚u AngularJS o nazwie โ€žsampleAppโ€ przed uruchomieniem testu.
  2. Usล‚uga $compile sล‚uลผy do kompilowania dyrektywy. Ta usล‚uga jest obowiฤ…zkowa i musi zostaฤ‡ zadeklarowana, aby AngularJS mรณgล‚ jej uลผyฤ‡ do skompilowania naszej niestandardowej dyrektywy.
  3. $rootScope to podstawowy zakres dowolnej aplikacji AngularJS. Widzieliล›my obiekt $scope kontrolera w poprzednich rozdziaล‚ach. Obiekt $scope jest obiektem podrzฤ™dnym obiektu $rootScope. Powodem jego deklaracji jest to, ลผe wprowadzamy zmianฤ™ w rzeczywistym znaczniku HTML w DOM za pomocฤ… naszej dyrektywy niestandardowej. Dlatego musimy skorzystaฤ‡ z usล‚ugi $rootScope, ktรณra faktycznie nasล‚uchuje lub rozpoznaje zmiany zachodzฤ…ce w dokumencie HTML.
  4. element var = $compile(โ€œ โ€)($rootScope) โ€“ Sล‚uลผy do sprawdzenia, czy nasza dyrektywa zostanie wstrzykniฤ™ta prawidล‚owo. Dyrektywa jest zarejestrowana z nazwฤ… guru99 w formacie camel case, wiฤ™c AngularJS dopasowuje element pisany maล‚ymi literami. w znaczniku. Dlatego do przeprowadzenia tej kontroli uลผywa siฤ™ tego polecenia.
  5. expect(element.html()).toContain(โ€œTo jest testowanie AngularJSโ€) โ€“ sล‚uลผy do poinstruowania funkcji expect, ลผe powinna znaleลบฤ‡ element (w naszym przypadku tag h1) zawierajฤ…cy tekst innerHTML โ€žTo jest testowanie AngularJSโ€.
describe('Unit testing directives', function() {
  var $compile,
      $rootScope;
  beforeEach(module('sampleApp'));

  beforeEach(inject(function(_$compile_, _$rootScope_){
    $compile = _$compile_;
    $rootScope = _$rootScope_;
  }));

  it('Check the directive', function() {
    // Compile a piece of HTML containing the directive
    var element = $compile("<guru99></guru99>")($rootScope);
    $rootScope.$digest();
    expect(element.html()).toContain("This is AngularJS Testing");
  });
});

Powyลผszy test zostanie uruchomiony w przeglฤ…darce karmy i da taki sam wynik pozytywny, jak pokazano w poprzednim temacie.

Testowanie aplikacji AngularJS od poczฤ…tku do koล„ca

Struktura testowania karmy wraz z strukturฤ… o nazwie ProtracTor umoลผliwia testowanie aplikacji internetowych od poczฤ…tku do koล„ca.

Zatem nie jest to tylko testowanie dyrektyw i kontrolerรณw, ale takลผe testowanie czegokolwiek innego, co moลผe pojawiฤ‡ siฤ™ na stronie HTML.

Spรณjrzmy na przykล‚ad, jak moลผemy to osiฤ…gnฤ…ฤ‡.

W naszym przykล‚adzie poniลผej bฤ™dziemy mieฤ‡ aplikacjฤ™ AngularJS, ktรณra tworzy tabelฤ™ danych za pomocฤ… dyrektywy ng-repeat.

  1. Najpierw tworzymy zmiennฤ… o nazwie โ€žsamouczekโ€ i przypisujemy jej kilka par klucz-wartoล›ฤ‡ w jednym kroku. Kaลผda para klucz-wartoล›ฤ‡ bฤ™dzie uลผywana jako dane podczas wyล›wietlania tabeli. Zmienna samouczka jest nastฤ™pnie przypisywana do obiektu zakresu, tak aby moลผna byล‚o uzyskaฤ‡ do niej dostฤ™p z naszego widoku.
  2. Dla kaลผdego wiersza danych w tabeli uลผywamy dyrektywy ng-repeat. Ta dyrektywa przechodzi przez kaลผdฤ… parฤ™ klucz-wartoล›ฤ‡ w obiekcie zakresu tutoriala przy uลผyciu zmiennej ptutor.
  3. Na koniec uลผywamy tag wraz z parami klucz-wartoล›ฤ‡ (ptutor.Name i ptutor.Description), aby wyล›wietliฤ‡ dane tabeli.
<table>
  <tr ng-repeat="ptutor in tutorial">
    <td>{{ ptutor.Name }}</td>
    <td>{{ ptutor.Description }}</td>
  </tr>
</table>
</div>
<script type="text/javascript">
var app = angular.module('DemoApp', []);
app.controller('DemoController', function($scope) {
  $scope.tutorial = [
    {Name: "Controllers", Description: "Controllers in action"},
    {Name: "Models", Description: "Models and binding data"},
    {Name: "Directives", Description: "Flexibility of Directives"}
  ];
});

Po pomyล›lnym wykonaniu powyลผszego kodu nastฤ™pnym krokiem bฤ™dzie utworzenie przypadku testowego, aby upewniฤ‡ siฤ™, ลผe kod zostaล‚ napisany i wykonany poprawnie. Kod naszego testu bฤ™dzie taki, jak pokazano poniลผej

Nasz test tak naprawdฤ™ przetestuje dyrektywฤ™ ng-repeat i upewni siฤ™, ลผe zawiera ona 3 wiersze danych, tak jak powinno to wynikaฤ‡ z powyลผszego przykล‚adu.

Najpierw musimy siฤ™ upewniฤ‡, ลผe speล‚nione sฤ… nastฤ™pujฤ…ce warunki wstฤ™pne

Zainstaluj wersjฤ™ protracBiblioteka Tor przez npm. Moลผna to zrobiฤ‡, wykonujฤ…c poniลผszy wiersz w wierszu poleceล„.

npm install -g protractor

Kod naszego testu bฤ™dzie taki, jak pokazano poniลผej.

Kod bฤ™dzie w osobnym pliku o nazwie CompleteTest.js, ktรณry zostanie umieszczony w folderze test. Poniลผszy kod wykonuje nastฤ™pujฤ…ce kluczowe rzeczy

  1. Funkcja przeglฤ…darki jest zapewniana przez profesjonalistฤ™tracbiblioteka tor i zakล‚ada, ลผe โ€‹โ€‹nasza aplikacja AngularJS (z kodem pokazanym powyลผej) dziaล‚a na naszej stronie URL โ€“ http://localhost:8080/Guru99 /
  2. var list = element.all(by.repeater('ptutor in tutorial')); - Ten wiersz kodu w rzeczywistoล›ci pobiera dyrektywฤ™ ng-repeat, ktรณra jest wypeล‚niana przez kod โ€žptutor in tutorialโ€. Element i by.repeater to specjalne sล‚owa kluczowe dostarczane przez programistฤ™.tracBiblioteka tor umoลผliwiajฤ…ca uzyskanie szczegรณล‚รณw dyrektywy ng-repeat.
  3. oczekiwaฤ‡(list.liczba()).toEqual(3); โ€“ Na koniec uลผywamy funkcji oczekiwanie, aby sprawdziฤ‡, czy rzeczywiล›cie w wyniku dyrektywy ng-repeat rzeczywiล›cie zapeล‚niajฤ… siฤ™ 3 pozycje w naszej tabeli.
describe('Unit testing end to end', function() {
  beforeEach(function() {
    browser.get('http://localhost:8080/Guru99/');
  });

  it('Check the ng directive', function() {
    var list = element.all(by.repeater('ptutor in tutorial'));
    expect(list.count()).toEqual(3);
  });
});

Powyลผszy test zostanie uruchomiony w przeglฤ…darce karmy i da taki sam wynik pozytywny, jak pokazano w poprzednim temacie.

Karma kontra Jasmine kontra Protractor: Kluczowe rรณลผnice

Trzy narzฤ™dzia uลผywane na tej stronie sฤ… czฤ™sto mylone, poniewaลผ pojawiajฤ… siฤ™ w tym samym wierszu poleceล„. Kaลผde z nich zajmuje innฤ… warstwฤ™ stosu testowego, co jasno pokazuje poniลผsza tabela.

Parametr Karma Jaล›min ProtracTor
Kategoria Tester Ramy specyfikacji Kompleksowa struktura automatyzacji
Gล‚รณwne zadanie Uruchamia przeglฤ…darki i raportuje wyniki Zapewnia opis, to i oczekiwanie Uruchamia aplikacjฤ™ na ลผywo w prawdziwej przeglฤ…darce
Poziom testowy Jednostka i integracja Jednostka i integracja Od koล„ca do koล„ca
Wymaga dziaล‚ajฤ…cego serwera Nie Nie Tak
plik konfiguracyjny karma.conf.js ลปadnego, dziaล‚a wewnฤ…trz biegacza dlatractor.conf.js
Aktualny status Wycofane, tylko konserwacja Aktywnie utrzymywane Przeszedล‚ na emeryturฤ™ w sierpniu 2023 r.

Krรณtko mรณwiฤ…c, Jasmine pisze test, Karma go wykonuje, a Protractor rozszerza tฤ™ samฤ… skล‚adniฤ™ Jasmine na w peล‚ni renderowanฤ… stronฤ™.

Najlepsze praktyki testowania jednostkowego AngularJS

Zestaw kilku nawykรณw sprawia, ลผe โ€‹โ€‹pakiet AngularJS pozostaje szybki i niezawodny, nawet gdy aplikacja siฤ™ rozrasta.

  1. Testuj jednฤ… jednostkฤ™ na raz. Zaล‚aduj tylko moduล‚ podlegajฤ…cy testowi w beforeEach i zasymuluj kaลผdego wspรณล‚pracownika, tak aby bล‚ฤ…d wskazywaล‚ na pojedynczy plik.
  2. Nigdy nie dzwoล„ do prawdziwego zaplecza. Uลผyj usล‚ugi $httpBackend z Angular-mocks, aby zwrรณciฤ‡ gotowe odpowiedzi. Testy sฤ… nastฤ™pnie uruchamiane w trybie offline i generujฤ… identyczne wyniki na kaลผdej maszynie.
  3. Zachowaj behawioralny charakter nazw specyfikacji. Nazwa taka jak โ€žzwraca 5 po zainicjowaniu kontroleraโ€ bฤ™dzie lepiej czytelna w raporcie niลผ โ€žtest1โ€.
  4. Zawsze przepล‚ukuj cykl trawienia. Wywoล‚aj $rootScope.$digest() po zmianie danych zakresu, w przeciwnym razie powiฤ…zania i obserwatorzy nigdy siฤ™ nie zaktualizujฤ…, a asercje zakoล„czฤ… siฤ™ niepowodzeniem z niewล‚aล›ciwego powodu.
  5. Zmierz zasiฤ™g, ale oceล„ go ostroลผnie. Dodaj karma-coverage, aby zobaczyฤ‡ nieprzetestowane gaล‚ฤ™zie. Wysokie pokrycie przy sล‚abych asercjach nadal ukrywa defekty.
  6. Uruchom pakiet w trybie ciฤ…gล‚ej integracji. Uลผyj bezobsล‚ugowego programu uruchamiajฤ…cego Chrome, aby te same specyfikacje byล‚y wykonywane przy kaลผdym zatwierdzeniu, a nie tylko na komputerze dewelopera.

Zastosowanie tych zasad sprawia, ลผe โ€‹โ€‹powyลผsze przykล‚ady z odosobnionych demonstracji stajฤ… siฤ™ siatkฤ… bezpieczeล„stwa regresji dla starszej bazy kodu AngularJS. Aby uzyskaฤ‡ szerszy obraz, zobacz Samouczek AngularJS series.

FAQ

Moduล‚ obsล‚ugujฤ…cy tego dostawcฤ™ nie zostaล‚ zaล‚adowany. Dodaj go w beforeEach(module('yourModule')) i sprawdลบ, czy plik angular-mocks.js znajduje siฤ™ w pliku karma.conf.js po pliku angular.js, w przeciwnym razie wstrzykiwacz nie bฤ™dzie mรณgล‚ rozwiฤ…zaฤ‡ zaleลผnoล›ci.

Zainstaluj karma-chrome-launcher i ustaw opcjฤ™ przeglฤ…darek na ChromeHeadless w pliku karma.conf.js. Pakiet bฤ™dzie wtedy dziaล‚aล‚ w potokach ciฤ…gล‚ej integracji i kontenerach, gdzie serwer wyล›wietlania nie jest dostฤ™pny.

Tak. Asystenci kodowania AI odczytujฤ… kontroler i tworzฤ… specyfikacje Jasmine za pomocฤ… modeli zakresรณw i dopasowaล„. Revuwaลผnie przejrzyj dane wyjล›ciowe, poniewaลผ wygenerowane potwierdzenia czฤ™sto powtarzajฤ… implementacjฤ™ zamiast weryfikowaฤ‡ zamierzone zachowanie.

Tak. Narzฤ™dzia AI tล‚umaczฤ… specyfikacje Jasmine na skล‚adniฤ™ Jest lub Vitest i sygnalizujฤ… wywoล‚ania Angular-Mocks, ktรณre nie majฤ… bezpoล›redniego odpowiednika. Rฤ™czna weryfikacja pozostaje niezbฤ™dna, poniewaลผ wzorce wstrzykiwania zaleลผnoล›ci rzadko dajฤ… siฤ™ poprawnie konwertowaฤ‡.

Wiฤ™kszoล›ฤ‡ zespoล‚รณw dฤ…ลผy do osiฤ…gniฤ™cia siedemdziesiฤ™ciu do osiemdziesiฤ™ciu procent pokrycia kontrolerรณw i usล‚ug. Dฤ…ลผenie do osiฤ…gniฤ™cia wyลผszego poziomu zazwyczaj oznacza testowanie szablonรณw i bibliotek zewnฤ™trznych, co zwiฤ™ksza koszty utrzymania bez wykrywania rzeczywistych defektรณw.

Podsumuj ten post nastฤ™pujฤ…co: