Slide 1

Slide 1 text

Globalcode – Open4education Desmistificando cobertura de código como métrica de qualidade Stefan Teixeira [email protected] / @stefan_teixeira

Slide 2

Slide 2 text

• QA Automation Engineer @ Toptal • Blogs técnicos: stefanteixeira.com.br (pt-br) / stefanteixeira.com (en) • Co-organizador dos meetups DevOps Carioca e Grupo de Testes Carioca Contatos: • E-mail: [email protected] • Twitter: twitter.com/stefan_teixeira • LinkedIn: linkedin.com/in/stefanteixeira • GitHub: github.com/stefanteixeira • SlideShare: slideshare.net/stefanteixeira Sobre

Slide 3

Slide 3 text

Cobertura de código

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

Fundamentos

Slide 6

Slide 6 text

http://gotwarlost.github.io/istanbul/public/coverage/lcov-report/istanbul/lib/command/common/run-with-cover.js.html

Slide 7

Slide 7 text

http://gotwarlost.github.io/istanbul/public/coverage/lcov-report/istanbul/lib/command/common/run-with-cover.js.html

Slide 8

Slide 8 text

http://gotwarlost.github.io/istanbul/public/coverage/lcov-report/istanbul/lib/command/common/run-with-cover.js.html

Slide 9

Slide 9 text

http://gotwarlost.github.io/istanbul/public/coverage/lcov-report/istanbul/lib/command/common/run-with-cover.js.html

Slide 10

Slide 10 text

http://gotwarlost.github.io/istanbul/public/coverage/lcov-report/istanbul/lib/command/common/run-with-cover.js.html

Slide 11

Slide 11 text

Alguns insights

Slide 12

Slide 12 text

"Test coverage is a useful tool for finding untested parts of a codebase. Test coverage is of little use as a numeric statement of how good your tests are" (Martin Fowler, ThoughtWorks)

Slide 13

Slide 13 text

http://martinfowler.com/bliki/TestCoverage.html

Slide 14

Slide 14 text

"High coverage numbers are too easy to reach with low quality testing” (Martin Fowler, ThoughtWorks)

Slide 15

Slide 15 text

Você pode ter 100% de cobertura sem NENHUM assert nos testes!

Slide 16

Slide 16 text

Quando parar de testar?

Slide 17

Slide 17 text

"One sign you are testing too much is if your tests are slowing you down. If it seems like a simple change to code causes excessively long changes to tests, that's a sign that there's a problem with the tests." (Martin Fowler, ThoughtWorks)

Slide 18

Slide 18 text

Métricas de código como metas

Slide 19

Slide 19 text

No content

Slide 20

Slide 20 text

Utilidade de metas de cobertura de código

Slide 21

Slide 21 text

"Once a metric becomes a target, it loses its meaning as a measure" (Goodhart’s Law)

Slide 22

Slide 22 text

“Quando a métrica vira meta, tudo fica uma ” (CFC, Knowledge21)

Slide 23

Slide 23 text

"The problem is that people optimize their performance according to how they’re measured. You can get 85% coverage by looking at the coverage conditions and picking the ones that seem easiest to satisfy…” (Brian Marick)

Slide 24

Slide 24 text

Efeitos de métricas como meta • Mutirão de testes

Slide 25

Slide 25 text

Efeitos de métricas como meta • Mutirão de testes • Testes só para aumentar cobertura

Slide 26

Slide 26 text

Efeitos de métricas como meta • Mutirão de testes • Testes só para aumentar cobertura • Testes inúteis: getters, setters, construtores

Slide 27

Slide 27 text

No content

Slide 28

Slide 28 text

Meta levando a decisões ruins • Temos que testar a funcionalidade X

Slide 29

Slide 29 text

Meta levando a decisões ruins • Temos que testar a funcionalidade X • Testá-la pela API é muito simples

Slide 30

Slide 30 text

Meta levando a decisões ruins • Temos que testar a funcionalidade X • Testá-la pela API é muito simples • Testá-la com unit tests é muito complexo

Slide 31

Slide 31 text

