SlideShare uma empresa Scribd logo
1 de 50
Baixar para ler offline
Test-Driven Development 
serve pra mim? 
Maurício Aniche 
mauricio.aniche@caelum.com.br 
www.aniche.com.br 
@mauricioaniche
Nós amamos 
métodos ágeis 
(e TDD mais ainda)!
Na academia...
Mas tudo faz sentido... 
Será que vale a pena 
estudar melhor?
Homens de nível educacional mais alto apresentaram 
maior quantidade de sintomas pseudoneuróticos do 
que aqueles que haviam recebido menos instrução; 
! 
Homens do meio rural mantiveram-se mais bem-humorados 
durante a guerra do que os soldados 
recrutados nas cidades; 
! 
A capacidade dos homens do Sul (dos EUA) para 
suportar o calor era maior do que as dos soldados do 
Norte. 
! 
Lazarsfeld, P. "The American Soldier - An Expository Review", 1949.
Mas nós conhecemos 
bem de software, não 
tem como errarmos!
O mito do 
programador 10x 
Bossavit, L. The Leprechauns of Software Engineering, 2012.
O que é TDD? 
• Qual a melhor definição sobre TDD? 
• É uma prática de testes? 
• É uma prática de design? 
Test-Driven Design
E aí? Depende...
TDD como 
prática de testes 
• Quando o desenvolvedor pratica TDD com 
o mero objetivo de aumentar a cobertura 
de testes e garantir qualidade externa.
A academia gosta disso... 
Aniche. Como a prática de TDD influencia projetos de classes em sistemas 
orientados a objetos. Dissertação de mestrado, 2012.
Como prática de teste 
• Tem vantagem? 
• Código “nasce testado” 
• Menos viés na hora de testar 
• Você cobre mais caminhos
Mas esse, com certeza, 
não foi meu foco de 
estudo.
Como prática de design 
• É dito que com a prática de TDD, seu 
projeto de classes torna-se melhor. 
• Muitos autores (Kent Beck, Martin Fowler, 
Robert Martin, Michael Feathers, Steve 
Freeman, ...) falam sobre isso.
A academia estudou 
isso também... 
Aniche. Como a prática de TDD influencia projetos de classes em sistemas 
orientados a objetos. Dissertação de mestrado, 2012.
Mas é tão mágico 
assim? 
• Em 2010, durante um evento ágil, 
participantes não souberam bem se 
expressar quando o assunto era “como 
TDD influencia no projeto de classes”. 
Aniche, Ferreira, Gerosa. What Concerns Beginner Test-Driven Development 
Practitioners: A Qualitative Analysis of Opinions in an Agile Conference. 2011 
Brazilian Workshop on Agile Methods, WBMA 2011.
Outras pessoas 
já perceberam que 
os efeitos de TDD 
não são tão naturais 
assim! 
M. Siniaalto and P. Abrahamsson, “Does test-driven development improve the program 
code? Alarming results from a comparative case study,” Balancing Agility and 
Formalism in Software Engineering, vol. 5082, pp. 143–156, 2008. # 
[Online]. Available: http://dx.doi.org/10. 1007/978- 3- 540- 85279- 7_12
A última revisão 
sistemática sobre 
o assunto então… 
Munir, Moayyed, Petersen. Considering rigor and relevance when 
evaluating test driven development: A systematic review, 2014.#
Mas como descobrir? 
• Uma das partes mais desafiadores (e 
legais!) da ciência é justamente essa: como 
bolar um experimento controlado que 
simule corretamente uma situação real?
Um Estudo Qualitativo 
• ~30 desenvolvedores da indústria 
• Grande experiência com desenvolvimento 
de software (só 20% tinham menos de 2 
anos de experiência, 30% entre 6 e 10 
anos). 
• Praticam TDD há algum tempo (50% 
pratica entre 1 a 3 anos) 
Aniche, Gerosa. How the Practice of TDD Influences Class Design in 
Object-Oriented Systems: Patterns of Unit Tests Feedback. SBES 2012.
a prática de TDD não guia o 
desenvolvedor para um bom 
projeto de classes de forma 
automática! 
Aniche, Gerosa. How the Practice of TDD Influences Class Design in 
Object-Oriented Systems: Patterns of Unit Tests Feedback. SBES 2012.
TDD dá retorno constante 
sobre os possíveis problemas 
existentes no atual projeto de 
classes. É tarefa do 
desenvolvedor perceber esses 
problemas e melhorar o 
projeto de acordo. 
Aniche, Gerosa. How the Practice of TDD Influences Class Design in 
Object-Oriented Systems: Patterns of Unit Tests Feedback. SBES 2012.
Regra para a vida! 
• “Se está difícil testar, é porque, provavelmente, 
há um problema de projeto ou implementação 
em seu código”. 
• O segredo é perceber, o mais rápido 
possível, o momento em que escrever o 
teste passou a ser uma tarefa difícil.
Isso quer dizer que... 
• A busca pela testabilidade faz com que você 
busque projetos de classe mais simples 
• instanciar uma classe, e fazer uso de 
comportamentos deve ser fácil 
• classes não podem ser complicadas, 
senão fica difícil testar) 
• Maneira barata de validar seu projeto de 
classes
Quer ver um exemplo? 
• Um teste sempre tem 3 partes: um cenário, 
uma ação, e uma validação. 
• Se escrever o cenário para o teste está 
complicado, provavelmente tem algo 
errado.
[TestFixture] 
public class GeradorDeNotaFiscalTest 
{ 
[Test] 
public void DeveGerarUmaNotaFiscal { 
var gerador = new GeradorDeNotaFiscal(); 
var nf = gerador.gera(fatura); 
Assert.AreEqual(fatura.Valor * 0.2, 
nf.ValorImposto); 
} 
} 
- hmm... ele depende de algo? 
- deve receber uma fatura? 
- o nome do método está claro? 
- o que ele deve retornar?
Classes acopladas 
[TestFixture] 
public class MessageProcessorTest 
{ 
// atributos com as dependencias que serao mockadas 
! 
[SetUp] 
public void SetUp() { 
// criando mocks 
} 
[Test] 
public void ShouldDoSomething() 
{ 
var processor = new MessageProcessor(unpacker, auditer, 
locationFinder, counterPartyFinder, domesticNotifier, 
importedNotifier); 
! 
processor.OnMessage(BuildSomeSpecificRawMessage()); 
// algumas assercoes aqui.. 
} 
}
dependencies, 
notifications, 
adjustments 
Freeman, Pryce. Growing Object-Oriented Software, Guided by Tests. 2009.
# [Test]# 
# public void CalculaISS() { # 
# # var valor = new CalculaImposto().ParaValor(1500);# 
# # Assert.AreEqual(1500*1.2, valor);# 
}# 
! 
# [Test]# 
# public void CalculaICMS() { # 
# # var valor = new CalculaImposto().ParaValor(6000);# 
# # Assert.AreEqual(6000*1.3, valor);# 
}# 
Muitos testes? 
Você tem testes muito parecidos que geram resultados 
diferentes? Quando olha a implementação, ela tem um if ou 
switch?
Padrões de projeto podem 
ajudar (de novo)!
Métodos privados? 
• Devo testá-los? 
• O que isso significa?
Olhando pros asserts 
• A quantidade de asserts também pode 
indicar problemas de qualidade no código 
de produção. 
Aniche, Oliva, Gerosa. What do the Asserts in a Unit Test Tell Us About 
Code Quality? A Study on Open Source and Industrial Projects. CSMR 2013.
Mas como? 
• Quanto maior a quantidade de “diferentes 
instâncias que recebem um assert”, maior a 
chance do código de produção ter 
problemas, em termos de complexidade, 
linhas de código, número de métodos 
invocados. 
assertEquals(a.Propriedade, “bla”); 
assertEquals(b.Propriedade, “ble”); 
Aniche, Oliva, Gerosa. What do the Asserts in a Unit Test Tell Us About 
Code Quality? A Study on Open Source and Industrial Projects. CSMR 2013.
Padrões de Feedback 
Aniche, Gerosa. How the Practice of TDD Influences Class Design in 
Object-Oriented Systems: Patterns of Unit Tests Feedback. SBES 2012.
Erros comuns 
• 45% dos desenvolvedores disseram que 
esquecem de refatorar constantemente. 
• 40% afirmam que fazem uma refatoração 
em outro trecho de código durante uma 
sessão de TDD. 
• 20% não começam pelo teste mais simples 
possível. 
• 35% não fazem baby steps. 
Aniche, Gerosa. Most Common Mistakes in TDD Practice: 
Results from an Online Survey with Developers. 2010, ICST.
Baby Steps 
• Na minha opinião, uma das partes mais mal 
entendidas pela comunidade. 
• Ser simples, não é ser simplório (e nem 
estúpido).
Baby Steps 
• Não faço baby steps o tempo inteiro; mas 
fico feliz de saber que posso fazer, se 
precisar. 
• Use sua experiência para decidir em que 
momento o passo deve ser menor; ou 
maior!
TDD 100% do tempo? 
• Eu não pratico TDD quando: 
• Meu projeto de classes já está bem 
definido. 
• A implementação já está clara na minha 
cabeça. 
• Testes de integração.
Qual a diferença de 
escrever o teste antes? 
• Fazendo ou não TDD, eu faço ciclos 
pequenos. 
Aniche. Como a prática de TDD influencia projetos de classes em sistemas 
orientados a objetos. Dissertação de mestrado, 2012.
Sou menos produtivo? 
• Se eu escrevo 100 linhas de produção, 
amanhã escreverei 50 de teste e 50 de 
produção. Sou menos produtivo? 
• Qual a sua noção de produtividade?
ATDD 
• A ideia é boa, mas... 
• Difícil. 
• Uma equipe nossa faz. 
• Os desafios são grandes.
Como aprendo TDD? 
• Pratique. 
• Geralmente são 2 os problemas: aprender a 
testar, e aprender boas práticas de 
programação (OO, etc). 
• Na hora de aprender a testar, a dificuldade 
é sempre pensar em cenários. Comece 
rascunhando uma lista. 
• TDD é estranho, no começo. Mas depois 
acostuma.
Boas práticas? 
• Padrões para prática de TDD 
• Padrões para testes de aceitação 
Aniche, Guerra. *, PLoP e SugarLoaf PLoP.
TDD 
Você é o desenvolvedor que usa TDD escondido? 
I will look for you, I will find you, and I will kill you.
“Muito melhor 
que Crepúsculo!” 
NY Times 
“De tirar o fôlego!” 
Washington Post 
“Um thriller 
fascinante!” 
Miami Herald 
http://www.tddnomundoreal.com.br
tdd.caelum.com.br
aniche.com.br/ 
publications
Alura!
LAPESSC / IME-USP
Obrigado! 
• Meu livro: www.tddnomundoreal.com.br 
• Meu blog: http://www.aniche.com.br 
• Cursos online do Alura: www.alura.com.br 
• Casa do Código: www.casadocodigo.com.br 
• Caelum: www.caelum.com.br 
!

