Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Testes em JavaScript: A Maneira Correta
Search
Lucas Fernandes da Costa
May 05, 2017
Programming
0
74
Testes em JavaScript: A Maneira Correta
Talk apresentada no TDC Florianópolis 2017.
Lucas Fernandes da Costa
May 05, 2017
Tweet
Share
More Decks by Lucas Fernandes da Costa
See All by Lucas Fernandes da Costa
Types, tests, and why flat-earthers are bad at QA (HolyJS)
lucasfcosta
0
45
What did we Learn with JavaScript Fatigue? (FrontMania)
lucasfcosta
1
55
How I'm still not using GUIs in 2019
lucasfcosta
0
66
Programming with Birds - There is a Bluebird in My Talk That Wants to Get Out (LambdAle 2018)
lucasfcosta
0
120
What can we learn with JavaScript Fatigue? - FrontEnd United
lucasfcosta
2
210
What Can We Learn With JavaScript Fatigue? - The Conf SP
lucasfcosta
0
88
What Can We Learn With JavaScript Fatigue? - NebraskaJS
lucasfcosta
2
110
JavaScript Behind the Scenes: Meta Programming (FluentConf 2017)
lucasfcosta
0
130
JavaScript Behind the Scenes: Meta Programming
lucasfcosta
0
250
Other Decks in Programming
See All in Programming
オホーツクでコミュニティを立ち上げた理由―地方出身プログラマの挑戦 / TechRAMEN 2025 Conference
lemonade_37
2
490
MLH State of the League: 2026 Season
theycallmeswift
0
160
CEDEC 2025 『ゲームにおけるリアルタイム通信への QUIC導入事例の紹介』
segadevtech
3
970
AIレビュアーをスケールさせるには / Scaling AI Reviewers
technuma
2
230
20250808_AIAgent勉強会_ClaudeCodeデータ分析の実運用〜競馬を題材に回収率100%の先を目指すメソッドとは〜
kkakeru
0
200
ゲームの物理
fadis
5
1.5k
あなたとJIT, 今すぐアセンブ ル
sisshiki1969
1
720
未来を拓くAI技術〜エージェント開発とAI駆動開発〜
leveragestech
2
180
Google I/O recap web編 大分Web祭り2025
kponda
0
2.9k
一人でAIプロダクトを作るための工夫 〜技術選定・開発プロセス編〜 / I want AI to work harder
rkaga
13
2.8k
なぜ今、Terraformの本を書いたのか? - 著者陣に聞く!『Terraformではじめる実践IaC』登壇資料
fufuhu
4
650
CEDEC2025 長期運営ゲームをあと10年続けるための0から始める自動テスト ~4000項目を50%自動化し、月1→毎日実行にした3年間~
akatsukigames_tech
0
150
Featured
See All Featured
A designer walks into a library…
pauljervisheath
207
24k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
26
3k
jQuery: Nuts, Bolts and Bling
dougneiner
64
7.9k
Testing 201, or: Great Expectations
jmmastey
45
7.6k
Docker and Python
trallard
45
3.5k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
248
1.3M
A Modern Web Designer's Workflow
chriscoyier
695
190k
Faster Mobile Websites
deanohume
309
31k
Building Flexible Design Systems
yeseniaperezcruz
328
39k
Making Projects Easy
brettharned
117
6.3k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
46
7.6k
The World Runs on Bad Software
bkeepers
PRO
70
11k
Transcript
None
a maneira correta github lucasfcosta twitter lfernandescosta
Testes em Javascript A M A N E I R
A C O R R E T A lucasfcosta lfernandescosta
lucasfcosta lfernandescosta quem sou eu?
"Automated crap is still crap" Why most unit testing is
waste - James O. Coplien
the testing mindset
Martin Fowler Testes unitários não são tudo
Você não pode provar que seu código funciona
Você não pode provar que seu código funciona Você só
pode provar que ele não funciona
Você não pode testar todos os inputs possíveis
Testes que nunca falham não produzem informação
Testes que nunca falham não produzem informação Testes de baixo
risco possuem baixo valor
Green Bar Fever
Green Bar Fever
testes como especificações Testes ajudam a esclarecer especificações Testes servem
como especificação Ajudam a entender a codebase
determinismo
determinismo
determinismo Input Output Unit Under Test
reproducible builds Input Unit Under Test initial state
reproducible builds Input Output Unit Under Test initial state
reproducible builds Input Output Unit Under Test final state
reproducible builds Input Output Unit Under Test final state entre
testes: cleanup
reproducible builds Input Output Unit Under Test initial state entre
testes: cleanup
Testes não deterministas são inúteis Impossível diferenciar bugs de não-determinismo
Program to an interface not an implementation menos acoplamento
“TDD REDUCES FEAR” Kent Beck
Confiança Tamanho dos passos
teste seu código filesystem calls databases crypto libraries de terceiros
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
na prática
Ferramentas test runners assertion libraries code coverage mocks, stubs, spies
multi- platform o pipeline de testes
test runners
tape test runners !== assertions
4 elementos para bons test suites
isolamento um teste unitário testa apenas uma unidade (função)
isolamento + precisão para detectar erros
isolamento BDD GivenWhenThen
isolamento
foco o mínimo de verificações por teste
foco um teste = um objetivo
desacoplamento Unit Under Test Provê uma entrada Espera uma saída
X Y Não importa como é feito
desacoplamento Você paga por testes em manutenção
independência function a(input) { return b(input, c(input)) }
independência teste de “a” falha function a(input) { return b(input,
c(input)) }
independência teste de “a” falha o erro está em a,
b, ou c? function a(input) { return b(input, c(input)) }
independência prover resultados corretos de “b” e “c”
independência
4 elementos para bons test suites ISOLAMENTO FOCO DESACOPLAMENTO INDEPENDÊNCIA
ISOLAMENTO FOCO DESACOPLAMENTO INDEPENDÊNCIA 4 elementos para bons test suites
ISOLAMENTO FOCO DESACOPLAMENTO INDEPENDÊNCIA 4 elementos para bons test suites
ISOLAMENTO FOCO DESACOPLAMENTO INDEPENDÊNCIA 4 elementos para bons test suites
assertions
Verificações expect(result).to.be.equal(10) assert.true(isBlue) assert.equals(result, 10)
assertions should.js must.js
erros comuns ao fazer verificações
expect(result).to.not.be.equal(10) expect(arr).to.not.contain(1, 2, 3) negações
+ ∞ - ∞ 0 Resultados de f(x) negações
+ ∞ - ∞ 0 Resultados de f(x) expect(result).to.not.be.equal(1) negações
+ ∞ - ∞ 0 1 expect(result).to.not.be.equal(1) negações
negações + ∞ - ∞ 0 1 expect(result).to.not.be.equal(1) Total de
saídas que passam = ∞ - 1
asserções frouxas expect(result).to.be.a.number
asserções frouxas Desde 5e-324 até 1.7976931348623157e+308 expect(result).to.be.a.number
expect(result).to.be.a.number expect(arr).to.contain(1) asserções frouxas
múltiplos outputs
function mult(a, b) { let result = 0 for (let
i = 0; i < b; i++) { result = sum(result + a) } return result } detalhes de implementação
mult(3, 2) expect(sum).to.be.calledTwice function mult(a, b) { return a *
b; } refactor quebra detalhes de implementação
asserções circulares catFactory -> Cria objetos gato createBlueCat -> Cria
um gato azul (chama catFactory)
asserções circulares expect(createBlueCat()) .to.be .equal(catFactory.create(‘blue’))
asserções circulares expect(createBlueCat()) .to.be .equal(catFactory.create(‘blue’)) teste tautológico
asserções circulares implementação vs. implementação
erros comuns ao fazer verificações ASSERÇÕES FROUXAS MÚLTIPLOS OUTPUTS DETALHES
DE IMPLEMENTAÇÃO ASSERÇÕES CIRCULARES NEGAÇÕES
erros comuns ao fazer verificações ASSERÇÕES FROUXAS MÚLTIPLOS OUTPUTS DETALHES
DE IMPLEMENTAÇÃO ASSERÇÕES CIRCULARES NEGAÇÕES
erros comuns ao fazer verificações ASSERÇÕES FROUXAS MÚLTIPLOS OUTPUTS DETALHES
DE IMPLEMENTAÇÃO ASSERÇÕES CIRCULARES NEGAÇÕES
erros comuns ao fazer verificações ASSERÇÕES FROUXAS MÚLTIPLOS OUTPUTS DETALHES
DE IMPLEMENTAÇÃO ASSERÇÕES CIRCULARES NEGAÇÕES
erros comuns ao fazer verificações ASSERÇÕES FROUXAS MÚLTIPLOS OUTPUTS DETALHES
DE IMPLEMENTAÇÃO ASSERÇÕES CIRCULARES NEGAÇÕES
mocks, stubs, spies
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
stubs guardam dados sobre a utilização de funções sobrescrevem comportamentos
+
stubs Eliminam não-determinismo
stubs Eliminam não-determinismo Eliminam side-effects
stubs Ajudam à fazer isolamento Eliminam não-determinismo Eliminam side-effects
stubs Ajudam à fazer isolamento Eliminam não-determinismo Eliminam side-effects
mocks expectativas pré-programadas stubs + verificações
sinon.js
utilizando mocks, stubs & spies com sabedoria
utilizando mocks, stubs & spies com sabedoria Voltaire, 1793 une
grande responsabilité est la suite inséparable d’un grand pouvoir.
utilizando mocks, stubs & spies com sabedoria TIO BEN RIP
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)
sandboxes facilitam setup e teardown facilitam eliminar dependências entre testes
mais facilidade de resetar dados
fake timers implementação síncrona de relógio + determinismo (datas) testes
mais rápidos (não dependem de tempo)
STUBS, SPIES OU MOCKS? utilizando mocks, stubs & spies com
sabedoria
DETERMINISMO E SIDE-EFFECTS STUBS, SPIES OU MOCKS? utilizando mocks, stubs
& spies com sabedoria
SANDBOXES DETERMINISMO E SIDE-EFFECTS STUBS, SPIES OU MOCKS? utilizando mocks,
stubs & spies com sabedoria
SANDBOXES DETERMINISMO E SIDE-EFFECTS STUBS, SPIES OU MOCKS? FAKE TIMERS
utilizando mocks, stubs & spies com sabedoria
multiple platforms
diferentes features diferentes implementações
None
setup
setup web server
setup web server inicia browser
setup web server inicia browser browser conecta
testes headless • velocidade • acesso às APIs do browser
• múltiplos environments (CI)
testes headless phantomjs
packaging
code coverage
code coverage é uma medida interessante, porém imprecisa
é impossível testar todos os inputs existentes
testes sem verificações não significam nada
medindo code coverage
testes geração de relatórios .lcov medindo code coverage instrumentação
o pipeline de testes
continuous integration
git hooks
o pipeline de testes TASK RUNNER NPM (recomendado) Gulp Grunt
INSTRUMENTAÇÃO Istanbul TESTING Mocha Chai Tape Jest Jasmine
BROWSER TESTING Karma COVERAGE REPORTS Istanbul PACKAGING Browserify Webpack
Coveralls COMBINAÇÃO DE RELATÓRIOS lcov-result-merger COVERAGE TRACKING
Ferramentas test runners assertion libraries code coverage mocks, stubs, spies
multi- platform o pipeline de testes
Ferramentas test runners assertion libraries code coverage mocks, stubs, spies
multi- platform o pipeline de testes
Ferramentas test runners assertion libraries code coverage mocks, stubs, spies
multi- platform o pipeline de testes
Ferramentas test runners assertion libraries code coverage mocks, stubs, spies
multi- platform o pipeline de testes
Ferramentas test runners assertion libraries code coverage mocks, stubs, spies
multi- platform o pipeline de testes
Ferramentas test runners assertion libraries code coverage mocks, stubs, spies
multi- platform o pipeline de testes
obrigado! lucasfcosta lfernandescosta lucasfcosta.com