84
TDD depois do mainstream. E agora? Mauricio Aniche [email protected] www.aniche.com.br Saturday, August 31, 13

TDD depois do mainstream. E agora?

Embed Size (px)

DESCRIPTION

Palestra sobre TDD na QCON2013.

Citation preview

Page 1: TDD depois do mainstream. E agora?

TDD depois domainstream.

E agora?

Mauricio [email protected]

www.aniche.com.br

Saturday, August 31, 13

Page 2: TDD depois do mainstream. E agora?

Saturday, August 31, 13

Page 3: TDD depois do mainstream. E agora?

Nós amamos métodos ágeis

(e TDD mais ainda)!

Saturday, August 31, 13

Page 4: TDD depois do mainstream. E agora?

Na academia...

Saturday, August 31, 13

Page 5: TDD depois do mainstream. E agora?

Mas tudo faz sentido...Será que vale a pena

estudar melhor?

Saturday, August 31, 13

Page 6: TDD depois do mainstream. E agora?

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.

Saturday, August 31, 13

Page 7: TDD depois do mainstream. E agora?

Nossa intuiçãopode estar errada!

Saturday, August 31, 13

Page 8: TDD depois do mainstream. E agora?

Mas nós conhecemos bem de software, não tem como errarmos!

Saturday, August 31, 13

Page 9: TDD depois do mainstream. E agora?

1: O que é TDD?

Saturday, August 31, 13

Page 10: TDD depois do mainstream. E agora?

O que é TDD?

• Qual a melhor definição sobre TDD?

• “Prática onde o desenvolvedor escreve testes antes da implementação”

• “Prática onde o desenvolvedor escreve testes antes da implementação, e os usa para guiar seu projeto e implementação”

Saturday, August 31, 13

Page 11: TDD depois do mainstream. E agora?

Test-driven development (TDD) is the craft of producing automated tests for production code, and using that

process to drive design and programming. For every tiny bit of functionality in the production code, you first

develop a test that specifies and validates what the code will do. You then produce exactly as much code as will

enable that test to pass. Then you refactor (simplify and clarify) both the production code and the test code.

www.agilealliance.org/programs/roadmaps/Roadmap/tdd/tdd_index.htm

Saturday, August 31, 13

Page 12: TDD depois do mainstream. E agora?

E aí? Depende...

Saturday, August 31, 13

Page 13: TDD depois do mainstream. E agora?

2. TDD como prática de testes

Saturday, August 31, 13

Page 14: TDD depois do mainstream. E agora?

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.

Saturday, August 31, 13

Page 15: TDD depois do mainstream. E agora?

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.

Saturday, August 31, 13

Page 16: TDD depois do mainstream. E agora?

Como prática de teste

Saturday, August 31, 13

Page 17: TDD depois do mainstream. E agora?

Como prática de teste

• Tem vantagem?

Saturday, August 31, 13

Page 18: TDD depois do mainstream. E agora?

Como prática de teste

• Tem vantagem?

• Código “nasce testado”

Saturday, August 31, 13

Page 19: TDD depois do mainstream. E agora?

Como prática de teste

• Tem vantagem?

• Código “nasce testado”

• Menos viés na hora de testar

Saturday, August 31, 13

Page 20: TDD depois do mainstream. E agora?

Como prática de teste

• Tem vantagem?

• Código “nasce testado”

• Menos viés na hora de testar

• Você cobre mais caminhos

Saturday, August 31, 13

Page 21: TDD depois do mainstream. E agora?

Mas esse, com certeza,não foi meu foco de

estudo.

Saturday, August 31, 13

Page 22: TDD depois do mainstream. E agora?

3. TDD como prática de design

Saturday, August 31, 13

Page 23: TDD depois do mainstream. E agora?

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.

Saturday, August 31, 13

Page 24: TDD depois do mainstream. E agora?

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.

Saturday, August 31, 13

Page 25: TDD depois do mainstream. E agora?

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.

Saturday, August 31, 13

Page 26: TDD depois do mainstream. E agora?

Outras pessoasjá perceberam queos 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

Saturday, August 31, 13

