Testes automatizados de JavaScript com Jasmine

27
Testes automatizados de Javascript com Jasmine Maykel Melo da Silva Aline Couto Oliveira

description

Palestra sobre Testes automatizados de Javascript com Jasmine realizada no primeiro ciclo do Plano de Geração de Conhecimento realizado em outubro de 2013, no LEMAF - Universidade Federal de Lavras.

Transcript of Testes automatizados de JavaScript com Jasmine

Page 1: Testes automatizados de JavaScript com Jasmine

Testes automatizados de Javascript com Jasmine

Maykel Melo da Silva Aline Couto Oliveira

Page 2: Testes automatizados de JavaScript com Jasmine

Citações “Teste de programa pode ser usado para mostrar a presença de erros, mas nunca para mostrar a sua ausência.”

Edsger W. Dijkstra

“Sempre que você se sentir tentado a escrever algo em uma declaração impressa ou uma expressão depurador, escrevê-lo como um teste de vez.” Martin Fowler

"Qualquer recurso do programa sem um teste automatizado simplesmente não existe.“

Kent Beck

Page 3: Testes automatizados de JavaScript com Jasmine

Jasmine

• Jasmine é um framework de desenvolvimento orientado por comportamento (BDD) para testes de Javascript. Ele não depende de nenhum outro framework de Javascript, nem mesmo requer um DOM (Document Object Model). E possui uma sintaxe óbvia e limpa para escrever testes facilmente.

“http://pivotal.github.io/jasmine/”

Page 4: Testes automatizados de JavaScript com Jasmine

Arquivos do framework

• jasmine_favicon.png

• jasmine.css

• jasmine.js

• jasmine-html.js

• SpecRunner.html

• Download: http://pivotal.github.io/jasmine/

Page 5: Testes automatizados de JavaScript com Jasmine

SpecRunner.html <!DOCTYPE ...>

<html>

<head>

<title>Jasmine Spec Runner</title>

<link rel="shortcut icon" type="image/png" href="lib/jasmine-1.3.1/jasmine_favicon.png">

<link rel="stylesheet" type="text/css" href="lib/jasmine-1.3.1/jasmine.css">

<script type="text/javascript" src="lib/jasmine-1.3.1/jasmine.js"></script>

<script type="text/javascript" src="lib/jasmine-1.3.1/jasmine-html.js"></script>

<!-- include source files here... -->

Arquivos fonte incluídos aqui

<!-- include spec files here... -->

Arquivos de teste incluídos aqui

<Código do Jasmine para execução e criação do relatório de testes>

Page 6: Testes automatizados de JavaScript com Jasmine

Estrutura dos testes

Os testes são estruturados da seguinte maneira:

• Suite: Agrupa um conjunto de testes

• Spec: Descreve um caso de teste

• Expectation: Descreve um retorno esperado dentro de um teste

Page 7: Testes automatizados de JavaScript com Jasmine

Exemplo no Jasmine

describe("Primeiro agrupamento de testes", function () {

it("Descricao do primeiro teste.", function () {

expect(true).toBeTruthy();

});

it("Descricao do segundo teste.", function () {

expect(false).not.toBeTruthy();

expect(1+1).toEqual(2);

});

});

Suite

Spec

Spec

Expectation

Expectation

Expectation

Page 8: Testes automatizados de JavaScript com Jasmine

Resultado da execução

Page 9: Testes automatizados de JavaScript com Jasmine

Especificações são funções describe(“Um agrupamento é uma função", function() { var a,

b;

it(“assim como uma especificação", function() {

a = true;

b = 1 + 2 + 3;

expect(a).toBe(true);

expect(b).toBeGreaterThan(5);

});

});

Page 10: Testes automatizados de JavaScript com Jasmine

Matchers

• toBe(x)

• toEqual(x)

• toMatch(x)

• toBeDefined()

• toBeUndefined()

• toBeNull()

• toBeTruthy()

• toBeFalsy()

