a maneira correta
github
lucasfcosta
twitter
lfernandescosta
Slide 3
Slide 3 text
Testes em
Javascript
A M A N E I R A C O R R E T A
lucasfcosta lfernandescosta
Slide 4
Slide 4 text
lucasfcosta lfernandescosta
quem
sou eu?
Slide 5
Slide 5 text
"Automated crap is still crap"
Why most unit testing is waste - James O. Coplien
Slide 6
Slide 6 text
the
testing
mindset
Slide 7
Slide 7 text
Martin Fowler
Testes unitários não são tudo
Slide 8
Slide 8 text
Você não pode
provar que seu
código funciona
Slide 9
Slide 9 text
Você não pode
provar que seu
código funciona
Você só pode
provar que ele
não funciona
Slide 10
Slide 10 text
Você não pode
testar todos os
inputs possíveis
Slide 11
Slide 11 text
Testes que nunca
falham não
produzem
informação
Slide 12
Slide 12 text
Testes que nunca
falham não
produzem
informação
Testes de baixo
risco possuem
baixo valor
Slide 13
Slide 13 text
Green Bar Fever
Slide 14
Slide 14 text
Green Bar Fever
Slide 15
Slide 15 text
testes como
especificações
Testes ajudam a
esclarecer
especificações
Testes servem
como
especificação
Ajudam a entender a codebase
Slide 16
Slide 16 text
determinismo
Slide 17
Slide 17 text
determinismo
Slide 18
Slide 18 text
determinismo
Input Output
Unit
Under
Test
Slide 19
Slide 19 text
reproducible builds
Input Unit
Under
Test
initial state
Slide 20
Slide 20 text
reproducible builds
Input Output
Unit
Under
Test
initial state
Slide 21
Slide 21 text
reproducible builds
Input Output
Unit
Under
Test
final state
Slide 22
Slide 22 text
reproducible builds
Input Output
Unit
Under
Test
final state
entre testes: cleanup
Slide 23
Slide 23 text
reproducible builds
Input Output
Unit
Under
Test
initial state
entre testes: cleanup
Slide 24
Slide 24 text
Testes não
deterministas
são inúteis
Impossível
diferenciar bugs de
não-determinismo
Slide 25
Slide 25 text
Program to an
interface not an
implementation
menos
acoplamento
Slide 26
Slide 26 text
“TDD REDUCES FEAR”
Kent Beck
Slide 27
Slide 27 text
Confiança
Tamanho
dos passos
Slide 28
Slide 28 text
teste seu código
filesystem calls
databases
crypto
libraries de terceiros
Slide 29
Slide 29 text
teste seu código
filesystem calls
databases
crypto
libraries de terceiros
responsabilidade
de quem mantém
essas ferramentas
testes de integração/black box
garantem o funcionamento delas
Slide 30
Slide 30 text
na prática
Slide 31
Slide 31 text
Ferramentas
test
runners
assertion
libraries
code
coverage
mocks,
stubs,
spies
multi-
platform
o pipeline de testes
Slide 32
Slide 32 text
test runners
Slide 33
Slide 33 text
tape
test runners
!==
assertions
Slide 34
Slide 34 text
4 elementos
para bons
test suites
Slide 35
Slide 35 text
isolamento
um teste unitário
testa apenas uma
unidade (função)
Slide 36
Slide 36 text
isolamento
+ precisão para
detectar erros
Slide 37
Slide 37 text
isolamento
BDD
GivenWhenThen
Slide 38
Slide 38 text
isolamento
Slide 39
Slide 39 text
foco
o mínimo de
verificações por teste
Slide 40
Slide 40 text
foco
um teste
=
um objetivo
Slide 41
Slide 41 text
desacoplamento
Unit
Under
Test
Provê uma
entrada
Espera
uma saída
X Y
Não importa
como é feito
Slide 42
Slide 42 text
desacoplamento
Você paga por testes
em manutenção
Slide 43
Slide 43 text
independência
function a(input) {
return b(input, c(input))
}
Slide 44
Slide 44 text
independência
teste de “a” falha
function a(input) {
return b(input, c(input))
}
Slide 45
Slide 45 text
independência
teste de “a” falha
o erro está em a, b, ou c?
function a(input) {
return b(input, c(input))
}
Slide 46
Slide 46 text
independência
prover resultados
corretos de “b” e “c”
Slide 47
Slide 47 text
independência
Slide 48
Slide 48 text
4 elementos
para bons
test suites ISOLAMENTO FOCO
DESACOPLAMENTO INDEPENDÊNCIA
Slide 49
Slide 49 text
ISOLAMENTO FOCO
DESACOPLAMENTO INDEPENDÊNCIA
4 elementos
para bons
test suites
Slide 50
Slide 50 text
ISOLAMENTO FOCO
DESACOPLAMENTO INDEPENDÊNCIA
4 elementos
para bons
test suites
Slide 51
Slide 51 text
ISOLAMENTO FOCO
DESACOPLAMENTO INDEPENDÊNCIA
4 elementos
para bons
test suites
asserções
circulares
expect(createBlueCat())
.to.be
.equal(catFactory.create(‘blue’))
teste tautológico
Slide 70
Slide 70 text
asserções
circulares
implementação
vs.
implementação
Slide 71
Slide 71 text
erros
comuns ao
fazer
verificações
ASSERÇÕES FROUXAS
MÚLTIPLOS OUTPUTS
DETALHES DE IMPLEMENTAÇÃO
ASSERÇÕES CIRCULARES
NEGAÇÕES
Slide 72
Slide 72 text
erros
comuns ao
fazer
verificações
ASSERÇÕES FROUXAS
MÚLTIPLOS OUTPUTS
DETALHES DE IMPLEMENTAÇÃO
ASSERÇÕES CIRCULARES
NEGAÇÕES
Slide 73
Slide 73 text
erros
comuns ao
fazer
verificações
ASSERÇÕES FROUXAS
MÚLTIPLOS OUTPUTS
DETALHES DE IMPLEMENTAÇÃO
ASSERÇÕES CIRCULARES
NEGAÇÕES
Slide 74
Slide 74 text
erros
comuns ao
fazer
verificações
ASSERÇÕES FROUXAS
MÚLTIPLOS OUTPUTS
DETALHES DE IMPLEMENTAÇÃO
ASSERÇÕES CIRCULARES
NEGAÇÕES
Slide 75
Slide 75 text
erros
comuns ao
fazer
verificações
ASSERÇÕES FROUXAS
MÚLTIPLOS OUTPUTS
DETALHES DE IMPLEMENTAÇÃO
ASSERÇÕES CIRCULARES
NEGAÇÕES
Slide 76
Slide 76 text
mocks,
stubs,
spies
Slide 77
Slide 77 text
spies
guardam
dados sobre a
utilização de
funções
• quantas vezes foi chamada
• com quais argumentos foi
chamada
• qual era o valor de this
podemos fazer verificações
sobre esses dados
Slide 78
Slide 78 text
stubs
guardam dados sobre
a utilização de funções
sobrescrevem
comportamentos
+
utilizando
mocks, stubs
& spies com
sabedoria
Voltaire, 1793
une grande
responsabilité est la
suite inséparable d’un
grand pouvoir.
Slide 87
Slide 87 text
utilizando
mocks, stubs
& spies com
sabedoria
TIO BEN
RIP
Slide 88
Slide 88 text
stubs, spies ou mocks?
spies
stubs
mocks
quando quero manter o
comportamento e checar
chamadas
quando quero substituir
comportamentos e checar
chamadas
quando quero dizer como
uma determinada peça deve
ser usada (conjunto de regras)
Slide 89
Slide 89 text
sandboxes
facilitam setup e teardown
facilitam eliminar
dependências entre testes
mais facilidade de resetar
dados
Slide 90
Slide 90 text
fake timers
implementação síncrona de
relógio
+ determinismo (datas)
testes mais rápidos (não
dependem de tempo)
Slide 91
Slide 91 text
STUBS, SPIES OU
MOCKS?
utilizando
mocks, stubs
& spies com
sabedoria
Slide 92
Slide 92 text
DETERMINISMO
E SIDE-EFFECTS
STUBS, SPIES OU
MOCKS?
utilizando
mocks, stubs
& spies com
sabedoria
Slide 93
Slide 93 text
SANDBOXES
DETERMINISMO
E SIDE-EFFECTS
STUBS, SPIES OU
MOCKS?
utilizando
mocks, stubs
& spies com
sabedoria
Slide 94
Slide 94 text
SANDBOXES
DETERMINISMO
E SIDE-EFFECTS
STUBS, SPIES OU
MOCKS?
FAKE TIMERS
utilizando
mocks, stubs
& spies com
sabedoria
Slide 95
Slide 95 text
multiple
platforms
Slide 96
Slide 96 text
diferentes features
diferentes implementações
Slide 97
Slide 97 text
No content
Slide 98
Slide 98 text
setup
Slide 99
Slide 99 text
setup web
server
Slide 100
Slide 100 text
setup web
server
inicia
browser
Slide 101
Slide 101 text
setup web
server
inicia
browser
browser
conecta
Slide 102
Slide 102 text
testes headless
• velocidade
• acesso às APIs do browser
• múltiplos environments (CI)
Slide 103
Slide 103 text
testes headless
phantomjs
Slide 104
Slide 104 text
packaging
Slide 105
Slide 105 text
code
coverage
Slide 106
Slide 106 text
code coverage é uma
medida interessante,
porém imprecisa
Slide 107
Slide 107 text
é impossível
testar todos os
inputs existentes
Slide 108
Slide 108 text
testes sem
verificações não
significam nada
Slide 109
Slide 109 text
medindo code coverage
Slide 110
Slide 110 text
testes
geração de relatórios
.lcov
medindo code coverage
instrumentação
Slide 111
Slide 111 text
o pipeline
de testes
Slide 112
Slide 112 text
continuous
integration
Slide 113
Slide 113 text
git hooks
Slide 114
Slide 114 text
o pipeline
de testes
TASK
RUNNER
NPM (recomendado)
Gulp
Grunt
INSTRUMENTAÇÃO
Istanbul
TESTING
Mocha
Chai
Tape
Jest
Jasmine
Slide 115
Slide 115 text
BROWSER
TESTING
Karma
COVERAGE
REPORTS
Istanbul
PACKAGING
Browserify
Webpack
Slide 116
Slide 116 text
Coveralls
COMBINAÇÃO
DE RELATÓRIOS
lcov-result-merger
COVERAGE
TRACKING
Slide 117
Slide 117 text
Ferramentas
test
runners
assertion
libraries
code
coverage
mocks,
stubs,
spies
multi-
platform
o pipeline de testes
Slide 118
Slide 118 text
Ferramentas
test
runners
assertion
libraries
code
coverage
mocks,
stubs,
spies
multi-
platform
o pipeline de testes
Slide 119
Slide 119 text
Ferramentas
test
runners
assertion
libraries
code
coverage
mocks,
stubs,
spies
multi-
platform
o pipeline de testes
Slide 120
Slide 120 text
Ferramentas
test
runners
assertion
libraries
code
coverage
mocks,
stubs,
spies
multi-
platform
o pipeline de testes
Slide 121
Slide 121 text
Ferramentas
test
runners
assertion
libraries
code
coverage
mocks,
stubs,
spies
multi-
platform
o pipeline de testes
Slide 122
Slide 122 text
Ferramentas
test
runners
assertion
libraries
code
coverage
mocks,
stubs,
spies
multi-
platform
o pipeline de testes