Teste de unidade AngularJS: Tutorial Karma Jasmine
Um dos recursos mais brilhantes do Angular.JS รฉ o Testes aspecto. Quando os desenvolvedores do Google desenvolveram o AngularJS, eles tiveram em mente os testes e garantiram que toda a estrutura do AngularJS fosse testรกvel.
No AngularJS, os testes normalmente sรฃo realizados usando Karma (framework). O teste Angular JS pode ser realizado sem Karma, mas a estrutura Karma tem uma funcionalidade tรฃo brilhante para testar o cรณdigo AngularJS que faz sentido usar esta estrutura.
- No AngularJS, podemos realizar Teste de Unidade separadamente para controladores e diretivas.
- Tambรฉm podemos realizar testes de ponta a ponta do AngularJS, que sรฃo testes da perspectiva do usuรกrio.
Introduรงรฃo e instalaรงรฃo da estrutura Karma
carma รฉ um ferramenta de automaรงรฃo de testes criado pela equipe Angular JS do Google. O primeiro passo para usar o Karma รฉ instalar o Karma. O Karma รฉ instalado via npm (que รฉ um gerenciador de pacotes usado para facilitar a instalaรงรฃo de mรณdulos em uma mรกquina local).
Instalaรงรฃo do Karma
A instalaรงรฃo do Karma via npm รฉ feita em duas etapas.
Passo 1) Execute a linha abaixo na linha de comando
npm install karma karma-chrome-launcher karma-jasmine
Em que,
- npm รฉ o utilitรกrio de linha de comando para o gerenciador de pacotes de nรณs usado para instalar mรณdulos personalizados em qualquer mรกquina.
- O parรขmetro install instrui o utilitรกrio de linha de comando npm que a instalaรงรฃo รฉ necessรกria.
- Existem 3 bibliotecas especificadas na linha de comando que sรฃo necessรกrias para trabalhar com karma.
- karma รฉ a biblioteca principal que serรก usada para fins de teste.
- karma-chrome-launcher รฉ uma biblioteca separada que permite que comandos karma sejam reconhecidos pelo navegador Chrome.
- karma-jasmine โ Instala o jasmim, que รฉ uma estrutura dependente do Karma.
Passo 2) A prรณxima etapa รฉ instalar o utilitรกrio de linha de comando karma. Isso รฉ necessรกrio para executar comandos da linha karma. O utilitรกrio karma line serรก usado para inicializar o ambiente karma para teste.
Para instalar o utilitรกrio de linha de comando, execute a linha abaixo na linha de comando
npm install karma-cli
em que,
Configuraรงรฃo da estrutura Karma
O prรณximo passo รฉ configurar o karma que pode ser feito atravรฉs do comando
"karma โinit"
Apรณs a execuรงรฃo da etapa acima, o karma criarรก um arquivo karma.conf.js. O arquivo provavelmente serรก parecido com o trecho mostrado abaixo
files: [ 'Your application Name'/AngularJS/AngularJS.js', 'Your application Name'/AngularJS-mocks/AngularJS-mocks.js', 'lib/app.js', 'tests/*.js' ]
Os arquivos de configuraรงรฃo acima informam ao mecanismo de tempo de execuรงรฃo do karma o seguinte
- 'Nome do seu aplicativo' โ Serรก substituรญdo pelo nome do seu aplicativo.
- 'Nome do seu aplicativo'/AngularJS/AngularJS.js' โ Isso informa ao karma que seu aplicativo depende dos mรณdulos principais do AngularJS
- 'Nome do seu aplicativo'/AngularJS-mocks/AngularJS-mocks.js' โ Isso diz ao karma para usar a funcionalidade de teste de unidade para AngularJS do arquivo Angular.JS-mocks.js.
- Todos os arquivos principais do aplicativo ou de lรณgica de negรณcios estรฃo presentes na pasta lib do seu aplicativo.
- A pasta de testes conterรก todos os testes de unidade.
Para verificar se o karma estรก funcionando, crie um arquivo chamado Sample.js, coloque o cรณdigo abaixo e coloque-o no diretรณrio de teste.
describe('Sample test', function() {
it('Condition is true', function() {
expect('AngularJS').toBe('AngularJS');
});
});
O cรณdigo acima tem os seguintes aspectos
- A funรงรฃo de descriรงรฃo รฉ usada para fornecer uma descriรงรฃo do teste. No nosso caso, estamos dando a descriรงรฃo 'Teste de amostra' ao nosso teste.
- A funรงรฃo 'it' รฉ usada para dar um nome ao teste. No nosso caso, damos o nome do nosso teste como 'Condiรงรฃo รฉ verdadeira'. O nome do teste precisa ser significativo.
- A combinaรงรฃo das palavras-chave 'expect' e 'toBe' indica qual รฉ o valor esperado e real do resultado do teste. Se o valor real e esperado forem iguais, o teste serรก aprovado, caso contrรกrio, falharรก.
Quando vocรช executa a seguinte linha no prompt de comando, ele executa o arquivo de teste acima
KARMA start
A saรญda abaixo foi retirada do IDE Webstorm em que foram realizadas as etapas acima.
- A saรญda vem no explorador Karma dentro Webstorm. Esta janela mostra a execuรงรฃo de todos os testes definidos na estrutura karma.
- Aqui vocรช pode ver que รฉ mostrada a descriรงรฃo do teste executado que รฉ โTeste de amostraโ.
- A seguir, vocรช pode ver que o prรณprio teste que tem o nome โCondiรงรฃo รฉ verdadeiraโ รฉ executado.
- Observe que todos os testes tรชm o รญcone verde โOkโ prรณximo a eles, o que simboliza que todos os testes foram aprovados.
Testando controladores AngularJS
A estrutura de teste de karma tambรฉm possui a funcionalidade de testar Controladores de ponta a ponta. Isso inclui o teste do objeto $scope que รฉ usado nos Controladores.
Vejamos um exemplo de como podemos conseguir isso.
Em nosso exemplo,
Primeiro precisarรญamos definir um controlador. Este controlador executaria as etapas mencionadas abaixo
- Crie uma variรกvel de ID e atribua o valor 5 a ela.
- Atribua a variรกvel ID ao objeto $scope.
Nosso teste testarรก a existรชncia deste controlador e tambรฉm testarรก se a variรกvel ID do objeto $scope estรก definida como 5.
Primeiro, precisamos garantir que o seguinte prรฉ-requisito esteja em vigor
Instale a biblioteca Angular.JS-mocks via npm. Isso pode ser feito executando a linha abaixo no prompt de comando
npm install Angular JS-mocks
O prรณximo passo รฉ modificar o arquivo karma.conf.js para garantir que os arquivos corretos sejam incluรญdos para o teste. O segmento abaixo mostra apenas os arquivos que fazem parte do karma.conf.js que precisam ser modificados
files: ['lib/AngularJS.js','lib/AngularJS-mocks.js','lib/index.js','test/*.js']
- O parรขmetro 'files' basicamente informa ao Karma todos os arquivos necessรกrios para a execuรงรฃo dos testes.
- Os arquivos AngularJS.js e AngularJS-mocks.js sรฃo necessรกrios para executar testes de unidade AngularJS
- O arquivo index.js conterรก nosso cรณdigo para o controlador
- A pasta de teste conterรก todos os nossos testes AngularJS
Abaixo estรก nosso cรณdigo Angular.JS que serรก armazenado como um arquivo Index.js na pasta de teste de nossa aplicaรงรฃo.
O cรณdigo abaixo apenas faz o seguinte
- Crie uma Mรณdulo AngularJS chamado sampleApp
- Crie um controlador chamado AngularJSController
- Crie uma variรกvel chamada ID, atribua a ela um valor 5 e atribua-a ao objeto $scope
var sampleApp = AngularJS.module('sampleApp',[]);
sampleApp.controller('AngularJSController', function($scope) {
$scope.ID =5;
});
Depois que o cรณdigo acima for executado com sucesso, a prรณxima etapa seria criar um Caso de teste para garantir que o cรณdigo foi escrito e executado corretamente.
O cรณdigo para nosso teste serรก conforme mostrado abaixo.
O cรณdigo estarรก em um arquivo separado chamado ControllerTest.js, que serรก colocado na pasta de teste. O cรณdigo abaixo apenas faz as seguintes coisas principais
- Funรงรฃo beforeEach โ Esta funรงรฃo รฉ usada para carregar nosso mรณdulo AngularJS.JS chamado 'sampleApp' antes da execuรงรฃo do teste. Observe que este รฉ o nome do mรณdulo em um arquivo index.js.
- O objeto $controller รฉ criado como um objeto mockup para o controlador โAngular JSControllerโ que รฉ definido em nosso arquivo index.js. Em qualquer tipo de teste unitรกrio, um objeto simulado representa um objeto fictรญcio que serรก realmente usado para o teste. Este objeto simulado irรก realmente simular o comportamento do nosso controlador.
- beforeEach(inject(function(_$controller_) โ Isso รฉ usado para injetar o objeto simulado em nosso teste para que ele se comporte como o controlador real.
- var $escopo = {}; Este รฉ um objeto simulado sendo criado para o objeto $scope.
- var controller = $controller('AngularJSController', { $scope: $scope }); โ Aqui estamos verificando a existรชncia de um controlador chamado 'Angular.JSController'. Aqui tambรฉm estamos atribuindo todas as variรกveis โโdo nosso objeto $scope em nosso controlador no arquivo Index.js ao objeto $scope em nosso arquivo de teste
- Finalmente, estamos comparando $scope.ID com 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);
});
});
});
O teste acima serรก executado no navegador karma e fornecerรก o mesmo resultado de aprovaรงรฃo mostrado no tรณpico anterior.
Testando diretivas AngularJS
A estrutura de teste de karma tambรฉm possui a funcionalidade para testar diretivas personalizadas. Isso inclui os templateURLs que sรฃo usados โโnas diretivas personalizadas.
Vejamos um exemplo de como podemos conseguir isso.
Em nosso exemplo, primeiro definiremos uma diretiva customizada que faz o seguinte
- Crie um mรณdulo AngularJS chamado sampleApp
- Crie uma diretiva personalizada com o nome โ Guru99
- Crie uma funรงรฃo que retorne um modelo com uma tag de cabeรงalho que exibe o texto โEste รฉ o teste AngularJSโ.
var sampleApp = AngularJS.module('sampleApp',[]);
sampleApp.directive('Guru99', function () {
return {
restrict: 'E',
replace: true,
template: '<h1>This is AngularJS Testing</h1>'
};
});
Depois que o cรณdigo acima for executado com sucesso, a prรณxima etapa seria criar um caso de teste para garantir que o cรณdigo foi escrito e executado corretamente. O cรณdigo do nosso teste serรก conforme mostrado abaixo
O cรณdigo estarรก em um arquivo separado chamado DirectivaTest.js, que serรก colocado na pasta de teste. O cรณdigo abaixo apenas faz as seguintes coisas principais
- Funรงรฃo beforeEach โ Esta funรงรฃo รฉ usada para carregar nosso mรณdulo Angular JS chamado 'sampleApp' antes da execuรงรฃo do teste.
- O serviรงo $compile รฉ usado para compilar a diretiva. Este serviรงo รฉ obrigatรณrio e precisa ser declarado para que Angular.JS possa utilizรก-lo para compilar nossa diretiva customizada.
- O $rootscope รฉ o escopo principal de qualquer aplicativo AngularJS.JS. Vimos o objeto $scope do controlador em capรญtulos anteriores. Bem, o objeto $scope รฉ o objeto filho do objeto $rootscope. A razรฃo pela qual isso รฉ declarado aqui รฉ porque estamos fazendo uma alteraรงรฃo em uma tag HTML real no DOM por meio de nossa diretiva personalizada. Portanto, precisamos usar o serviรงo $rootscope que realmente escuta ou sabe quando ocorre alguma alteraรงรฃo em um documento HTML.
- elemento var = $compile(โ โ) โ Isso รฉ usado para verificar se nossa diretiva foi injetada como deveria. O nome da nossa diretiva personalizada รฉ Guru99, e sabemos pelo nosso capรญtulo de diretivas personalizadas que quando a diretiva for injetada em nosso HTML, ela serรก injetada como ' '. Portanto, esta declaraรงรฃo รฉ usada para fazer essa verificaรงรฃo.
- expect(element.html()).toContain(โThis is AngularJS Testingโ) โ Isso รฉ usado para instruir a funรงรฃo expect que ela deve encontrar o elemento (no nosso caso, a tag div) para conter o texto innerHTML de โThis is Teste 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");
});
});
O teste acima serรก executado no navegador karma e fornecerรก o mesmo resultado de aprovaรงรฃo mostrado no tรณpico anterior.
Teste de ponta a ponta de aplicativos AngularJS JS
A estrutura de teste de carma, juntamente com uma estrutura chamada Transferidor, tem a funcionalidade de testar um aplicativo da web de ponta a ponta.
Portanto, nรฃo se trata apenas de testar diretivas e controladores, mas tambรฉm de testar qualquer outra coisa que possa aparecer em uma pรกgina HTML.
Vejamos um exemplo de como podemos conseguir isso.
Em nosso exemplo abaixo, teremos um aplicativo AngularJS que cria uma tabela de dados usando a diretiva ng-repeat.
- Primeiro, estamos criando uma variรกvel chamada โtutorialโ e atribuindo a ela alguns pares de valores-chave em uma รบnica etapa. Cada par de valores-chave serรก usado como dados ao exibir a tabela. A variรกvel tutorial รฉ entรฃo atribuรญda ao objeto de escopo para que possa ser acessada a partir de nossa visualizaรงรฃo.
- Para cada linha de dados da tabela, estamos usando a diretiva ng-repeat. Esta diretiva passa por cada par de valores-chave no objeto de escopo do tutorial usando a variรกvel ptutor.
- Finalmente, estamos usando o tag junto com os pares de valores-chave (ptutor.Name e ptutor.Descriptรญon) para exibir os dados da tabela.
<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"}
] });
Depois que o cรณdigo acima for executado com sucesso, a prรณxima etapa seria criar um caso de teste para garantir que o cรณdigo foi escrito e executado corretamente. O cรณdigo do nosso teste serรก conforme mostrado abaixo
Nosso teste irรก, na verdade, testar a diretiva ng-repeat e garantir que ela contenha 3 linhas de dados como deveria no exemplo acima.
Primeiro, precisamos garantir que o seguinte prรฉ-requisito esteja em vigor
Instale a biblioteca do transferidor via npm. Isso pode ser feito executando a linha abaixo no prompt de comando
"npm install protractor"
O cรณdigo para nosso teste serรก conforme mostrado abaixo.
O cรณdigo estarรก em um arquivo separado chamado CompleteTest.js , que serรก colocado na pasta test. O cรณdigo abaixo faz apenas as seguintes coisas principais
- A funรงรฃo do navegador รฉ fornecida pela biblioteca do transferidor e assume que nosso aplicativo AngularJS (com o cรณdigo mostrado acima) estรก sendo executado na URL do nosso site โ http://localhost:8080/Guru99/
- var list=element.all(by.repeater(ptutor no tutorial')); -Esta linha de cรณdigo estรก na verdade buscando a diretiva ng-repeat que รฉ preenchida pelo cรณdigo 'ptutor no tutorial'. O elemento e by.repeater sรฃo palavras-chave especiais fornecidas pela biblioteca do transferidor que nos permitem obter detalhes da diretiva ng-repeat.
- esperar(lista.contagem()).toEqual(3); โ Por รบltimo, estamos usando a funรงรฃo expect para ver se estamos realmente obtendo 3 itens sendo preenchidos em nossa tabela como resultado da diretiva 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); }); });
O teste acima serรก executado no navegador karma e fornecerรก o mesmo resultado de aprovaรงรฃo mostrado no tรณpico anterior.
Resumo
- O teste em AngularJS รฉ feito usando o framework karma, um framework que foi desenvolvido pelo prรณprio Google.
- A estrutura karma รฉ instalada usando o gerenciador de pacotes do nรณ. Os principais mรณdulos que devem ser instalados para testes bรกsicos sรฃo karma, karma-chrome-launcher, karma-jasmine e karma-cli.
- Os testes sรฃo escritos em arquivos js separados, normalmente mantidos na pasta de testes da sua aplicaรงรฃo. A localizaรงรฃo desses arquivos de teste deve ser mencionada em um arquivo de configuraรงรฃo especial chamado karma.conf.js. Karma usa este arquivo de configuraรงรฃo ao executar todos os testes.
- Karma tambรฉm pode ser usado para testar controladores e diretivas personalizadas.
- Para um teste web ponta a ponta, outro framework chamado transferidor precisa ser instalado atravรฉs do Node, gerenciador de pacotes. Esta estrutura fornece mรฉtodos especiais que podem ser usados โโpara testar todos os elementos de uma pรกgina HTML.

