Testes Unitários Com Javascript e Jasmine
Testes Unitários Com Javascript e Jasmine
com Jasmine
BDD em Javascript
Kazale.com
Testes Unitários
com Jasmine
BDD em Javascript
1
Para você e a todas as pessoas que de alguma forma acompanham
o meu trabalho e me motivam e incentivam a seguir em frente
compartilhando conhecimento com as demais pessoas
2
Deseja acelerar o seu aprendizado e aprender
testes unitários com Javascript rapidamente?
Com o curso de Testes unitários com Javascript será possível!
Veja as vantagens:
➢ Você se tornará um profissional completo em teste de software
➢ Aprenderá a criar testes unitários com Jasmine
➢ Aprenderá automatizar testes com Karma
➢ Versionamento de código fonte com Git/GitHub
➢ Integração contínua com Travis CI
3
Autor
Website: http://kazale.com
Email: [email protected]
LinkedIn: https://ie.linkedin.com/in/m4rciosouza
GitHub: https://github.com/m4rciosouza
Facebook: https://www.facebook.com/Kazaleit
YouTube: https://www.youtube.com/c/MarcioSouzaKazale
4
Prefácio
O objetivo deste livro é servir como uma referência das funcionalidades do
framework Javascript Jasmine, utilizado para criação de testes unitários.
5
Introdução
Com a evolução e complexidade dos softwares a serem desenvolvidos, cada vez
mais é importante ter uma boa cobertura de testes no código desenvolvido, para
evitar bugs e problemas futuros ao adicionar novas funcionalidades ou mesmo
alterar um código.
Ele utiliza os conceitos do BDD (Behavior Driven Development), que seriam testes
guiados por comportamento, que permite a criação de testes intuitivos e de fácil
compreensão.
Suas vantagens incluem ser rápido, e não possuir dependências externas, incluindo
por padrão tudo o que é necessário para testar uma aplicação.
Mesmo sendo um framework Javascript, ele pode ser utilizado em projetos Ruby ou
Python, além de se integrar perfeitamente com NodeJS.
6
Sumário
1. Distribuição Standalone
2. Suítes
3. Testes (Specs)
4. Verificações (Expectations)
5. Comparações (Matchers)
5.1. toBe
5.2. toEqual
5.3. toMatch
5.4. toBeDefined
5.5. toBeUndefined
5.6. toBeNull
5.7. toBeTruthy
5.8. toBeFalsy
5.9. toContain
5.10. toBeLessThan
5.11. toBeGreaterThan
5.12. toThrow
5.13. toThrowError
8. Aninhando suítes
9. Desabilitando suítes
11. Spies
11.1. spyOn
11.2. toHaveBeenCalled
11.3. toHaveBeenCalledTimes
11.4. toHaveBeenCalledWith
11.5. and.callThrough
11.6. and.returnValue
7
11.7. and.returnValues
11.8. and.callFake
11.9. and.throwError
11.10. calls.any
11.11. calls.count
11.12. calls.argsFor
11.13. calls.allArgs
11.14. calls.all
11.15. calls.mostRecent
11.16. calls.first
11.17. calls.reset
11.18. createSpy
11.19. createSpyObj
15. Conclusão
8
1. Distribuição Standalone
Possui tudo o que é preciso para aprender sobre o Jasmine, para posteriormente
incorporar o framework em projetos mais complexos e automatizados
9
2. Suítes
❏ Suítes de testes servem para definir o escopo do que está sendo testado
❏ Uma aplicação é composta por diversas suítes de testes
❏ Exemplos de suítes seriam: Cadastro de Clientes, Operações Matemáticas,...
❏ No Jasmine, a suíte é uma função global Javascript chamada ‘describe’, que
possui dois parâmetros, que seriam sua descrição e os testes (specs)
Exemplo:
10
3. Testes (Specs)
Exemplo:
11
4. Verificações (Expectations)
Exemplo:
expect(Calculadora.adicionar(1, 9)).toBe(10);
12
5. Comparações (Matchers)
13
5.1. toBe
Exemplo:
});
14
5.2. toEqual
Exemplo:
});
15
5.3. toMatch
Exemplo:
});
16
5.4. toBeDefined
Exemplo:
});
17
5.5. toBeUndefined
Exemplo:
});
18
5.6. toBeNull
Exemplo:
});
19
5.7. toBeTruthy
Exemplo:
});
20
5.8. toBeFalsy
Exemplo:
});
21
5.9. toContain
Exemplo:
});
22
5.10. toBeLessThan
Exemplo:
});
23
5.11. toBeGreaterThan
Exemplo:
});
24
5.12. toThrow
Exemplo:
});
25
5.13. toThrowError
Exemplo:
26
6. Falha manual (Fail)
Exemplo:
27
7. Executando código antes e depois do teste
28
7.1. beforeEach
Exemplo:
beforeEach(function() {
contador++;
});
29
7.2. afterEach
Exemplo:
beforeEach(function() {
contador++;
});
afterEach(function() {
contador = 0;
});
30
7.3. beforeAll
❏ Função Javascript global do Jasmine que é executada uma única vez antes
da execução dos testes
❏ Por ser executada antes de todos os testes, serve para inicializar um status,
criar objetos
Exemplo:
var contador;
beforeAll(function() {
contador = 10;
});
beforeEach(function() {
contador++;
});
31
7.4. afterAll
❏ Função Javascript global do Jasmine que é executada uma única vez depois
da execução dos testes
❏ Por ser executada depois de todos os testes, serve para limpar algum status
global
Exemplo:
var contador;
beforeAll(function() {
contador = 10;
});
afterAll(function() {
contador = 0;
});
32
8. Aninhando suítes
Exemplo:
33
9. Desabilitando suítes
Exemplo:
beforeEach(function() {
contador += 1;
});
34
10. Desabilitando testes
Exemplo:
35
11. Spies
36
11.1. spyOn
❏ spyOn serve para criar um mock (objeto falso) a ser utilizado nos testes
❏ Um objeto spy contém uma série de atributos que serão estudados ao longo
do capítulo
❏ A função spyOn recebe como parâmetros o nome do objeto e do método a
serem utilizados como mock
Exemplo:
beforeEach(function() {
spyOn(calculadora, "somar");
});
});
37
11.2. toHaveBeenCalled
Exemplo:
beforeEach(function() {
spyOn(calculadora, "somar");
});
38
11.3. toHaveBeenCalledTimes
Exemplo:
beforeEach(function() {
spyOn(calculadora, "somar");
});
39
11.4. toHaveBeenCalledWith
Exemplo:
beforeEach(function() {
spyOn(calculadora, "somar");
});
40
11.5. and.callThrough
❏ and.callThrough serve para informar ao spy que o método original deve ser
executado
❏ and.callThrough deve ser aplicado ao objeto spy
❏ Nesse caso o método original será executado, e todos os recursos do spy
serão mantidos e estarão disponíveis para verificação
Exemplo:
41
42
11.6. and.returnValue
Exemplo:
beforeEach(function() {
spyOn(calculadora, "somar").and.returnValue(10);
});
43
11.7. and.returnValues
Exemplo:
beforeEach(function() {
spyOn(calculadora, "somar").and.returnValues(10, 20);
});
44
11.8. and.callFake
Exemplo:
beforeEach(function() {
spyOn(calculadora, "somar").and.callFake(
function(n1, n2) {
return n1 * n2;
});
});
45
11.9. and.throwError
Exemplo:
beforeEach(function() {
spyOn(calculadora, "somar").and.throwError(
"valores inválidos");
});
46
11.10. calls.any
❏ Todo spy possui um atributo “calls” com informações sobre suas chamadas
❏ O “calls.any” serve para indicar se o método do spy foi chamada ao menos
uma vez
❏ Ele não recebe parâmetros e retorna um valor booleano se ocorreu ou não
uma chamada ao método do spy
Exemplo:
beforeEach(function() {
spyOn(calculadora, "somar");
});
47
11.11. calls.count
Exemplo:
beforeEach(function() {
spyOn(calculadora, "somar");
});
48
11.12. calls.argsFor
Exemplo:
beforeEach(function() {
spyOn(calculadora, "somar");
});
49
11.13. calls.allArgs
Exemplo:
beforeEach(function() {
spyOn(calculadora, "somar");
});
50
11.14. calls.all
Exemplo:
beforeEach(function() {
spyOn(calculadora, "somar");
});
51
11.15. calls.mostRecent
Exemplo:
beforeEach(function() {
spyOn(calculadora, "somar");
});
52
11.16. calls.first
Exemplo:
beforeEach(function() {
spyOn(calculadora, "somar");
});
53
11.17. calls.reset
❏ O “calls.reset” serve para limpar a lista com os dados das chamadas dos
métodos de um spy
❏ Pode ser útil quando tiver suítes aninhadas ou mesmo precisar restaurar o
valor padrão das chamadas
Exemplo:
beforeEach(function() {
spyOn(calculadora, "somar");
});
54
11.18. createSpy
Exemplo:
55
11.19. createSpyObj
Exemplo:
calculadora.somar.and.returnValue(10);
56
12. Objeto “jasmine”
57
12.1. jasmine.any
Exemplo:
var somar;
beforeEach(function() {
somar = jasmine.createSpy("somar");
});
58
12.2. jasmine.anything
Exemplo:
var somar;
beforeEach(function() {
somar = jasmine.createSpy("somar");
});
59
12.3. jasmine.objectContaining
Exemplo:
var carro;
beforeEach(function() {
carro = {
'movido': 'gasolina',
'ano': 2016
};
});
60
12.4. jasmine.arrayContaining
Exemplo:
var numeros;
beforeEach(function() {
numeros = [1, 2, 3, 5, 7, 11];
});
61
12.5. jasmine.stringMatching
Exemplo:
var exibirTexto;
beforeEach(function() {
exibirTexto = jasmine.createSpy("exibirTexto");
});
62
13. Jasmine Clock
Exemplo:
var somar;
beforeEach(function() {
somar = jasmine.createSpy("somar");
jasmine.clock().install();
});
afterEach(function() {
jasmine.clock().uninstall();
});
});
63
14. Criando um comparador personalizado
Exemplo de comparador:
return {
compare: function(actual, expected) {
var result = {};
if (expected === undefined) {
result.pass = emailRegex.test(actual);
} else {
result.pass = expected.test(expected);
}
if (result.pass) {
result.message = actual + " é um e-mail válido";
} else {
result.message = "Esperado que " + actual +
" seja um e-mail válido";
}
return result;
}
64
}
}
};
beforeEach(function() {
jasmine.addMatchers(meuMatcher);
});
65
15. Conclusão
Conforme apresentado, todas as principais referências do framework Jasmine foram
descritas, assim como um código de exemplo foi adicionado para facilitar o
entendimento e funcionamento de cada item.
Também não deixe de conferir o curso gratuito de testes unitários com Angular 2,
onde você utilizará os conceitos aqui aprendidos para a criação de testes unitários
no poderoso framework Angular 2.
66
Deseja acelerar o seu aprendizado e aprender
testes unitários com Javascript rapidamente?
Com o curso de Testes unitários com Javascript será possível!
Veja as vantagens:
➢ Você se tornará um profissional completo em teste de software
➢ Aprenderá a criar testes unitários com Jasmine
➢ Aprenderá automatizar testes com Karma
➢ Versionamento de código fonte com Git/GitHub
➢ Integração contínua com Travis CI
67