Test driven development

  • View
    199

  • Download
    2

Embed Size (px)

Text of Test driven development

  • Test-Driven DevelopmentO que ? O que no ? E o que isto tem a ver com voc?

    Carlos Eduardo MirandaArquiteto .NetAdd Technologies

  • AgendaIntroduoPor que ela ainda no um padro amplamente utilizado pelo mercado?TDD - O que ?TDD - BenefciosTDD O que no ?Mitos sobre o TDDPrtica do TDDE caso algum teste tenha falhado?Encontrei um bug, e agora?Tudo Verde! Done!Dificuldades na implantao do TDD na EmpresaO que isto tem a ver com voc?GlossrioSoluo Criao de uma classe de Pilha Stack

  • IntroduoO assunto nunca esteve to em voga quanto nos ltimos anos;No se trata de mais apenas um modismo do mercado;Traz diversos benefcios para as empresas e clientes;Maior parte dos projetos de software no atigem os seus objetivos em pelo menos uma das dimenses (tempo, custo, qualidade, escopo);Desenvolver software no desenvolver um produto fsico;Softwares apoiam as reas de negcio das empresas e estes mercados mudam constantemente;Os requisitos vo mudar!

  • Por que ela ainda no um padro amplamente utilizado pelo mercado?Contra-Produtiva e Contra-Intuitiva primeira vista (Como assim criar um teste de uma classe que ainda no existe?!);Desenvolvedores no gostam de criar testes unitrios, pois so chatos;Falta de tempo e recursos (cronogramas apertados e poucos recursos);Resistncia mudanas;Desconhecimento por parte de Gerentes e Desenvolvedores;Desenvolvimento gil ainda visto com desconfiana e como sem controle;

  • TDD - O que ?Prtica que foi originada nas rodas de desenvolvedores SmallTalk;Amplamente utilizada em metodologias geis como o XP (eXtreme Programming) e o Scrum;Prtica para Desenvolvimento de Software que prega que todo e qualquer desenvolvimento deva ser precedido da criao de uma sute de testes e que toda duplicao de cdigo deve ser eliminada;Testes so desenvolvidos na mesma linguagem de programao do sistema em desenvolvimento;Testes quando criados podem at mesmo no compilar, neste momento eles no necessitam compilar;A nica regra que os testes sejam criados antes da implementao das funcionalidades do sistema;

  • TDD - BenefciosMelhora na interface das classes da aplicao;Maior desacoplamento das classes ;Aumento na Produtividade;Aumento da confiana pelo desenvolvedor em fazer alteraes;Possibilidade de fazer Refactor (Refatorao de cdigo);Cobertura de cenrios da aplicao;Possibilidade de auto documentao a partir da Suite de Testes;Flexibilidade maior facilidade em abraar s mudanas nos requisitos;Deploy simplificado garantia de uma verso estvel a todo o momento, pronta para subir para a homologao ou produo;

  • TDD O que no ?Ferramenta de teste;A Resoluo de todos os problemas no desenvolvimento de sistemas;Padres de Projeto (Design Patterns);

  • Mitos sobre o TDDTest-Driven Development != QATest-Driven Development != Testes UnitriosTest-Driven Development != Design Patterns

  • Prtica do TDD0.Setup (somente executado uma vez no ciclo de vida do projeto);Red Criar um teste que falhe (eliminar falsos positivos);Green Criar a implementao mais simples possvel que faa o teste passar;Refactor! Refatorar a implementao, melhorando-a de modo incremental e controlada, fazendo com que o cdigo comunique melhor o seu intento, eliminando duplicidades no cdigo, fazendo as alteraes arquiteturais (se estas se mostrarem necessrias) e executando os testes a cada alterao por menor que esta seja;

  • E caso algum teste tenha falhado?Desfazer as ltimas alteraes, e refazer a funcionalidade de modo a no quebrar as funcionalidades construdas previamente;O ideal que a aplicao no seja quebrada (testes em vermelho) por mais do que poucos minutos;Passos curtos, incrementais e controlados;

  • Encontrei um bug, e agora?Criar um teste que exponha este cenrio descoberto, realizar a prtica do TDD (Red Green Refactor!), assim como qualquer outro teste previamente planejado;No longo prazo com a utilizao desta prtica teremos um produto cada vez melhor com uma quantidade maior de cenrios cobertos, menos retrabalho e um nmero menor de bugs;

  • Tudo Verde! Done!Aps a criao da sua Sute de testes e a implementao do cdigo que faz com que todos estes testes passem (assim como os testes para resoluo de bugs), ou seja, tudo est verde, podemos concluir que o trabalho foi terminado para a iterao corrente;

  • Dificuldades na implantao do TDD na EmpresaInvestimento em treinamento;Grande barreiras culturais na empresa;Quebra de paradigma muito forte, pois pem em cheque conceitos maduros na rea de Desenvolvimento de Software (considerados como verdades absolutas);

  • O que isto tem a ver com voc?Mais e mais empresas esto abraando a idia de metodologias de desenvolvimento geis como XP e SCRUM;Demanda por profissionais que conheam e j se utilizem destas metodologias e prticas deve crescer ao longo dos prximos anos;Desenvolvedores e empresas que abraarem a mudana e assumirem que os requisitos vo mudar e que a maneira como estamos gerenciando os nossos projetos no produtiva, certamente se beneficiaro mais e estaro na ponta quando o mercado como um todo fizer a transio;Eu estarei l. E voc?

  • GlossrioTDD Test-Driven Development Desenvolvimento Dirigido a Testes.QA Quality Assurance Garantia da Qualidade. XP eXtreme Programming Programao Extrema uma metodologia gil de desenvolvimento de software gil, criada por Kent Beck.SCRUM uma metodologia de gerenciamento de projetos, cujo nome vem de uma jogada do esporte rugby, em que os jogadores de cada time se encaixam formando uma espcie de muralha e onde outro jogador joga a bola no meio do tnel formado para que os dois grupos a disputem. Assim como em todas as metodologias geis o trabalho em equipe fundamental.

  • Soluo Criao de uma classe de Pilha StackProblema:Criar uma classe que represente uma pilha ilimitada em memria e que o acesso seja restrito ao ltimo elemento inserido na pilha;

  • Criar a Test List para a PilhaAnalisando o requisito passado (Stack), foram observados os seguintes testes iniciais:Criar uma pilha e verificar que est vazia;Inserir um objeto na Pilha e verificar que no est vazia;Inserir um objeto na Pilha , retirar este, e verificar que est vazia;Inserir um objeto na Pilha (guardando o seu valor), retirar este da Pilha e verificar que estes so iguais;Inserir 3 objetos em sequncia (guardando seus valores), e remov-los verificando se estes so removidos na ordem correta;Retirar um elemento de uma Pilha sem elementos;Inserir um objeto na Pilha, buscar quem o topo da Pilha e verificar que a Pilha no est vazia;Inserir um objeto na Pilha (guardando o seu valor), buscar quem o topo da Pilha e verificar que estes so iguais;Buscar o topo de uma Pilha vazia;

  • Anlise da TestListAnalisando a TestList vemos que existem 3 operaes e uma propriedade que podem ser executadas na Pilha:Push(Object) (inserir um item na pilha);Pop() (remover um item da pilha, retonando-o);Top() (retornar o primeiro elemento sem retir-lo da pilha);IsEmpty (retorna um booleano indicando se a pilha est vazia);

  • Setup (executado somente uma vez)Baixar do site http://www.nunit.org, o programa msi instalador;Executar o programa de instalao do Nunit;Criar um projeto de testes para a classe a ser criada Stack;Referenciar a dll do framework de testes Nunit (Nunit.Framework.dll) no projeto de testes;Referenciar o projeto da classe a ser testada;Fazer deste projeto, o projeto inicial da Soluo;Configurar a inicializao automtica do programa Nunit.exe (interface visual dos testes unitrios) na compilao do Projeto de Testes;

  • Teste 1O primeiro teste escolhido foi verificar se uma pilha nova est vazia:// StackTests .cs using System;using NUnit.Framework;[TestFixture]public class StackTests{[Test]public void Empty(){Stack stack = new Stack();Assert.IsTrue(stack.IsEmpty);}}Executar a soluo;Erros de compilao (Stack no existe);

  • Teste 1 (Red): Implementar o menor cdigo que faa o teste compilar// Stack.csusing System;public class Stack{public Boolean IsEmpty{ get { return false; }}}Executar a soluo;Soluo compilada com sucesso;Teste Empty falha (Red);

  • Teste 1 (Green): Fazer o teste passar com a mais simples implementao// Stack.csusing System;public class Stack{public Boolean IsEmpty{ get { return true; }}}Executar a soluo;Soluo compilada com sucesso;Teste Empty executado com sucesso;

  • Teste 1 (Refactor!): Melhorar a implementao// Stack.csusing System;public class Stack{public Stack(){ this. _isEmpty = true; }private Boolean _isEmpty;public Boolean IsEmpty{ get { return this._isEmpty; }}}Executar a soluo;Soluo compilada com sucesso;Teste Empty continua executando com sucesso;

  • Teste 2O segundo teste escolhido foi verificar se ao adicionar um elemento a pilha no est vazia:// StackTests .cs [Test]public void PushOne(){Stack stack = new Stack();stack.Push(primeiro elemento);Assert.IsFalse(stack.IsEmpty, Aps a incluso, IsEmpty deve ser false.);}Executar a soluo;Erros de compilao (Stack no possui o mtodo Push(Object));

  • Teste 2 (Red): Implementar o menor cdigo que faa o teste compilar// Stack.csusing System;public class Stack{public Stack(){ this._isEmpty = true; }private Boolean _isEmpty;public Boolean IsEmpty{ get { return this._isEmpty; }}public void Push(Object element_){}}Executar a soluo;Soluo compilada com sucesso;Teste PushOne falha (Red);

  • Teste 2 (Green): Fazer o teste passar com a mais simples implementao// Stack.csusing System;public class Stack{public Stack(){ this._isEmpty = true; }private Boolean _isEmpty;public Boolean IsEmpty{ get { return this._isEmpty; }}public void Push(Object element_){ this._isEmpty = false;}}Executar a soluo;Soluo compilada com sucesso;Teste PushOne executado com sucesso;

  • Teste 2 (Refactor!): Melhorar a implementao// StackTests .cs using System;using NUnit.Framework;[TestFixture]p