• toContain(x)

• toBeLessThan(x)

• toBeGreaterThan(x)

• toBeCloseTo(x, y)

Page 11: Testes automatizados de JavaScript com Jasmine

Setup e Teardown describe("A spec (with setup and tear-down)", function() { var foo; beforeEach(function() { foo = 0; foo += 1; }); afterEach(function() { foo = 0; }); it("is just a function, so it can contain any code", function() { expect(foo).toEqual(1); foo = foo + 5; }); it("can have more than one expectation", function() { expect(foo).toEqual(1); expect(true).toEqual(true); }); });

Page 12: Testes automatizados de JavaScript com Jasmine

Spies describe("A spy", function() {

var foo,

bar = null;

beforeEach(function() {

foo = {

setBar: function(value) { bar = value; } };

spyOn(foo, 'setBar');

foo.setBar(123);

foo.setBar(456, 'another param');

});

it("tracks that the spy was called", function() { expect(foo.setBar).toHaveBeenCalled();

});

it("tracks its number of calls", function() { expect(foo.setBar.calls.length).toEqual(2);

});

});

Page 13: Testes automatizados de JavaScript com Jasmine

Proposta de trabalho

• Implementar um hipotético cadastro de currículos que fará validações de preenchimento de campos obrigatórios.

• Implementar testes automatizados para as classes envolvidas.

Page 14: Testes automatizados de JavaScript com Jasmine

Interface do cadastro

Page 15: Testes automatizados de JavaScript com Jasmine

Classes envolvidas

CadastroCurriculo

Curriculo

Pessoa Endereco Habilidade

Utils

Page 16: Testes automatizados de JavaScript com Jasmine

Estrutura do projeto Cadastro de

curriculo/

images/

lib/

jasmine-query/

jasmine-standalone-1.3.1/

Jquery-1.10.0

style/

test/

PessoaSpec.js

Endereco.js

HabilidadeSpec.js

UtilsSpec.js

CurriculoSpec.js

CadastroCurriculoSpec.js

src/

Pessoa.js

Endereco.js

Habilidade.js

Utils.js

Page 17: Testes automatizados de JavaScript com Jasmine

testesCadastroCurriculo.html (SpecRunner.html) <tags de definição do html>

<link rel="shortcut icon" type="image/png" href="lib/jasmine-1.3.1/jasmine_favicon.png"> <link rel="stylesheet" type="text/css" href="lib/jasmine-standalone-1.3.1/jasmine.css"> <script type="text/javascript" src="lib/jasmine-standalone-1.3.1/jasmine.js"></script> <script type="text/javascript" src="lib/jasmine-standalone-1.3.1/jasmine-html.js"></script> <script type="text/javascript" src="lib/jquery-1.10.0/jquery-1.10.0.js"></script> <script type="text/javascript" src="lib/jasmine-jquery/jasmine-jquery.js"></script> <!-- include source files here... --> <script type="text/javascript" src="src/Utils.js"></script> <script type="text/javascript" src="src/Pessoa.js"></script> <script type="text/javascript" src="src/Endereco.js"></script> <script type="text/javascript" src="src/Habilidade.js"></script> <script type="text/javascript" src="src/Curriculo.js"></script> <!-- include spec files here... --> <script type="text/javascript" src="test/UtilsSpec.js"></script> <script type="text/javascript" src="test/PessoaSpec.js"></script> <script type="text/javascript" src="test/EnderecoSpec.js"></script> <script type="text/javascript" src="test/HabilidadeSpec.js"></script> <script type="text/javascript" src="test/CurriculoSpec.js"></script> <script type="text/javascript" src="test/CadastroCurriculoSpec.js"></script>

Page 18: Testes automatizados de JavaScript com Jasmine

Especificações de testes

• CurriculoSpec – Para testes da classe Curriculo

• EnderecoSpec – Para testes da classe Endereco

• HabilidadeSpec – Para testes da classe Habilidade

• PessoaSpec – Para testes da classe Pessoa