Meta levando a decisões ruins • Temos que testar a funcionalidade X • Testá-la pela API é muito simples • Testá-la com unit tests é muito complexo E aí, como testar?

Slide 32

Slide 32 text

Resposta • “Vamos testar com unit tests pra não sair da meta!"

Slide 33

Slide 33 text

Como saber se meus testes são bons?

Slide 34

Slide 34 text

Como saber se meus testes são bons? • Testes devem cobrir as partes mais complexas da aplicação

Slide 35

Slide 35 text

Como saber se meus testes são bons? • Testes devem cobrir as partes mais complexas da aplicação • Testes devem efetivamente testar alguma coisa

Slide 36

Slide 36 text

Complexidade de código

Slide 37

Slide 37 text

(Algumas) ferramentas

Slide 38

Slide 38 text

Métricas conhecidas • Complexidade Ciclomática

Slide 39

Slide 39 text

Métricas conhecidas • Complexidade Ciclomática • ABCMetric

Slide 40

Slide 40 text

Métricas conhecidas • Complexidade Ciclomática • ABCMetric • LCOM

Slide 41

Slide 41 text

Testes de Mutação

Slide 42

Slide 42 text

(Algumas) ferramentas

Slide 43

Slide 43 text

Testes de Mutação • Introduz mutações na implementação

Slide 44

Slide 44 text

Testes de Mutação • Introduz mutações na implementação • Roda os testes

Slide 45

Slide 45 text

Testes de Mutação • Introduz mutações na implementação • Roda os testes • Falharam?

Slide 46

Slide 46 text

Testes de Mutação • Introduz mutações na implementação • Roda os testes • Falharam?

Slide 47

Slide 47 text

Testes de Mutação • Introduz mutações na implementação • Roda os testes • Falharam? • Passaram??

Slide 48

Slide 48 text

Testes de Mutação • Introduz mutações na implementação • Roda os testes • Falharam? • Passaram??

Slide 49

Slide 49 text

Exemplos de mutações http://pitest.org/quickstart/mutators/

Slide 50

Slide 50 text

Conclusões

Slide 51

Slide 51 text

Conclusões • 100% de cobertura != bons testes

Slide 52

Slide 52 text

Conclusões • 100% de cobertura != bons testes • Teste as partes mais complexas da sua aplicação

Slide 53

Slide 53 text

Conclusões • 100% de cobertura != bons testes • Teste as partes mais complexas da sua aplicação • Use testes de mutação para garantir que seus testes são eficazes

Slide 54

Slide 54 text

Referências (parte 1) • Cobertura de código: • http://pt.slideshare.net/Kevlin/what-we-talk-about-when-we-talk-about- unit-testing (Palestra Kevlin Henney) • http://martinfowler.com/bliki/TestCoverage.html • http://martinfowler.com/bliki/AssertionFreeTesting.html • http://www.developertesting.com/archives/ month200705/20070504-000425.html (Conto sobre Code Coverage) • http://www.exampler.com/testing-com/writings/coverage.pdf (Artigo do Brian Marick sobre Code Coverage) • Complexidade de código: • http://blog.caelum.com.br/medindo-a-complexidade-do-seu-codigo/ • http://blog.caelum.com.br/como-medir-a-coesao-lcom/ • http://www.obomprogramador.com/2014/03/lack-of-cohesion-in- methods-4-lcom4.html • http://c2.com/cgi/wiki?AbcMetric

Slide 55

Slide 55 text

Referências (parte 2) • Ferramentas: • http://www.sonarqube.org/ • https://github.com/es-analysis/plato • https://github.com/bbatsov/rubocop • https://codeclimate.com/ • Testes de Mutação: • http://pitest.org/ • https://github.com/mbj/mutant • http://visualmutator.github.io/web/ • https://www.npmjs.com/package/grunt-mutation-testing • https://pypi.python.org/pypi/MutPy/0.4.0 • http://pt.slideshare.net/labianchin/teste-de-mutao

Slide 56

Slide 56 text

Globalcode – Open4education Stefan Teixeira @stefan_teixeira [email protected] Obrigado! stefanteixeira.com.br stefanteixeira.com