Slide 1

Slide 1 text

No content

Slide 2

Slide 2 text

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

Slide 52

Slide 52 text

assertions

Slide 53

Slide 53 text

Verificações expect(result).to.be.equal(10) assert.true(isBlue) assert.equals(result, 10)

Slide 54

Slide 54 text

assertions should.js must.js

Slide 55

Slide 55 text

erros comuns ao fazer verificações

Slide 56

Slide 56 text

expect(result).to.not.be.equal(10) expect(arr).to.not.contain(1, 2, 3) negações

Slide 57

Slide 57 text

+ ∞ - ∞ 0 Resultados de f(x) negações

Slide 58

Slide 58 text

+ ∞ - ∞ 0 Resultados de f(x) expect(result).to.not.be.equal(1) negações

Slide 59

Slide 59 text

+ ∞ - ∞ 0 1 expect(result).to.not.be.equal(1) negações

Slide 60

Slide 60 text

negações + ∞ - ∞ 0 1 expect(result).to.not.be.equal(1) Total de saídas que passam = ∞ - 1

Slide 61

Slide 61 text

asserções frouxas expect(result).to.be.a.number

Slide 62

Slide 62 text

asserções frouxas Desde 5e-324 até 1.7976931348623157e+308 expect(result).to.be.a.number

Slide 63

Slide 63 text

expect(result).to.be.a.number expect(arr).to.contain(1) asserções frouxas

Slide 64

Slide 64 text

múltiplos outputs

Slide 65

Slide 65 text

function mult(a, b) { let result = 0 for (let i = 0; i < b; i++) {
 result = sum(result + a)
 } return result } detalhes de implementação

Slide 66

Slide 66 text

mult(3, 2)
 expect(sum).to.be.calledTwice function mult(a, b) { return a * b; } refactor quebra detalhes de implementação

Slide 67

Slide 67 text

asserções circulares catFactory -> Cria objetos gato createBlueCat -> Cria um gato azul (chama catFactory)

Slide 68

Slide 68 text

asserções circulares expect(createBlueCat()) .to.be
 .equal(catFactory.create(‘blue’))

Slide 69

Slide 69 text

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 +

Slide 79

Slide 79 text

stubs Eliminam não-determinismo

Slide 80

Slide 80 text

stubs Eliminam não-determinismo Eliminam side-effects

Slide 81

Slide 81 text

stubs Ajudam à fazer isolamento Eliminam não-determinismo Eliminam side-effects

Slide 82

Slide 82 text

stubs Ajudam à fazer isolamento Eliminam não-determinismo Eliminam side-effects

Slide 83

Slide 83 text

mocks expectativas pré-programadas stubs + verificações

Slide 84

Slide 84 text

sinon.js

Slide 85

Slide 85 text

utilizando mocks, stubs & spies com sabedoria

Slide 86

Slide 86 text

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

Slide 123

Slide 123 text

obrigado! lucasfcosta lfernandescosta lucasfcosta.com