Page 27: TDD depois do mainstream. E agora?

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?

Saturday, August 31, 13

Page 28: TDD depois do mainstream. E agora?

Um Estudo Qualitativo

Aniche, Gerosa. How the Practice of TDD Influences Class Design in Object-Oriented Systems: Patterns of Unit Tests Feedback. SBES 2012.

Saturday, August 31, 13

Page 29: TDD depois do mainstream. E agora?

Um Estudo Qualitativo

• ~30 desenvolvedores da indústria

Aniche, Gerosa. How the Practice of TDD Influences Class Design in Object-Oriented Systems: Patterns of Unit Tests Feedback. SBES 2012.

Saturday, August 31, 13

Page 30: TDD depois do mainstream. E agora?

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).

Aniche, Gerosa. How the Practice of TDD Influences Class Design in Object-Oriented Systems: Patterns of Unit Tests Feedback. SBES 2012.

Saturday, August 31, 13

Page 31: TDD depois do mainstream. E agora?

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.

Saturday, August 31, 13

Page 32: TDD depois do mainstream. E agora?

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.

Saturday, August 31, 13

Page 33: TDD depois do mainstream. E agora?

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.

Saturday, August 31, 13

Page 34: TDD depois do mainstream. E agora?

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.

Saturday, August 31, 13

Page 35: TDD depois do mainstream. E agora?

Isso quer dizer que...

Saturday, August 31, 13

Page 36: TDD depois do mainstream. E agora?

Isso quer dizer que...

• A busca pela testabilidade faz com que você busque projetos de classe mais simples

Saturday, August 31, 13

Page 37: TDD depois do mainstream. E agora?

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

Saturday, August 31, 13

Page 38: TDD depois do mainstream. E agora?

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)

Saturday, August 31, 13

Page 39: TDD depois do mainstream. E agora?

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

Saturday, August 31, 13

Page 40: TDD depois do mainstream. E agora?

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.

Saturday, August 31, 13

Page 41: TDD depois do mainstream. E agora?

[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); } }

Saturday, August 31, 13

Page 42: TDD depois do mainstream. E agora?

[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?

Saturday, August 31, 13

Page 43: TDD depois do mainstream. E agora?

Bloated constructor [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.. } }

Saturday, August 31, 13

Page 44: TDD depois do mainstream. E agora?

dependencies,notifications,adjustments

Freeman, Pryce. Growing Object-Oriented Software, Guided by Tests. 2009.

Saturday, August 31, 13

Page 45: TDD depois do mainstream. E agora?

" [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); }

If ’s e switchesVocê tem testes muito parecidos que geram resultados diferentes? Quando olha a implementação, ela tem um if ou switch?

Saturday, August 31, 13

Page 46: TDD depois do mainstream. E agora?

Padrões de projeto podem ajudar (de novo)!

Saturday, August 31, 13

Page 47: TDD depois do mainstream. E agora?

Métodos privados?

• Devo testá-los?

• O que isso significa?

Saturday, August 31, 13

Page 48: TDD depois do mainstream. E agora?

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.

Saturday, August 31, 13

Page 49: TDD depois do mainstream. E agora?

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.

Saturday, August 31, 13

Page 50: TDD depois do mainstream. E agora?

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.

Saturday, August 31, 13

Page 51: TDD depois do mainstream. E agora?

4. Erros comuns

Saturday, August 31, 13

Page 52: TDD depois do mainstream. E agora?

Erros comuns

Aniche, Gerosa. Most Common Mistakes in TDD Practice:Results from an Online Survey with Developers. 2010, ICST.

Saturday, August 31, 13

Page 53: TDD depois do mainstream. E agora?

Erros comuns

• 45% dos desenvolvedores disseram que esquecem de refatorar constantemente.

Aniche, Gerosa. Most Common Mistakes in TDD Practice:Results from an Online Survey with Developers. 2010, ICST.

Saturday, August 31, 13

Page 54: TDD depois do mainstream. E agora?

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.

Aniche, Gerosa. Most Common Mistakes in TDD Practice:Results from an Online Survey with Developers. 2010, ICST.

