Front End

10 dez, 2015

Como testar uma aplicação AngularJS em cinco minutos

Publicidade

Neste artigo vou mostrar como é fácil e rápido realizar testes unitários em uma aplicação AngularJS utilizando o generator-angm.

Karma, Jasmine e Karma Runner

Se você é iniciante, pode querer saber mais sobre instalação e configuração das ferramentas que utilizarei para rodar os testes. Estas informações podem ser encontradas nos links abaixo:

Criando uma aplicação do zero

Para esta tarefa, vou utilizar a nova versão do gerador angm, que poupa um trabalho e tanto na criação de qualquer aplicação AngularJS. Se você ainda não possui o gerador instalado, basta clicar no seu Terminal:

npm install -g yo generator-angm

Pronto, agora você já tem o gerador na sua máquina.

Crie uma nova pasta em qualquer lugar da sua máquina e abra o Terminal.

cd + "path para pasta que criou"

yo angm

Siga os passos solicitados pelo instalador.

Como estamos utilizando um gerador, todos os arquivos necessários para rodar os testes já estão configurados, precisamos apenas de algumas modificações.

Configurando os testes

Vamos examinar o arquivo karma.conf.js na raiz da aplicação:

'use strict';

    // Karma configuration
    module.exports = function(config) {
    config.set({
        // Frameworks to use
        frameworks: ['jasmine'],

        // List of files / patterns to load in the browser
        files: [
            'src/bower_components/jquery/dist/jquery.js',
            'src/bower_components/es5-shim/es5-shim.js',
            'src/bower_components/json3/lib/json3.min.js',
            'src/bower_components/bootstrap/dist/js/bootstrap.js',
            'src/bower_components/angular/angular.js',
            'src/bower_components/angular-resource/angular-resource.js',
            'src/bower_components/angular-mocks/angular-mocks.js',
            'src/bower_components/angular-cookies/angular-cookies.js',
            'src/bower_components/angular-sanitize/angular-sanitize.js',
            'src/bower_components/angular-animate/angular-animate.js',
            'src/bower_components/angular-touch/angular-touch.js',
            'src/bower_components/angular-route/angular-route.js',
            'src/bower_components/angular-ui-router/release/angular-ui-router.js',
            'src/bower_components/angular-bootstrap/ui-bootstrap-tpls.js',
            'app/app.js',
            'app/modules/home/homeCtrl.js',
            'app/modules/home/homeRoute.js',
            'app/modules/home/home-test.js',
            'app/modules/**/*Ctrl.js',
            'app/modules/**/*Route.js',
            'app/modules/**/*Service.js',
            'app/modules/**/*-test.js'
        ],

        // Test results reporter to use
        // Possible values: 'dots', 'progress', 'junit', 'growl', 'coverage'
        //reporters: ['progress'],
        reporters: ['progress'],

        // Web server port
        port: 9876,

        // Enable / disable colors in the output (reporters and logs)
        colors: true,

        // Level of logging
        // Possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
        logLevel: config.LOG_INFO,

        // Enable / disable watching file and executing tests whenever any file changes
        autoWatch: true,

        // Start these browsers, currently available:
        // - Chrome
        // - ChromeCanary
        // - Firefox
        // - Opera
        // - Safari (only Mac)
        // - PhantomJS
        // - IE (only Windows)
        browsers: ['PhantomJS'],

        // If browser does not capture in given timeout [ms], kill it
        captureTimeout: 60000,

        // Continuous Integration mode
        // If true, it capture browsers, run tests and exit
        singleRun: true
    });
    };

Podemos dizer que este arquivo é o responsável por configurar as informações básicas do Karma. Note a tag reporter; ela determina o tipo de visualização que teremos durante e após a execução dos testes.

Além disso, a tag browser indica em qual browser devemos executar o teste. O exemplo padrão vem configurado com o PhantomJS.

É possível utilizar qualquer browser da lista acima, desde que o tenha instalado em sua máquina.

Executando o teste

Abra o arquivo home-test.js na raiz do projeto e vamos examiná-lo:

'use strict';

    (function() {
    describe('homeCtrl', function () {
        var controller = null, $scope = null;

        beforeEach(function () {
            module('angmodular');
        });

        beforeEach(inject(function ($controller, $rootScope) {
            $scope = $rootScope.$new();
            controller = $controller('HomeCtrl', {
                $scope: $scope
            });
        }));

        it('Should HomeCtrl must be defined', function () {
            expect(controller).toBeDefined();
        });

        it('Should have title', function() {
            expect($scope.title).toBe('Hello, Angm-Generator!');

        });

    });
    })()

Este arquivo também já vem configurado, mas vamos olhar mais de perto. A syntax utilizada aqui é a do Jasmine, mas existem desenvolvedores que preferem utilizar a syntax do Mocha. Eu, particularmente, utilizo a que estiver a mão; neste caso, manteremos o Jasmine.

A função describe();, recebe dois parâmetros: um é o nome do teste, a sting “HomeCtrl”, o segundo é a função que executa este bloco de teste.

Antes de executar qualquer teste, precisamos importar o modulo da aplicação na função beforeEach(); e instanciar o controller para ser utilizado no teste.

As funções it(); determinam os testes que devem ser executados, o primeiro parâmentro é o nome do teste e o segundo, a função que executa o teste; neste caso, já temos dois testes pré configurados pelo gerador.

Abra o Terminal e digite o código abaixo:

npm test

Esse é o resultado do nosso teste:

PhantomJS 1.9.8 (Mac OS X 0.0.0): Executed 2 of 2 SUCCESS (0.003 secs / 0.02 secs)

Nele é possível verificar que ambos os testes passaram, porém essa representação no Terminal não é muito bonita. Veremos como melhorar isso adicionando um plugin do Karma para isso.

Instalando Karma HTML reporter

Em seu Terminal, digite o comando abaixo:

npm install karma-htmlfile-reporter --save-dev

Pronto, plugin instalado e pronto para ser utilizado. Precisamos apenas configurar o Karma.

Vamos adicionar as linhas abaixo ao arquivo karma.conf.js:

htmlReporter: {
      outputFile: 'tests/units.html',

      // Optional
      pageTitle: 'Unit Tests',
      subPageTitle: 'A sample project description'
    }

Agora podemos visualizar os teste de uma maneira muito melhor:

karma-html-reporter