Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Testes em JavaScript: A Maneira Correta

Testes em JavaScript: A Maneira Correta

Talk apresentada no TDC Florianópolis 2017.

Transcript

  1. None
  2. a maneira correta github lucasfcosta twitter lfernandescosta

  3. Testes em Javascript A M A N E I R

    A C O R R E T A lucasfcosta lfernandescosta
  4. lucasfcosta lfernandescosta quem sou eu?

  5. "Automated crap is still crap" Why most unit testing is

    waste - James O. Coplien
  6. the testing mindset

  7. Martin Fowler Testes unitários não são tudo

  8. Você não pode provar que seu código funciona

  9. Você não pode provar que seu código funciona Você só

    pode provar que ele não funciona
  10. Você não pode testar todos os inputs possíveis

  11. Testes que nunca falham não produzem informação

  12. Testes que nunca falham não produzem informação Testes de baixo

    risco possuem baixo valor
  13. Green Bar Fever

  14. Green Bar Fever

  15. testes como
 especificações Testes ajudam a esclarecer especificações Testes servem

    como especificação Ajudam a entender a codebase
  16. determinismo

  17. determinismo

  18. determinismo Input Output Unit Under Test

  19. reproducible builds Input Unit Under Test initial state

  20. reproducible builds Input Output Unit Under Test initial state

  21. reproducible builds Input Output Unit Under Test final state

  22. reproducible builds Input Output Unit Under Test final state entre

    testes: cleanup
  23. reproducible builds Input Output Unit Under Test initial state entre

    testes: cleanup
  24. Testes não deterministas são inúteis Impossível diferenciar bugs de não-determinismo

  25. Program to an interface not an implementation menos acoplamento

  26. “TDD REDUCES FEAR” Kent Beck

  27. Confiança Tamanho dos passos

  28. teste seu código filesystem calls databases crypto libraries de terceiros

  29. 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
  30. na prática

  31. Ferramentas test runners assertion libraries code coverage mocks, stubs, spies

    multi- platform o pipeline de testes
  32. test runners

  33. tape test runners
 !== assertions

  34. 4 elementos para bons test suites

  35. isolamento um teste unitário testa apenas uma unidade (função)

  36. isolamento + precisão para detectar erros

  37. isolamento BDD GivenWhenThen

  38. isolamento

  39. foco o mínimo de verificações por teste

  40. foco um teste = um objetivo

  41. desacoplamento Unit Under Test Provê uma entrada Espera uma saída

    X Y Não importa como é feito
  42. desacoplamento Você paga por testes em manutenção

  43. independência function a(input) {
 return b(input, c(input))
 }

  44. independência teste de “a” falha function a(input) {
 return b(input,

    c(input))
 }
  45. independência teste de “a” falha o erro está em a,

    b, ou c? function a(input) {
 return b(input, c(input))
 }
  46. independência prover resultados corretos de “b” e “c”

  47. independência

  48. 4 elementos para bons test suites ISOLAMENTO FOCO DESACOPLAMENTO INDEPENDÊNCIA

  49. ISOLAMENTO FOCO DESACOPLAMENTO INDEPENDÊNCIA 4 elementos para bons test suites

  50. ISOLAMENTO FOCO DESACOPLAMENTO INDEPENDÊNCIA 4 elementos para bons test suites

  51. ISOLAMENTO FOCO DESACOPLAMENTO INDEPENDÊNCIA 4 elementos para bons test suites

  52. assertions

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

  54. assertions should.js must.js

  55. erros comuns ao fazer verificações

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

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

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

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

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

    saídas que passam = ∞ - 1
  61. asserções frouxas expect(result).to.be.a.number

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

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

  64. múltiplos outputs

  65. function mult(a, b) { let result = 0 for (let

    i = 0; i < b; i++) {
 result = sum(result + a)
 } return result } detalhes de implementação
  66. mult(3, 2)
 expect(sum).to.be.calledTwice function mult(a, b) { return a *

    b; } refactor quebra detalhes de implementação
  67. asserções circulares catFactory -> Cria objetos gato createBlueCat -> Cria

    um gato azul (chama catFactory)
  68. asserções circulares expect(createBlueCat()) .to.be
 .equal(catFactory.create(‘blue’))

  69. asserções circulares expect(createBlueCat()) .to.be
 .equal(catFactory.create(‘blue’)) teste tautológico

  70. asserções circulares implementação
 vs.
 implementação

  71. erros comuns ao fazer verificações ASSERÇÕES FROUXAS MÚLTIPLOS OUTPUTS DETALHES

    DE IMPLEMENTAÇÃO ASSERÇÕES CIRCULARES NEGAÇÕES
  72. erros comuns ao fazer verificações ASSERÇÕES FROUXAS MÚLTIPLOS OUTPUTS DETALHES

    DE IMPLEMENTAÇÃO ASSERÇÕES CIRCULARES NEGAÇÕES
  73. erros comuns ao fazer verificações ASSERÇÕES FROUXAS MÚLTIPLOS OUTPUTS DETALHES

    DE IMPLEMENTAÇÃO ASSERÇÕES CIRCULARES NEGAÇÕES
  74. erros comuns ao fazer verificações ASSERÇÕES FROUXAS MÚLTIPLOS OUTPUTS DETALHES

    DE IMPLEMENTAÇÃO ASSERÇÕES CIRCULARES NEGAÇÕES
  75. erros comuns ao fazer verificações ASSERÇÕES FROUXAS MÚLTIPLOS OUTPUTS DETALHES

    DE IMPLEMENTAÇÃO ASSERÇÕES CIRCULARES NEGAÇÕES
  76. mocks, stubs, spies

  77. 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
  78. stubs guardam dados sobre a utilização de funções sobrescrevem comportamentos

    +
  79. stubs Eliminam não-determinismo

  80. stubs Eliminam não-determinismo Eliminam side-effects

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

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

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

  84. sinon.js

  85. utilizando mocks, stubs & spies com sabedoria

  86. utilizando mocks, stubs & spies com sabedoria Voltaire, 1793 une

    grande responsabilité est la suite inséparable d’un grand pouvoir.
  87. utilizando mocks, stubs & spies com sabedoria TIO BEN
 RIP

  88. 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)
  89. sandboxes facilitam setup e teardown facilitam eliminar dependências entre testes

    mais facilidade de resetar dados
  90. fake timers implementação síncrona de relógio + determinismo (datas) testes

    mais rápidos (não dependem de tempo)
  91. STUBS, SPIES OU MOCKS? utilizando mocks, stubs & spies com

    sabedoria
  92. DETERMINISMO
 E SIDE-EFFECTS STUBS, SPIES OU MOCKS? utilizando mocks, stubs

    & spies com sabedoria
  93. SANDBOXES DETERMINISMO
 E SIDE-EFFECTS STUBS, SPIES OU MOCKS? utilizando mocks,

    stubs & spies com sabedoria
  94. SANDBOXES DETERMINISMO
 E SIDE-EFFECTS STUBS, SPIES OU MOCKS? FAKE TIMERS

    utilizando mocks, stubs & spies com sabedoria
  95. multiple platforms

  96. diferentes features diferentes implementações

  97. None
  98. setup

  99. setup web server

  100. setup web server inicia browser

  101. setup web server inicia browser browser conecta

  102. testes headless • velocidade • acesso às APIs do browser

    • múltiplos environments (CI)
  103. testes headless phantomjs

  104. packaging

  105. code coverage

  106. code coverage é uma medida interessante, porém imprecisa

  107. é impossível testar todos os inputs existentes

  108. testes sem verificações não significam nada

  109. medindo code coverage

  110. testes geração de relatórios .lcov medindo code coverage instrumentação

  111. o pipeline de testes

  112. continuous integration

  113. git hooks

  114. o pipeline de testes TASK RUNNER NPM (recomendado)
 Gulp Grunt

    INSTRUMENTAÇÃO Istanbul TESTING Mocha Chai Tape Jest Jasmine
  115. BROWSER
 TESTING Karma COVERAGE
 REPORTS Istanbul PACKAGING Browserify Webpack

  116. Coveralls COMBINAÇÃO
 DE RELATÓRIOS lcov-result-merger COVERAGE TRACKING

  117. Ferramentas test runners assertion libraries code coverage mocks, stubs, spies

    multi- platform o pipeline de testes
  118. Ferramentas test runners assertion libraries code coverage mocks, stubs, spies

    multi- platform o pipeline de testes
  119. Ferramentas test runners assertion libraries code coverage mocks, stubs, spies

    multi- platform o pipeline de testes
  120. Ferramentas test runners assertion libraries code coverage mocks, stubs, spies

    multi- platform o pipeline de testes
  121. Ferramentas test runners assertion libraries code coverage mocks, stubs, spies

    multi- platform o pipeline de testes
  122. Ferramentas test runners assertion libraries code coverage mocks, stubs, spies

    multi- platform o pipeline de testes
  123. obrigado! lucasfcosta lfernandescosta lucasfcosta.com