Test-Driven Development: uma visão prática

Slides:



Advertisements
Apresentações semelhantes
Desenvolvimento de Plug-ins Orientado a Testes
Advertisements

Metodologia de testes Nome: Gustavo G. Quintão
Natanael (njsj) Thiago (tan2) Rodrigo (rml2)
Fundamentos de Engenharia de SW
Débora da Silva Orientadora: Maria Inés Castiñeira
Engenharia de Software
Prototipação de Software
Projeto conceitual Mostra ao cliente exatamente o que o sistema fará
Análise e Projeto de Sistemas I
Tópicos Motivação para teste Por que algumas empresas não testam
Rational Unified Process(RUP)
Gestão de Projetos Áreas de conhecimentos Integração
Faculdade de Ciências Sociais e Aplicadas de Petrolina – FACAPE
RUP Rational Unified Process (Processo Unificado de Desenvolvimento da Rational) 1.
Adélia Barros Requisitos Adélia Barros
Processo Desenvolvimento de Software Tradicional
TSDD Teste de segurança durante o desenvolvimento.
Gestão de Defeitos Vanilson Burégio.
Este treinamento foi desenvolvido para facilitar o ‘Tratamento das Irregularidades do Ponto’, com total segurança e privacidade das informações, através.
Test-Driven Development
Linguagem Técnica II Testes Automatizados Aula 04 Prof
Técnicas de Construção de Programas Trabalho Final: Sistema de Votação para o Colegiado do Depto. de Informática Aplicada do Instituto de Informática.
Engenharia de Software
Visão Geral PRO.NET.
Fundamentos de Engenharia de SW
Programação Avançada Prof. Natalia Castro Fernandes
O Fluxo de Implementação
Processo Praxis – Fase de Concepção
Projeto: Capacitação em GP
IEEE Std IEEE Melhores Práticas para Especificações de Requisitos de Software (ERS)
Gerenciamento da Integração
Test Driven Development Nazareno Andrade Baseado no material do prof. Hyggo Almeida.
Test Driven Development por Johann Gomes e Thaís Moura.
Utilizando Testes Unitários Gleibson Rodrigo “dartanham” Fontes: antiga apresentação de testes da disciplina de ESS e na curso de testes do PDesigner.
Um Framework Para Testes
Engenharia de Software
Processo de Desenvolvimento de Software
Análise e Desenvolvimento de Software
1 Test Driven Development John Jonathan da Silva /
METODOLOGIAS ÁGEIS TESTES UNITÁRIOS.
O Processo de desenvolvimento de software
Análise e Projeto Orientados a Objetos
Teste de Software Conceitos iniciais.
Engenharia de Software
Gestão de defeitos.
Automação de Testes de Software
dotProject EAP – dP EAP Jose Nome Matrícula Filipe Barbosa de Almeida
Sistema de Gerenciamento de uma Fábrica de Bebidas
Decisão #1 Decisão-chaveUtilização de C para desenvolvimento do MCTCore. DriversRNF: O código deve ser escrito na linguagem C. Descrição O sistema legado.
Engenharia de Software
Engenharia de Requisitos
Backlog Lílian.
Programação Pragmática Carla Maria Pinheiro. 05/11/2004 Tópicos Avançados Engenharia de Software 3 Agenda O que é Programação Pragmática? Programador.
Engenharia de Software
Aula 02 de Eng. de Requisitos
J U nit Um Framework Para Testes. Motivação  Todos os programadores sabem que devem testar seu código  Quanto mais curto o prazo menos testes são realizados.
APSI II Análise e Projeto de Sistemas de Banco de Dados II.
Apresentação Leonardo Brussolo de Paula
GERÊNCIA DE REQUISITOS Engenharia de Requisitos Departamento de Informática Pontifícia universidade Católica do Rio de Janeiro (PUC-Rio) Joanna.
1 Projeto Piloto Conclusão em Agenda Projeto Piloto –Descrição –Execução da aplicação –Implementação de requisitos funcionais e não- funcionais.
Mail++.  Objetivo ◦ Adicionar novas funcionalidades a um servidor de  Servidor de JES ◦ Implementado em Java ◦ Apenas funcionalidades.
Processos de Software Ludimila Monjardim Casagrande 1º Semestre Desenvolvimento e Qualidade.
SIACWeb Estrutura dos WebServices Junho, SIACWeb – Momentos previstos em pauta 09:20 1. Expor os ws criados; 2. documentação dos ws (padrões utilizados);
Web Application Rafael Muniz e Marcus Vinícius Plugins MAVEN 04/04/2009 Revisão 12/04/2009.
Guia de Referência para Fornecedores Visão Fornecedor.
Plano de Ensino, Recados Importantes & Exercícios Curso Hands-on de Gestão de Projetos Eduardo Montes, PMP.
Testes de Unidade. 2 Pauta Testes de Unidade; Testes de Unidade; Desenvolvimento orientado a testes; Desenvolvimento orientado a testes; Testes unitários.
Pandora FMS Leandro Ferreira Canhada
Padronização e Melhoria
Workshop Agile tdd - Test Driven development
Transcrição da apresentação:

