50
Test-Driven Development serve pra mim? Maurício Aniche [email protected] www.aniche.com.br @mauricioaniche

Test-Driven Development serve pra mim?

Embed Size (px)

DESCRIPTION

Minha palestra sobre TDD no Serra StarTec 3014, em Lages, SC.

Citation preview

Page 1: Test-Driven Development serve pra mim?

Test-Driven Development serve pra mim?

Maurício Aniche [email protected]

www.aniche.com.br @mauricioaniche

Page 2: Test-Driven Development serve pra mim?

Nós amamos métodos ágeis

(e TDD mais ainda)!

Page 3: Test-Driven Development serve pra mim?

Na academia...

Page 4: Test-Driven Development serve pra mim?

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

estudar melhor?

Page 5: Test-Driven Development serve pra mim?

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.

Page 6: Test-Driven Development serve pra mim?

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

Page 7: Test-Driven Development serve pra mim?

O mito do programador 10x

Bossavit, L. The Leprechauns of Software Engineering, 2012.

Page 8: Test-Driven Development serve pra mim?

O que é TDD?

• Qual a melhor definição sobre TDD?

• É uma prática de testes?

• É uma prática de design? Test-Driven Design

Page 9: Test-Driven Development serve pra mim?

E aí? Depende...

Page 10: Test-Driven Development serve pra mim?

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.

Page 11: Test-Driven Development serve pra mim?

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.

Page 12: Test-Driven Development serve pra mim?

Como prática de teste

• Tem vantagem?

• Código “nasce testado”

• Menos viés na hora de testar

• Você cobre mais caminhos

Page 13: Test-Driven Development serve pra mim?

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

estudo.

Page 14: Test-Driven Development serve pra mim?

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.

Page 15: Test-Driven Development serve pra mim?

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.

Page 16: Test-Driven Development serve pra mim?

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.

Page 17: Test-Driven Development serve pra mim?

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

Page 18: Test-Driven Development serve pra mim?

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

Page 19: Test-Driven Development serve pra mim?

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?

Page 20: Test-Driven Development serve pra mim?

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.

Page 21: Test-Driven Development serve pra mim?

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.

Page 22: Test-Driven Development serve pra mim?

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.

Page 23: Test-Driven Development serve pra mim?

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.

Page 24: Test-Driven Development serve pra mim?

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

Page 25: Test-Driven Development serve pra mim?

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.

Page 26: Test-Driven Development serve pra mim?

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

Page 27: Test-Driven Development serve pra mim?

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

Page 28: Test-Driven Development serve pra mim?

dependencies, notifications, adjustments

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

Page 29: Test-Driven Development serve pra mim?

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

Page 30: Test-Driven Development serve pra mim?

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

Page 31: Test-Driven Development serve pra mim?

Métodos privados?

• Devo testá-los?

• O que isso significa?

Page 32: Test-Driven Development serve pra mim?

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.

Page 33: Test-Driven Development serve pra mim?

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.

Page 34: Test-Driven Development serve pra mim?

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.

Page 35: Test-Driven Development serve pra mim?

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.

Page 36: Test-Driven Development serve pra mim?

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

Page 37: Test-Driven Development serve pra mim?

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!

Page 38: Test-Driven Development serve pra mim?

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.

Page 39: Test-Driven Development serve pra mim?

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.

Page 40: Test-Driven Development serve pra mim?

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?

Page 41: Test-Driven Development serve pra mim?

ATDD

• A ideia é boa, mas...

• Difícil.

• Uma equipe nossa faz.

• Os desafios são grandes.

Page 42: Test-Driven Development serve pra mim?

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.

Page 43: Test-Driven Development serve pra mim?

Boas práticas?

• Padrões para prática de TDD

• Padrões para testes de aceitação

Aniche, Guerra. *, PLoP e SugarLoaf PLoP.

Page 44: Test-Driven Development serve pra mim?

TD

D

Você é o desenvolvedor que usa TDD escondido? I will look for you, I will find you, and I will kill you.

Page 45: Test-Driven Development serve pra mim?

“Muito melhor que Crepúsculo!”

NY Times

http://www.tddnomundoreal.com.br

“De tirar o fôlego!” Washington Post

“Um thriller fascinante!”

Miami Herald

Page 46: Test-Driven Development serve pra mim?

tdd.caelum.com.br

Page 47: Test-Driven Development serve pra mim?

aniche.com.br/publications

Page 48: Test-Driven Development serve pra mim?

Alura!

Page 49: Test-Driven Development serve pra mim?

LAPESSC / IME-USP

Page 50: Test-Driven Development serve pra mim?

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

!