Mais conteúdo relacionado

Mais procurados

Test driven development teste e design no mundo real by mauricio aniche (z-li...
Test driven development teste e design no mundo real by mauricio aniche (z-li...Test driven development teste e design no mundo real by mauricio aniche (z-li...
Test driven development teste e design no mundo real by mauricio aniche (z-li...
GessdaSilvaMachado
 
TDD: Técnicas, Benefícios e Limitação
TDD: Técnicas, Benefícios e Limitação TDD: Técnicas, Benefícios e Limitação
TDD: Técnicas, Benefícios e Limitação
Icaro Camelo
 

Mais procurados (20)

Test Driven Development (TDD) para seres humanos.
Test Driven Development (TDD) para seres humanos.Test Driven Development (TDD) para seres humanos.
Test Driven Development (TDD) para seres humanos.
 
Tdd na veia
Tdd na veiaTdd na veia
Tdd na veia
 
Como TDD pode influenciar na construção do seu Produto?
Como TDD pode influenciar na construção do seu Produto?Como TDD pode influenciar na construção do seu Produto?
Como TDD pode influenciar na construção do seu Produto?
 
Introdução ao TDD (Test-Driven Development) - #guma10anos
Introdução ao TDD (Test-Driven Development) - #guma10anosIntrodução ao TDD (Test-Driven Development) - #guma10anos
Introdução ao TDD (Test-Driven Development) - #guma10anos
 
TDD para "meros mortais"
TDD para "meros mortais"TDD para "meros mortais"
TDD para "meros mortais"
 
Test driven development teste e design no mundo real by mauricio aniche (z-li...
Test driven development teste e design no mundo real by mauricio aniche (z-li...Test driven development teste e design no mundo real by mauricio aniche (z-li...
Test driven development teste e design no mundo real by mauricio aniche (z-li...
 
Testes de software automatizados
Testes de software automatizadosTestes de software automatizados
Testes de software automatizados
 
Testes de software
Testes de softwareTestes de software
Testes de software
 
TDD: Técnicas, Benefícios e Limitação
TDD: Técnicas, Benefícios e Limitação TDD: Técnicas, Benefícios e Limitação
TDD: Técnicas, Benefícios e Limitação
 
O que é Teste de Software?
O que é Teste de Software?O que é Teste de Software?
O que é Teste de Software?
 
TDD: A Essência do Mantra
TDD: A Essência do MantraTDD: A Essência do Mantra
TDD: A Essência do Mantra
 
Lightning talk Test-Driven Development - TDD
Lightning talk Test-Driven Development - TDDLightning talk Test-Driven Development - TDD
Lightning talk Test-Driven Development - TDD
 
A Carreira de Desenvolvedor: do Jr ao Sênior
A Carreira de Desenvolvedor: do Jr ao SêniorA Carreira de Desenvolvedor: do Jr ao Sênior
A Carreira de Desenvolvedor: do Jr ao Sênior
 
Teste de software, na visão de um desenvolvedor
Teste de software, na visão de um desenvolvedorTeste de software, na visão de um desenvolvedor
Teste de software, na visão de um desenvolvedor
 
Como melhorar seu Front-end Unit Test
Como melhorar seu Front-end Unit TestComo melhorar seu Front-end Unit Test
Como melhorar seu Front-end Unit Test
 
Introdução ao TDD
Introdução ao TDDIntrodução ao TDD
Introdução ao TDD
 
Desenvolvimento de builds automizados com Jenkins - Em Busca do build Perfeito!
Desenvolvimento de builds automizados com Jenkins - Em Busca do build Perfeito!Desenvolvimento de builds automizados com Jenkins - Em Busca do build Perfeito!
Desenvolvimento de builds automizados com Jenkins - Em Busca do build Perfeito!
 
Como se tornar Agile Tester
Como se tornar Agile TesterComo se tornar Agile Tester
Como se tornar Agile Tester
 
Seu app a prova de gambiarras (ou não) - Ferramentas de validaSPção de código
Seu app a prova de gambiarras (ou não) - Ferramentas de validaSPção de códigoSeu app a prova de gambiarras (ou não) - Ferramentas de validaSPção de código
Seu app a prova de gambiarras (ou não) - Ferramentas de validaSPção de código
 
Test driven development
Test driven developmentTest driven development
Test driven development
 

Destaque

Destaque (14)

Does the Act of Refactoring Really Make Code Simpler? A Preliminary Study - W...
Does the Act of Refactoring Really Make Code Simpler? A Preliminary Study - W...Does the Act of Refactoring Really Make Code Simpler? A Preliminary Study - W...
Does the Act of Refactoring Really Make Code Simpler? A Preliminary Study - W...
 
O que estamos temos feito com mineração de repositório de código no IME?
O que estamos temos feito com mineração de repositório de código no IME?O que estamos temos feito com mineração de repositório de código no IME?
O que estamos temos feito com mineração de repositório de código no IME?
 
Minicurso sobre Evolução de Software no CBSoft 2011
Minicurso sobre Evolução de Software no CBSoft 2011Minicurso sobre Evolução de Software no CBSoft 2011
Minicurso sobre Evolução de Software no CBSoft 2011
 
Você tem um xerife olhando seu código?
Você tem um xerife olhando seu código?Você tem um xerife olhando seu código?
Você tem um xerife olhando seu código?
 
TDD depois do mainstream. E agora?
TDD depois do mainstream. E agora?TDD depois do mainstream. E agora?
TDD depois do mainstream. E agora?
 
DNAD 2015 - Métricas de código, pra que te quero?
DNAD 2015 - Métricas de código, pra que te quero?DNAD 2015 - Métricas de código, pra que te quero?
DNAD 2015 - Métricas de código, pra que te quero?
 
Eu meço, tu medes, ele mede.. Mas medimos o quê?
Eu meço, tu medes, ele mede.. Mas medimos o quê?Eu meço, tu medes, ele mede.. Mas medimos o quê?
Eu meço, tu medes, ele mede.. Mas medimos o quê?
 
MetricMiner: Supporting Researchers in Mining Software Repositories - SCAM 2013
MetricMiner: Supporting Researchers in Mining Software Repositories - SCAM 2013MetricMiner: Supporting Researchers in Mining Software Repositories - SCAM 2013
MetricMiner: Supporting Researchers in Mining Software Repositories - SCAM 2013
 
MTD2014 - Are The Methods In Your DAOs in the Right Place? A Preliminary Study
MTD2014 - Are The Methods In Your DAOs in the Right Place? A Preliminary StudyMTD2014 - Are The Methods In Your DAOs in the Right Place? A Preliminary Study
MTD2014 - Are The Methods In Your DAOs in the Right Place? A Preliminary Study
 
Code coverage for MSR Researches [Work in Progress]
Code coverage for MSR Researches [Work in Progress]Code coverage for MSR Researches [Work in Progress]
Code coverage for MSR Researches [Work in Progress]
 
SATT: Tailoring Code Metric Thresholds for Different Software Architectures (...
SATT: Tailoring Code Metric Thresholds for Different Software Architectures (...SATT: Tailoring Code Metric Thresholds for Different Software Architectures (...
SATT: Tailoring Code Metric Thresholds for Different Software Architectures (...
 
A Validated Set of Smells for MVC Architectures - ICSME 2016
A Validated Set of Smells for MVC Architectures - ICSME 2016A Validated Set of Smells for MVC Architectures - ICSME 2016
A Validated Set of Smells for MVC Architectures - ICSME 2016
 
Code quality in MVC systems - BENEVOL 2016
Code quality in MVC systems - BENEVOL 2016Code quality in MVC systems - BENEVOL 2016
Code quality in MVC systems - BENEVOL 2016
 
A Collaborative Approach to Teach Software Architecture - SIGCSE 2017
A Collaborative Approach to Teach Software Architecture - SIGCSE 2017A Collaborative Approach to Teach Software Architecture - SIGCSE 2017
A Collaborative Approach to Teach Software Architecture - SIGCSE 2017
 

Semelhante a Test-Driven Development serve pra mim?

TDD (Test Driven Development)
TDD (Test Driven Development)TDD (Test Driven Development)
TDD (Test Driven Development)
Felipe Pimentel
 

Semelhante a Test-Driven Development serve pra mim? (20)

Métodos Ágeis: O que é folclore e o que é real? (QCON SP 2012)
Métodos Ágeis: O que é folclore e o que é real? (QCON SP 2012)Métodos Ágeis: O que é folclore e o que é real? (QCON SP 2012)
Métodos Ágeis: O que é folclore e o que é real? (QCON SP 2012)
 
UnP Eng. Software - Aula 27
UnP Eng. Software - Aula 27UnP Eng. Software - Aula 27
UnP Eng. Software - Aula 27
 
Os Benefícios dos testes no desenvolvimento de software
Os Benefícios dos testes no desenvolvimento de softwareOs Benefícios dos testes no desenvolvimento de software
Os Benefícios dos testes no desenvolvimento de software
 
Sobre TDD - Tech Friday da Everis Uberlândia
Sobre TDD - Tech Friday da Everis UberlândiaSobre TDD - Tech Friday da Everis Uberlândia
Sobre TDD - Tech Friday da Everis Uberlândia
 
Tdd x testes unidades
Tdd x testes unidadesTdd x testes unidades
Tdd x testes unidades
 
Testando serviços aws localmente com Localstack e JUnit
Testando serviços aws localmente com Localstack e JUnitTestando serviços aws localmente com Localstack e JUnit
Testando serviços aws localmente com Localstack e JUnit
 
Métricas Em Fabricas De Software
Métricas Em Fabricas De SoftwareMétricas Em Fabricas De Software
Métricas Em Fabricas De Software
 
Teste Driven Development
Teste Driven DevelopmentTeste Driven Development
Teste Driven Development
 
TDD
TDDTDD
TDD
 
Qualidade e Testes de Software
Qualidade e Testes de SoftwareQualidade e Testes de Software
Qualidade e Testes de Software
 
Desenvolvimento dirigido por comportamento e por teste
Desenvolvimento dirigido por comportamento e por testeDesenvolvimento dirigido por comportamento e por teste
Desenvolvimento dirigido por comportamento e por teste
 
Coding Dojo Aplicado ao Ambiente Organizacional
Coding Dojo Aplicado ao Ambiente OrganizacionalCoding Dojo Aplicado ao Ambiente Organizacional
Coding Dojo Aplicado ao Ambiente Organizacional
 
TDD - Test Driven Development
TDD - Test Driven DevelopmentTDD - Test Driven Development
TDD - Test Driven Development
 
Defesa de mestrado: Como a prática de TDD influencia no projeto de classes em...
Defesa de mestrado: Como a prática de TDD influencia no projeto de classes em...Defesa de mestrado: Como a prática de TDD influencia no projeto de classes em...
Defesa de mestrado: Como a prática de TDD influencia no projeto de classes em...
 
TDD (Resumo)
TDD (Resumo)TDD (Resumo)
TDD (Resumo)
 
Apresentação tcc final
Apresentação tcc finalApresentação tcc final
Apresentação tcc final
 
eXtreme Programming
eXtreme ProgrammingeXtreme Programming
eXtreme Programming
 
TDD (Test Driven Development)
TDD (Test Driven Development)TDD (Test Driven Development)
TDD (Test Driven Development)
 
Cesar.Edu Turma S2I
Cesar.Edu Turma S2ICesar.Edu Turma S2I
Cesar.Edu Turma S2I
 
Pesquisa em Métodos Ágeis para o Desenvolvimento de Software
Pesquisa em Métodos Ágeis para o Desenvolvimento de SoftwarePesquisa em Métodos Ágeis para o Desenvolvimento de Software
Pesquisa em Métodos Ágeis para o Desenvolvimento de Software
 

Mais de Maurício Aniche

Mais de Maurício Aniche (12)

Can ML help software developers? (TEQnation 2022)
Can ML help software developers? (TEQnation 2022)Can ML help software developers? (TEQnation 2022)
Can ML help software developers? (TEQnation 2022)
 
Tracing Back Log Data to its Log Statement: From Research to Practice
Tracing Back Log Data to its Log Statement: From Research to PracticeTracing Back Log Data to its Log Statement: From Research to Practice
Tracing Back Log Data to its Log Statement: From Research to Practice
 
Pragmatic software testing education - SIGCSE 2019
Pragmatic software testing education - SIGCSE 2019Pragmatic software testing education - SIGCSE 2019
Pragmatic software testing education - SIGCSE 2019
 
Test Automation Day 2018
Test Automation Day 2018Test Automation Day 2018
Test Automation Day 2018
 
Software Testing with Caipirinhas and Stroopwafels
Software Testing with Caipirinhas and StroopwafelsSoftware Testing with Caipirinhas and Stroopwafels
Software Testing with Caipirinhas and Stroopwafels
 
Code smells in MVC applications (Dutch Spring meetup)
Code smells in MVC applications (Dutch Spring meetup)Code smells in MVC applications (Dutch Spring meetup)
Code smells in MVC applications (Dutch Spring meetup)
 
[TDC 2014] Métricas de código, pra que te quero?
[TDC 2014] Métricas de código, pra que te quero?[TDC 2014] Métricas de código, pra que te quero?
[TDC 2014] Métricas de código, pra que te quero?
 
Métricas de código, pra que te quero?
Métricas de código, pra que te quero?Métricas de código, pra que te quero?
Métricas de código, pra que te quero?
 
O que é código bonito?
O que é código bonito?O que é código bonito?
O que é código bonito?
 
Métodos Ágeis de Desenvolvimento de Software: Uma introdução
Métodos Ágeis de Desenvolvimento de Software: Uma introduçãoMétodos Ágeis de Desenvolvimento de Software: Uma introdução
Métodos Ágeis de Desenvolvimento de Software: Uma introdução
 
The relationship between test and production code quality (@ SIG)
The relationship between test and production code quality (@ SIG)The relationship between test and production code quality (@ SIG)
The relationship between test and production code quality (@ SIG)
 
What Do the Asserts in a Unit Test Tell Us About Code Quality? (CSMR2013)
What Do the Asserts in a Unit Test Tell Us About Code Quality? (CSMR2013)What Do the Asserts in a Unit Test Tell Us About Code Quality? (CSMR2013)
What Do the Asserts in a Unit Test Tell Us About Code Quality? (CSMR2013)
 

Test-Driven Development serve pra mim?

  • 1. Test-Driven Development serve pra mim? Maurício Aniche mauricio.aniche@caelum.com.br www.aniche.com.br @mauricioaniche
  • 2. Nós amamos métodos ágeis (e TDD mais ainda)!
  • 4. Mas tudo faz sentido... Será que vale a pena estudar melhor?
  • 5. Homens de nível educacional mais alto apresentaram maior quantidade de sintomas pseudoneuróticos do que aqueles que haviam recebido menos instrução; ! Homens do meio rural mantiveram-se mais bem-humorados durante a guerra do que os soldados recrutados nas cidades; ! A capacidade dos homens do Sul (dos EUA) para suportar o calor era maior do que as dos soldados do Norte. ! Lazarsfeld, P. "The American Soldier - An Expository Review", 1949.
  • 6. Mas nós conhecemos bem de software, não tem como errarmos!
  • 7. O mito do programador 10x Bossavit, L. The Leprechauns of Software Engineering, 2012.
  • 8. O que é TDD? • Qual a melhor definição sobre TDD? • É uma prática de testes? • É uma prática de design? Test-Driven Design
  • 10. TDD como prática de testes • Quando o desenvolvedor pratica TDD com o mero objetivo de aumentar a cobertura de testes e garantir qualidade externa.
  • 11. A academia gosta disso... Aniche. Como a prática de TDD influencia projetos de classes em sistemas orientados a objetos. Dissertação de mestrado, 2012.
  • 12. Como prática de teste • Tem vantagem? • Código “nasce testado” • Menos viés na hora de testar • Você cobre mais caminhos
  • 13. Mas esse, com certeza, não foi meu foco de estudo.
  • 14. Como prática de design • É dito que com a prática de TDD, seu projeto de classes torna-se melhor. • Muitos autores (Kent Beck, Martin Fowler, Robert Martin, Michael Feathers, Steve Freeman, ...) falam sobre isso.
  • 15. A academia estudou isso também... Aniche. Como a prática de TDD influencia projetos de classes em sistemas orientados a objetos. Dissertação de mestrado, 2012.
  • 16. Mas é tão mágico assim? • Em 2010, durante um evento ágil, participantes não souberam bem se expressar quando o assunto era “como TDD influencia no projeto de classes”. Aniche, Ferreira, Gerosa. What Concerns Beginner Test-Driven Development Practitioners: A Qualitative Analysis of Opinions in an Agile Conference. 2011 Brazilian Workshop on Agile Methods, WBMA 2011.
  • 17. Outras pessoas já perceberam que os efeitos de TDD não são tão naturais assim! M. Siniaalto and P. Abrahamsson, “Does test-driven development improve the program code? Alarming results from a comparative case study,” Balancing Agility and Formalism in Software Engineering, vol. 5082, pp. 143–156, 2008. # [Online]. Available: http://dx.doi.org/10. 1007/978- 3- 540- 85279- 7_12
  • 18. A última revisão sistemática sobre o assunto então… Munir, Moayyed, Petersen. Considering rigor and relevance when evaluating test driven development: A systematic review, 2014.#
  • 19. Mas como descobrir? • Uma das partes mais desafiadores (e legais!) da ciência é justamente essa: como bolar um experimento controlado que simule corretamente uma situação real?
  • 20. Um Estudo Qualitativo • ~30 desenvolvedores da indústria • Grande experiência com desenvolvimento de software (só 20% tinham menos de 2 anos de experiência, 30% entre 6 e 10 anos). • Praticam TDD há algum tempo (50% pratica entre 1 a 3 anos) Aniche, Gerosa. How the Practice of TDD Influences Class Design in Object-Oriented Systems: Patterns of Unit Tests Feedback. SBES 2012.
  • 21. a prática de TDD não guia o desenvolvedor para um bom projeto de classes de forma automática! Aniche, Gerosa. How the Practice of TDD Influences Class Design in Object-Oriented Systems: Patterns of Unit Tests Feedback. SBES 2012.
  • 22. TDD dá retorno constante sobre os possíveis problemas existentes no atual projeto de classes. É tarefa do desenvolvedor perceber esses problemas e melhorar o projeto de acordo. Aniche, Gerosa. How the Practice of TDD Influences Class Design in Object-Oriented Systems: Patterns of Unit Tests Feedback. SBES 2012.
  • 23. Regra para a vida! • “Se está difícil testar, é porque, provavelmente, há um problema de projeto ou implementação em seu código”. • O segredo é perceber, o mais rápido possível, o momento em que escrever o teste passou a ser uma tarefa difícil.
  • 24. Isso quer dizer que... • A busca pela testabilidade faz com que você busque projetos de classe mais simples • instanciar uma classe, e fazer uso de comportamentos deve ser fácil • classes não podem ser complicadas, senão fica difícil testar) • Maneira barata de validar seu projeto de classes
  • 25. Quer ver um exemplo? • Um teste sempre tem 3 partes: um cenário, uma ação, e uma validação. • Se escrever o cenário para o teste está complicado, provavelmente tem algo errado.
  • 26. [TestFixture] public class GeradorDeNotaFiscalTest { [Test] public void DeveGerarUmaNotaFiscal { var gerador = new GeradorDeNotaFiscal(); var nf = gerador.gera(fatura); Assert.AreEqual(fatura.Valor * 0.2, nf.ValorImposto); } } - hmm... ele depende de algo? - deve receber uma fatura? - o nome do método está claro? - o que ele deve retornar?
  • 27. Classes acopladas [TestFixture] public class MessageProcessorTest { // atributos com as dependencias que serao mockadas ! [SetUp] public void SetUp() { // criando mocks } [Test] public void ShouldDoSomething() { var processor = new MessageProcessor(unpacker, auditer, locationFinder, counterPartyFinder, domesticNotifier, importedNotifier); ! processor.OnMessage(BuildSomeSpecificRawMessage()); // algumas assercoes aqui.. } }
  • 28. dependencies, notifications, adjustments Freeman, Pryce. Growing Object-Oriented Software, Guided by Tests. 2009.
  • 29. # [Test]# # public void CalculaISS() { # # # var valor = new CalculaImposto().ParaValor(1500);# # # Assert.AreEqual(1500*1.2, valor);# }# ! # [Test]# # public void CalculaICMS() { # # # var valor = new CalculaImposto().ParaValor(6000);# # # Assert.AreEqual(6000*1.3, valor);# }# Muitos testes? Você tem testes muito parecidos que geram resultados diferentes? Quando olha a implementação, ela tem um if ou switch?
  • 30. Padrões de projeto podem ajudar (de novo)!
  • 31. Métodos privados? • Devo testá-los? • O que isso significa?
  • 32. Olhando pros asserts • A quantidade de asserts também pode indicar problemas de qualidade no código de produção. Aniche, Oliva, Gerosa. What do the Asserts in a Unit Test Tell Us About Code Quality? A Study on Open Source and Industrial Projects. CSMR 2013.
  • 33. Mas como? • Quanto maior a quantidade de “diferentes instâncias que recebem um assert”, maior a chance do código de produção ter problemas, em termos de complexidade, linhas de código, número de métodos invocados. assertEquals(a.Propriedade, “bla”); assertEquals(b.Propriedade, “ble”); Aniche, Oliva, Gerosa. What do the Asserts in a Unit Test Tell Us About Code Quality? A Study on Open Source and Industrial Projects. CSMR 2013.
  • 34. Padrões de Feedback Aniche, Gerosa. How the Practice of TDD Influences Class Design in Object-Oriented Systems: Patterns of Unit Tests Feedback. SBES 2012.
  • 35. Erros comuns • 45% dos desenvolvedores disseram que esquecem de refatorar constantemente. • 40% afirmam que fazem uma refatoração em outro trecho de código durante uma sessão de TDD. • 20% não começam pelo teste mais simples possível. • 35% não fazem baby steps. Aniche, Gerosa. Most Common Mistakes in TDD Practice: Results from an Online Survey with Developers. 2010, ICST.
  • 36. Baby Steps • Na minha opinião, uma das partes mais mal entendidas pela comunidade. • Ser simples, não é ser simplório (e nem estúpido).
  • 37. Baby Steps • Não faço baby steps o tempo inteiro; mas fico feliz de saber que posso fazer, se precisar. • Use sua experiência para decidir em que momento o passo deve ser menor; ou maior!
  • 38. TDD 100% do tempo? • Eu não pratico TDD quando: • Meu projeto de classes já está bem definido. • A implementação já está clara na minha cabeça. • Testes de integração.
  • 39. Qual a diferença de escrever o teste antes? • Fazendo ou não TDD, eu faço ciclos pequenos. Aniche. Como a prática de TDD influencia projetos de classes em sistemas orientados a objetos. Dissertação de mestrado, 2012.
  • 40. Sou menos produtivo? • Se eu escrevo 100 linhas de produção, amanhã escreverei 50 de teste e 50 de produção. Sou menos produtivo? • Qual a sua noção de produtividade?
  • 41. ATDD • A ideia é boa, mas... • Difícil. • Uma equipe nossa faz. • Os desafios são grandes.
  • 42. Como aprendo TDD? • Pratique. • Geralmente são 2 os problemas: aprender a testar, e aprender boas práticas de programação (OO, etc). • Na hora de aprender a testar, a dificuldade é sempre pensar em cenários. Comece rascunhando uma lista. • TDD é estranho, no começo. Mas depois acostuma.
  • 43. Boas práticas? • Padrões para prática de TDD • Padrões para testes de aceitação Aniche, Guerra. *, PLoP e SugarLoaf PLoP.
  • 44. TDD Você é o desenvolvedor que usa TDD escondido? I will look for you, I will find you, and I will kill you.
  • 45. “Muito melhor que Crepúsculo!” NY Times “De tirar o fôlego!” Washington Post “Um thriller fascinante!” Miami Herald http://www.tddnomundoreal.com.br
  • 50. Obrigado! • Meu livro: www.tddnomundoreal.com.br • Meu blog: http://www.aniche.com.br • Cursos online do Alura: www.alura.com.br • Casa do Código: www.casadocodigo.com.br • Caelum: www.caelum.com.br !