Test-Driven Development: uma visão prática Leonardo Barros, M.Sc.

O que é TDD? Test-Driven Development: Desenvolvimento Guiado por Testes Os testes são feitos ANTES da implementação, diferentemente da abordagem tradicional, em que os testes são feitos DEPOIS da implementação (*) A autoria é comumente creditada a Kent Beck, embora o conceito não seja de todo original Referências: Beck, K. Test-Driven Development by Example, Addison Wesley, 2003 Link, J. Unit Testing in Java: How Tests Drive the Code, Morgan Kaufmann, 2003 (*) No TDD, não é obrigatório que todos os testes precisem ser criados antes da implementação

Premissas do TDD Os testes são definidos em função dos requisitos A implementação é definida em função dos testes Cada acréscimo funcional precisa ser justificado por um teste (*) Busque sempre a implementação mais simples que atenda ao teste Se você acha que faltou algo no código, escreva mais um teste que justifique a complementação (*) Em geral, não é boa prática testar questões de layout, como posicionamento ou cores

O Processo do TDD (exemplo com um método simples) Criar uma implementação vazia do método (“casca”) Criar um teste para mapear um ou mais requisitos (é recomendável começar simples) Rodar o novo teste, para confirmar que este mapeia o(s) requisito(s) (Red Bar) Implementar a solução mais simples que faça todos os testes rodarem Rodar os testes para verificar a implementação (Green Bar) Simplificar a implementação, se possível (Refactoring) Repetir os passos 2 a 5 até atender a todos os requisitos

Exemplo de TDD com um método simples

