Tests unitaires AngularJS : tutoriel Karma Jasmine
L'une des fonctionnalitรฉs les plus brillantes d'Angular.JS est la Tests aspect. Lorsque les dรฉveloppeurs de Google ont dรฉveloppรฉ AngularJS, ils ont gardรฉ les tests ร l'esprit et se sont assurรฉs que l'ensemble du framework AngularJS รฉtait testable.
Dans AngularJS, les tests sont normalement effectuรฉs ร l'aide de Karma (framework). Les tests Angular JS peuvent รชtre effectuรฉs sans Karma, mais le framework Karma possรจde une fonctionnalitรฉ si brillante pour tester le code AngularJS qu'il est logique d'utiliser ce framework.
- Dans AngularJS, nous pouvons effectuer Tests unitaires sรฉparรฉment pour les contrรดleurs et les directives.
- Nous pouvons รฉgalement effectuer des tests de fin de fin d'AngularJS, qui testent du point de vue de l'utilisateur.
Introduction et installation du framework Karma
Le karma est un outil d'automatisation des tests crรฉรฉ par l'รฉquipe Angular JS de Google. La premiรจre รฉtape pour utiliser Karma consiste ร installer Karma. Karma est installรฉ via npm (qui est un gestionnaire de packages utilisรฉ pour faciliter l'installation de modules sur une machine locale).
Installation de Karma
L'installation de Karma via npm se fait en deux รฉtapes.
รtape 1) Exรฉcutez la ligne ci-dessous ร partir de la ligne de commande
npm install karma karma-chrome-launcher karma-jasmine
Oรน,
- npm est l'utilitaire de ligne de commande du gestionnaire de packages de nลuds utilisรฉ pour installer des modules personnalisรฉs sur n'importe quelle machine.
- Le paramรจtre install indique ร l'utilitaire de ligne de commande npm que l'installation est requise.
- Il existe 3 bibliothรจques spรฉcifiรฉes dans la ligne de commande qui sont nรฉcessaires pour travailler avec Karma.
- karma est la bibliothรจque principale qui sera utilisรฉe ร des fins de tests.
- karma-chrome-launcher est une bibliothรจque distincte qui permet aux commandes karma d'รชtre reconnues par le navigateur Chrome.
- karma-jasmine โ Ceci installe jasmine qui est un framework dรฉpendant de Karma.
รtape 2) L'รฉtape suivante consiste ร installer l'utilitaire de ligne de commande karma. Ceci est requis pour exรฉcuter les commandes de la ligne karma. L'utilitaire karma line sera utilisรฉ pour initialiser l'environnement karma ร des fins de test.
Pour installer l'utilitaire de ligne de commande, exรฉcutez la ligne ci-dessous ร partir de la ligne de commande
npm install karma-cli
oรน,
Configuration du framework Karma
L'รฉtape suivante consiste ร configurer le karma, ce qui peut รชtre effectuรฉ via la commande
"karma โinit"
Une fois l'รฉtape ci-dessus exรฉcutรฉe, karma crรฉera un fichier karma.conf.js. Le fichier ressemblera probablement ร l'extrait ci-dessous
files: [ 'Your application Name'/AngularJS/AngularJS.js', 'Your application Name'/AngularJS-mocks/AngularJS-mocks.js', 'lib/app.js', 'tests/*.js' ]
Les fichiers de configuration ci-dessus indiquent au moteur d'exรฉcution Karma les รฉlรฉments suivants :
- ยซ Nom de votre candidature ยป โ Celui-ci sera remplacรฉ par le nom de votre application.
- ยปNom de votre application'/AngularJS/AngularJS.js' โ Cela indique au karma que votre application dรฉpend des modules de base dโAngularJS
- 'Nom de votre application'/AngularJS-mocks/AngularJS-mocks.js' โ Cela indique ร Karma d'utiliser la fonctionnalitรฉ de test unitaire pour AngularJS ร partir du fichier Angular.JS-mocks.js.
- Tous les principaux fichiers d'application ou de logique mรฉtier sont prรฉsents dans le dossier lib de votre application.
- Le dossier tests contiendra tous les tests unitaires.
Pour vรฉrifier si le karma fonctionne, crรฉez un fichier appelรฉ Sample.js, insรฉrez le code ci-dessous et placez-le dans le rรฉpertoire de test.
describe('Sample test', function() {
it('Condition is true', function() {
expect('AngularJS').toBe('AngularJS');
});
});
Le code ci-dessus a les aspects suivants
- La fonction dรฉcrire est utilisรฉe pour donner une description du test. Dans notre cas, nous donnons la description ยซ Sample test ยป ร notre test.
- La fonction 'it' permet de donner un nom au test. Dans notre cas, nous donnons le nom de notre test comme ยซ La condition est vraie ยป. Le nom du test doit รชtre significatif.
- La combinaison des mots clรฉs ยซ attendre ยป et ยซ รชtre ยป indique quelle est la valeur attendue et rรฉelle du rรฉsultat du test. Si la valeur rรฉelle et attendue est la mรชme, le test rรฉussira, sinon il รฉchouera.
Lorsque vous exรฉcutez la ligne suivante ร l'invite de commande, elle exรฉcutera le fichier de test ci-dessus
KARMA start
La sortie ci-dessous est extraite de l'EDI Webstorm dans lequel les รฉtapes ci-dessus ont รฉtรฉ rรฉalisรฉes.
- La sortie vient dans l'explorateur Karma dans Webstorm. Cette fenรชtre montre l'exรฉcution de tous les tests dรฉfinis dans le framework karma.
- Ici, vous pouvez voir que la description du test exรฉcutรฉ est affichรฉe, ร savoir ยซ Exemple de test ยป.
- Ensuite, vous pouvez voir que le test lui-mรชme qui porte le nom ยซ La condition est vraie ยป est exรฉcutรฉ.
- Notez que puisque tous les tests ont lโicรดne verte ยซ Ok ยป ร cรดtรฉ, ce qui symbolise la rรฉussite de tous les tests.
Test des contrรดleurs AngularJS
Le framework de tests karma dispose รฉgalement de fonctionnalitรฉs permettant de tester les contrรดleurs de bout en bout. Cela inclut le test de l'objet $scope qui est utilisรฉ dans les contrรดleurs.
Regardons un exemple de la faรงon dont nous pouvons y parvenir.
Dans notre exemple,
Il faudrait dโabord dรฉfinir un contrรดleur. Ce contrรดleur effectuerait les รฉtapes mentionnรฉes ci-dessous
- Crรฉez une variable ID et attribuez-lui la valeur 5.
- Attribuez la variable ID ร l'objet $scope.
Notre test testera l'existence de ce contrรดleur et testera รฉgalement si la variable ID de l'objet $scope est dรฉfinie sur 5.
Nous devons dโabord nous assurer que les conditions prรฉalables suivantes sont en place
Installez la bibliothรจque Angular.JS-mocks via npm. Cela peut รชtre fait en exรฉcutant la ligne ci-dessous dans l'invite de commande
npm install Angular JS-mocks
Ensuite, modifiez le fichier karma.conf.js pour garantir que les bons fichiers sont inclus pour le test. Le segment ci-dessous montre simplement la partie des fichiers de karma.conf.js qui doit รชtre modifiรฉe
files: ['lib/AngularJS.js','lib/AngularJS-mocks.js','lib/index.js','test/*.js']
- Le paramรจtre 'files' indique essentiellement ร Karma tous les fichiers nรฉcessaires ร l'exรฉcution des tests.
- Les fichiers AngularJS.js et AngularJS-mocks.js sont requis pour exรฉcuter les tests unitaires AngularJS
- Le fichier index.js va contenir notre code pour le contrรดleur
- Le dossier test va contenir tous nos tests AngularJS
Ci-dessous notre code Angular.JS qui sera stockรฉ sous forme de fichier Index.js dans le dossier test de notre application.
Le code ci-dessous fait simplement les choses suivantes
- Crรฉer un Module AngularJS appelรฉ sampleApp
- Crรฉez un contrรดleur appelรฉ AngularJSController
- Crรฉez une variable appelรฉe ID, donnez-lui une valeur de 5 et affectez-la ร l'objet $scope
var sampleApp = AngularJS.module('sampleApp',[]);
sampleApp.controller('AngularJSController', function($scope) {
$scope.ID =5;
});
Une fois le code ci-dessus exรฉcutรฉ avec succรจs, l'รฉtape suivante consisterait ร crรฉer un Cas de test pour garantir que le code a รฉtรฉ รฉcrit et exรฉcutรฉ correctement.
Le code de notre test sera celui indiquรฉ ci-dessous.
Le code sera dans un fichier sรฉparรฉ appelรฉ ControllerTest.js, qui sera placรฉ dans le dossier test. Le code ci-dessous fait simplement les choses clรฉs suivantes
- Fonction beforeEach โ Cette fonction est utilisรฉe pour charger notre module AngularJS.JS appelรฉ ยซ sampleApp ยป avant l'exรฉcution du test. Notez qu'il s'agit du nom du module dans un fichier index.js.
- L'objet $controller est crรฉรฉ en tant qu'objet maquette pour le contrรดleur ยซ Angular JSController ยป qui est dรฉfini dans notre fichier index.js. Dans tout type de test unitaire, un objet fictif reprรฉsente un objet factice qui sera rรฉellement utilisรฉ pour le test. Cet objet simulรฉ simulera en fait le comportement de notre contrรดleur.
- beforeEach(inject(function(_$controller_) โ Ceci est utilisรฉ pour injecter l'objet fictif dans notre test afin qu'il se comporte comme le contrรดleur rรฉel.
- var $scope = {}; Il s'agit d'un objet fictif crรฉรฉ pour l'objet $scope.
- var contrรดleur = $controller('AngularJSController', { $scope: $scope }); โ Ici, nous vรฉrifions l'existence d'un contrรดleur nommรฉ 'Angular.JSController'. Ici, nous attribuons รฉgalement toutes les variables de notre objet $scope dans notre contrรดleur dans le fichier Index.js ร l'objet $scope dans notre fichier de test.
- Enfin, nous comparons le $scope.ID ร 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);
});
});
});
Le test ci-dessus s'exรฉcutera dans le navigateur Karma et donnera le mรชme rรฉsultat que celui indiquรฉ dans le sujet prรฉcรฉdent.
Test des directives AngularJS
Le framework de tests karma dispose รฉgalement de fonctionnalitรฉs permettant de tester des directives personnalisรฉes. Cela inclut les templateURL qui sont utilisรฉs dans les directives personnalisรฉes.
Regardons un exemple de la faรงon dont nous pouvons y parvenir.
Dans notre exemple, nous allons d'abord dรฉfinir une directive personnalisรฉe qui fait les choses suivantes
- Crรฉez un module AngularJS appelรฉ sampleApp
- Crรฉez une directive personnalisรฉe avec le nom โ Guru99
- Crรฉez une fonction qui renvoie un modรจle avec une balise d'en-tรชte qui affiche le texte ยซ Ceci est un test AngularJS ยป.
var sampleApp = AngularJS.module('sampleApp',[]);
sampleApp.directive('Guru99', function () {
return {
restrict: 'E',
replace: true,
template: '<h1>This is AngularJS Testing</h1>'
};
});
Une fois le code ci-dessus exรฉcutรฉ avec succรจs, l'รฉtape suivante consisterait ร crรฉer un scรฉnario de test pour garantir que le code a รฉtรฉ รฉcrit et exรฉcutรฉ correctement. Le code de notre test sera comme indiquรฉ ci-dessous
Le code sera dans un fichier sรฉparรฉ appelรฉ DirectiveTest.js, qui sera placรฉ dans le dossier test. Le code ci-dessous fait simplement les choses clรฉs suivantes
- Fonction beforeEach โ Cette fonction est utilisรฉe pour charger notre module Angular JS appelรฉ ยซ sampleApp ยป avant l'exรฉcution du test.
- Le service $compile est utilisรฉ pour compiler la directive. Ce service est obligatoire et doit รชtre dรฉclarรฉ afin qu'Angular.JS puisse l'utiliser pour compiler notre directive personnalisรฉe.
- Le $rootscope est la portรฉe principale de toute application AngularJS.JS. Nous avons vu l'objet $scope du contrรดleur dans les chapitres prรฉcรฉdents. Eh bien, l'objet $scope est l'objet enfant de l'objet $rootscope. La raison pour laquelle cela est dรฉclarรฉ ici est que nous apportons une modification ร une balise HTML rรฉelle dans le DOM via notre directive personnalisรฉe. Par consรฉquent, nous devons utiliser le service $rootscope qui รฉcoute ou sait quand un changement se produit ร partir d'un document HTML.
- รฉlรฉment var = $compile(" ยป) โ Ceci est utilisรฉ pour vรฉrifier si notre directive est injectรฉe comme elle le devrait. Le nom de notre directive personnalisรฉe est Guru99, et nous savons grรขce ร notre chapitre sur les directives personnalisรฉes que lorsque la directive est injectรฉe dans notre code HTML, elle sera injectรฉe sous la forme ' '. Par consรฉquent, cette dรฉclaration est utilisรฉe pour effectuer cette vรฉrification.
- expect(element.html()).toContain(ยซ Ceci est un test AngularJS ยป) โ Ceci est utilisรฉ pour indiquer ร la fonction expect qu'elle doit trouver l'รฉlรฉment (dans notre cas, la balise div) pour contenir le texte innerHTML de ยซ Ceci est Tests 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("<ng-Guru99></ng-Guru99>")($rootScope);
$rootScope.$digest();
expect(element.html()).toContain("This is AngularJS Testing");
});
});
Le test ci-dessus s'exรฉcutera dans le navigateur Karma et donnera le mรชme rรฉsultat que celui indiquรฉ dans le sujet prรฉcรฉdent.
Test de bout en bout des applications AngularJS JS
Le framework de test de karma ainsi qu'un framework appelรฉ Protractor ont la fonctionnalitรฉ de tester une application Web de bout en bout.
Il ne s'agit donc pas seulement de tester les directives et les contrรดleurs, mais รฉgalement de tester tout ce qui peut apparaรฎtre sur une page HTML.
Regardons un exemple de la faรงon dont nous pouvons y parvenir.
Dans notre exemple ci-dessous, nous allons avoir une application AngularJS qui crรฉe une table de donnรฉes ร l'aide de la directive ng-repeat.
- Nous crรฉons dโabord une variable appelรฉe ยซ tutoriel ยป et lui attribuons des paires clรฉ-valeur en une seule รฉtape. Chaque paire clรฉ-valeur sera utilisรฉe comme donnรฉes lors de l'affichage du tableau. La variable du didacticiel est ensuite affectรฉe ร l'objet scope afin qu'il soit accessible depuis notre vue.
- Pour chaque ligne de donnรฉes du tableau, nous utilisons la directive ng-repeat. Cette directive parcourt chaque paire clรฉ-valeur dans l'objet de portรฉe du didacticiel ร l'aide de la variable ptutor.
- Enfin, nous utilisons le balise avec les paires clรฉ-valeur (ptutor.Name et ptutor.Description) pour afficher les donnรฉes du tableau.
<table >
<tr ng-repeat="ptutor in tutorial">
<td>{{ ptutor.Name }}</td>
<td>{{ ptutor.Description }}</td>
</tr>
</table>
</div>
<script type="text/javascript">
var app = AngularJS.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"}
] });
Une fois le code ci-dessus exรฉcutรฉ avec succรจs, l'รฉtape suivante consisterait ร crรฉer un scรฉnario de test pour garantir que le code a รฉtรฉ รฉcrit et exรฉcutรฉ correctement. Le code de notre test sera comme indiquรฉ ci-dessous
Notre test va en fait tester la directive ng-repeat et garantir qu'elle contient 3 lignes de donnรฉes comme il se doit dans l'exemple ci-dessus.
Nous devons dโabord nous assurer que les conditions prรฉalables suivantes sont en place
Installez la bibliothรจque du rapporteur via npm. Cela peut รชtre fait en exรฉcutant la ligne ci-dessous dans l'invite de commande
"npm install protractor"
Le code de notre test sera celui indiquรฉ ci-dessous.
Le code sera dans un fichier sรฉparรฉ appelรฉ CompleteTest.js , qui sera placรฉ dans le dossier test. Le code ci-dessous fait simplement les choses clรฉs suivantes
- La fonction de navigateur est fournie par la bibliothรจque Protractor et suppose que notre application AngularJS (avec le code indiquรฉ ci-dessus) s'exรฉcute sur l'URL de notre site โ http://localhost:8080/Guru99/
- var list=element.all(by.repeater(ptuteur dans le tutoriel')); -Cette ligne de code rรฉcupรจre en fait la directive ng-repeat qui est remplie par le code 'ptutor in tutoriel'. L'รฉlรฉment et by.repeater sont des mots-clรฉs spรฉciaux fournis par la bibliothรจque rapporteur qui nous permettent d'obtenir des dรฉtails sur la directive ng-repeat.
- attendre(list.count()).toEqual(3); โ Enfin, nous utilisons la fonction expect pour voir que nous obtenons effectivement 3 รฉlรฉments renseignรฉs dans notre table ร la suite de la directive ng-repeat.
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); }); });
Le test ci-dessus s'exรฉcutera dans le navigateur Karma et donnera le mรชme rรฉsultat que celui indiquรฉ dans le sujet prรฉcรฉdent.
Rรฉsumรฉ
- Les tests dans AngularJS sont rรฉalisรฉs en utilisant le framework karma, un framework dรฉveloppรฉ par Google lui-mรชme.
- Le framework karma est installรฉ ร l'aide du gestionnaire de packages de nลuds. Les modules clรฉs qui doivent รชtre installรฉs pour les tests de base sont karma, karma-chrome-launcher, karma-jasmine et karma-cli.
- Les tests sont รฉcrits dans des fichiers js sรฉparรฉs, normalement conservรฉs dans le dossier test de votre application. L'emplacement de ces fichiers de test doit รชtre mentionnรฉ dans un fichier de configuration spรฉcial appelรฉ karma.conf.js. Karma utilise ce fichier de configuration lors de l'exรฉcution de tous les tests.
- Karma peut รฉgalement รชtre utilisรฉ pour tester les contrรดleurs et les directives personnalisรฉes.
- Pour un test Web de bout en bout, un autre framework appelรฉ rapporteur doit รชtre installรฉ via le gestionnaire de packages Node. Ce framework fournit des mรฉthodes spรฉciales qui peuvent รชtre utilisรฉes pour tester tous les รฉlรฉments d'une page HTML.