Saturday, August 31, 13

Page 55: TDD depois do mainstream. E agora?

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.

Aniche, Gerosa. Most Common Mistakes in TDD Practice:Results from an Online Survey with Developers. 2010, ICST.

Saturday, August 31, 13

Page 56: TDD depois do mainstream. E agora?

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.

Saturday, August 31, 13

Page 57: TDD depois do mainstream. E agora?

Baby Steps

Saturday, August 31, 13

Page 58: TDD depois do mainstream. E agora?

Baby Steps

• Na minha opinião, uma das partes mais mal entendidas pela comunidade.

Saturday, August 31, 13

Page 59: TDD depois do mainstream. E agora?

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).

Saturday, August 31, 13

Page 60: TDD depois do mainstream. E agora?

Baby Steps

Saturday, August 31, 13

Page 61: TDD depois do mainstream. E agora?

Baby Steps

• Não faço baby steps o tempo inteiro; mas fico feliz de saber que posso fazer, se precisar.

Saturday, August 31, 13

Page 62: TDD depois do mainstream. E agora?

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!

Saturday, August 31, 13

Page 63: TDD depois do mainstream. E agora?

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.

Saturday, August 31, 13

Page 64: TDD depois do mainstream. E agora?

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.

Saturday, August 31, 13

Page 65: TDD depois do mainstream. E agora?

5. Produtividade

Saturday, August 31, 13

Page 66: TDD depois do mainstream. E agora?

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?

Saturday, August 31, 13

Page 67: TDD depois do mainstream. E agora?

6. Outras maluquices

Saturday, August 31, 13

Page 68: TDD depois do mainstream. E agora?

ATDD

Saturday, August 31, 13

Page 69: TDD depois do mainstream. E agora?

ATDD

• A ideia é boa, mas...

Saturday, August 31, 13

Page 70: TDD depois do mainstream. E agora?

ATDD

• A ideia é boa, mas...

• Nunca vi ninguém fazendo.

Saturday, August 31, 13

Page 71: TDD depois do mainstream. E agora?

ATDD

• A ideia é boa, mas...

• Nunca vi ninguém fazendo.

• Os desafios são grandes.

Saturday, August 31, 13

Page 72: TDD depois do mainstream. E agora?

E esse tal de BDD?

Saturday, August 31, 13

Page 73: TDD depois do mainstream. E agora?

E esse tal de BDD?

• O pensamento BDD me agrada.

Saturday, August 31, 13

Page 74: TDD depois do mainstream. E agora?

E esse tal de BDD?

• O pensamento BDD me agrada.

• As ferramentas que “implementam” não. Não me agrada esses “testes em linguagem natural”.

Saturday, August 31, 13

Page 75: TDD depois do mainstream. E agora?

7. Ensino de TDD

Saturday, August 31, 13

Page 76: TDD depois do mainstream. E agora?

Como aprendo TDD?

Saturday, August 31, 13

Page 77: TDD depois do mainstream. E agora?

Como aprendo TDD?• Pratique.

Saturday, August 31, 13

Page 78: TDD depois do mainstream. E agora?

Como aprendo TDD?• Pratique.

• Geralmente são 2 os problemas: aprender a testar, e aprender boas práticas de programação (OO, etc).

Saturday, August 31, 13

Page 79: TDD depois do mainstream. E agora?

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.

Saturday, August 31, 13

Page 80: TDD depois do mainstream. E agora?

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.

Saturday, August 31, 13

Page 81: TDD depois do mainstream. E agora?

“Muito melhorque Crepúsculo!”

NY Times

http://www.tddnomundoreal.com.br

“De tirar o fôlego!”Washington Post

“Um thriller fascinante!”

Miami Herald

Saturday, August 31, 13

Page 82: TDD depois do mainstream. E agora?

Alura!

Saturday, August 31, 13

Page 83: TDD depois do mainstream. E agora?

http://www.codesheriff.com

Saturday, August 31, 13

Page 84: TDD depois do mainstream. E agora?

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

• CodeSheriff: www.codesheriff.com

Saturday, August 31, 13