Especificação do método /** * Emite um relatório (array de Strings), indicando quantas vezes cada palavra * aparece no array fornecido. O relatório é apresentado na mesma ordem dos dados * de entrada, sendo que cada String representa uma palavra e seu número de * ocorrências. Por exemplo, para a chamada: * * countWords(new String[] {"java","in","out","java","java","out"}) * o relatório gerado é: * ["java - 3" , "in - 1", "out - 2"] * @param words array com as palavras a serem contadas. * @return relatório com o cada palavra e o número de repetições. */ String[] countWords(String[] words) { //… } Mostrar a classe WordProcessor Copiar o primeiro teste, rodar, copiar solução, rodar; repetir até o 4o teste

Requisito(s) atendido(s)? SIM O método está robusto? NÃO Revisando o método Requisito(s) atendido(s)? SIM O método está robusto? NÃO Próximos passos: construir mais testes para mapear aspectos não cobertos Copiar o teste nullParameter

Revisando o processo Pontos negativos Desenvolvimento é mais lento Mudança de hábito (inicialmente) Quem cria os testes é o desenvolvedor, portanto ambos os testes e o código de produção podem ter os mesmos erros conceituais A barra verde pode levar a uma falsa sensação de segurança e fazer com que a equipe relaxe nos testes de integração e funcionais

Revisando o processo (cont.) Pontos positivos O desenvolvedor pode resolver o problema aos poucos, aspecto a aspecto Testes facilitam o entendimento/documentam dos requisitos Bugs são percebidos mais cedo É mais fácil identificar a causa A correção é menos custosa O aprendizado é melhor Garante uma boa base de testes A arquitetura tende a apresentar baixo nível de acoplamento O código é, naturalmente, facilmente testável Consequentemente… Refactorings são menos arriscados

“Nova versão” Novo requisito: case-insensitive Basta criar novo teste Mudança no requisito: deve-se ordenar do maior para o menor, com os números na frente Deve-se primeiro ajustar os testes, para em seguida ajustar a implementação Se encontrar uma solução geral for complicado, comente os testes e vá progressivamente restabelecendo-os Refactoring - Testes caseInsensitive

Análise Abordagem Tradicional Implementação primeiro, testar depois o que foi feito Muitos bugs só são encontrados quando o desenvolvimento já foi encerrado Em caso de erros nas estimativas / pressão entrega, testes são prejudicados Se houver poucos testes, refactorings são arriscados Tendência a tornar o código “genérico” (mais complexo do que necessário) para evitar refactorings

Riscos/Dificuldades do uso de TDD Resistência da equipe (mudança de cultura) Negociação do prazo com o cliente Estimativas / Acompanhamento do desenvolvimento

Potenciais benefícios do uso de TDD Maior facilidade de evolução do projeto Mudanças/novos requisitos são menos ameaçadores Código é mais simples Rotatividade causa menos impacto Testes cobrem/documentam as principais funcionalidades Código é mais legível

JUnit é muito bom, mas… Não basta! Em uma arquitetura cliente-servidor, posso utilizar o JUnit para testar a construção dos métodos do servidor (testes unitários), mas e a interface gráfica do cliente? Como faço testes funcionais?

Você precisa de boas ferramentas! TDD é um processo teoricamente possível de ser realizado sem ferramentas - na prática, é inviável Existem diversas ferramentas que auxiliam em cada caso (embora não haja “balas de prata”)

Exemplo de ferramenta: FEST-Swing Focada em testes realizados sobre uma interface gráfica Swing (Java) Um dos módulos de uma coleção de APIs criada para simplificar o processo de teste Referência: http://fest.easytesting.org/swing/wiki/pmwiki.php

Análise da ferramenta Pontos fortes Pontos fracos Open Source (licença Apache 2.0) Uso bastante intuitivo Extensível Testes são escritos na mesma linguagem da implementação (Java) Comunidade bastante ativa Pontos fracos Documentação pobre Jovem (início em meados de 2007)

Exemplo de TDD com uma janela Swing

Especificação da janela (Login) Deve conter pares rótulo/campo para conta e senha Deve conter um botão “Entrar” que irá validar o login e exibir uma mensagem de “bem vindo ao sistema” Em caso de conta ou senha errada, deve exibir uma mensagem “login inválido” ao usuário

E os problemas do “Mundo Real”? Até aqui tudo bem, mas… E os problemas do “Mundo Real”? Interfaces Gráficas Arquitetura Cliente-Servidor Banco de Dados etc

Exemplo de TDD mais realista

Modelo de trabalho proposto (Desenvolvimento) Definição de requisitos Prototipação Testes de Aceitação iniciais (automatizar se possível) Definição Arquitetura inicial Testes Funcionais iniciais (automatizar se possível) Desenvolvimento Definição interfaces Testes unitários Implementação Testes de Interação

Modelo de trabalho proposto (Correção de bugs) Reprodução manual do problema Implementação de teste automático (ou manual, se o custo for muito alto) Executar teste para garantir que o problema é capturado Corrigir problema Executar teste para garantir que o problema foi resolvido

Modelo de trabalho proposto (Refactorings em código sem testes) Levantamento dos requisitos da interface Implementação de testes automáticos (ou manuais, se o custo for muito alto) Ler o código atual para garantir que todos os aspectos foram tratados (se necessário, escrever mais testes) Rodar testes para garantir que estão corretos Reimplementar o método aos poucos, implementando a solução mais simples para cada teste

FIM... ou o início?