• UtilsSpec – Para testes da classe Utils

Page 19: Testes automatizados de JavaScript com Jasmine

Exemplo de especificação describe("Utils ", function(){

it("deve validar corretamente um cpf correto", function(){

expect(Utils.validarCPF("05969548677")).toBeTruthy();

});

it("deve validar corretamente um cpf incorreto", function(){

expect(Utils.validarCPF("05969548678")).toBeFalsy();

});

it("deve validar corretamente um inteiro (1) valido", function(){

expect(Utils.validarInt(1)).toBeTruthy();

});

it("deve validar corretamente um caracter inteiro ('1') valido", function(){

expect(Utils.validarInt('1')).toBeTruthy();

});

it("deve validar corretamente um caracter nao inteiro ('m')", function(){

expect(Utils.validarInt('m')).toBeFalsy();

});

it("deve validar corretamente um cep correto", function(){

expect(Utils.validarCep("37.200-000")).toBeTruthy();

});

it("deve validar corretamente um cep incorreto", function(){

expect(Utils.validarCep("37200-000")).toBeFalsy();

});

});

Page 20: Testes automatizados de JavaScript com Jasmine

Resultado dos testes

Page 21: Testes automatizados de JavaScript com Jasmine

Jasmine-jQuery Jasmine-jQuery oferece duas extensões para o framework de teste para JavaSript, o Jasmine:

• um conjunto de matchers personalizados para framework jQuery

• uma API para lidar com HTML, CSS, JSON e fixtures em suas especificações.

“https://github.com/velesin/jasmine-jquery”

Page 23: Testes automatizados de JavaScript com Jasmine

Matchers jQuery • toBe(x)

• toBeChecked()

• toBeEmpty()

• toBeHidden()

• toHaveCss(x)

• toBeSelected()

• toBeVisible()

• toContain(x)

• toBeMatchedBy(x)

• toExist()

• toHaveAttr(x, y)

• toHaveProp(x, y)

• toHaveBeenTriggeredOn(x)

• toHaveBeenTriggered()

• toHaveBeenTriggeredOnAndWith(x, y)

• toHaveBeenPreventedOn(x)

• toHaveBeenPrevented()

• toHaveClass()

• toHaveData(x, y)

• toHaveHtml(x)

• toContainHtml(x)

• toContainText(x)

• toHaveId(x)

• toHaveText(x)

• toHaveValue(x)

• toHaveLength (x)

• toBeDisabled()

• toBeFocused()

• toHandle(x)

• toHandleWith(x, y)

Page 24: Testes automatizados de JavaScript com Jasmine

Exemplo de especificação describe("Interface Cadastro de Currículo ", function () {

beforeEach(function () {

jasmine.getFixtures().fixturesPath = ".";

loadFixtures("cadastroCurriculo.html");

});

it("deve exibir campo de ajuda se nome for deixado em branco", function () {

var campoNome = document.getElementById("idNome"), campoSobrenome = document.getElementById("idSobrenome");

campoNome.focus();

campoSobrenome.focus();

expect($("#idAjudaCampoNome").text()).toEqual("Os campos nome e sobrenome são obrigatórios");

});

Page 25: Testes automatizados de JavaScript com Jasmine

Resultado dos testes

Page 26: Testes automatizados de JavaScript com Jasmine

TESTE O TEMPO TODO!

Page 27: Testes automatizados de JavaScript com Jasmine

Referências

• http://pivotal.github.io/jasmine/

• http://blog.tarsisazevedo.com/post/16900846471/teste-javascript-jasmine

• http://evanhahn.com/how-do-i-jasmine/

• https://github.com/velesin/jasmine-jquery

• https://raw.github.com/velesin/jasmine-jquery/master/lib/jasmine-jquery.js

• http://www.goodreads.com/quotes/506689-program-testing-can-be-used-to-show-the-presence-of

• http://junit.sourceforge.net/doc/testinfected/testing.htm