Desenvolvimento orientado por testes, padrões de testes e JWebUnit

Documentos relacionados
Test-driven Development

Testes Automatizados. Cursos de Verão 2007 IME/USP Dairton Bassi & Paulo Cheque

Dificuldades na implantação de Métodos Ágeis

TEST DRIVEN DEVELOPMENT. Prof. Bruno Henrique Pachulski

Dificuldades na implantação de Métodos Ágeis

Desenvolvendo aplicações de qualidade com TDD

ENGENHARIA DE SOFTWARE

Teste de software. Engenharia de software Profª karine sato da silva

October 13, 2016 Web.br hugeinc.com

Estratégias de Escrita de Testes Automatizados

JUnit. Facilitando o desenvolvimento e execução de testes unitários em código java. Peterson Rodrigues

Programação Orientada a Objetos

Community. .com. Introdução ao T D

Programação Extrema na Prática

Princípios em refatoração. Prof. André Luiz Peron Martins Lanna

Teste Unitários com NUnit. Anderson Martiniano da Rocha

TESTES DE SOFTWARE 1. Fundamentos sobre testes de software

Refatoração: Melhorando a Qualidade de Código Pré-Existente. Cursos de Verão 2009 IME/USP Mariana Bravo & Hugo Corbucci

Python Sistemas legados, qualidade de código e bad smells Gisele Zomer Rossi

Refatoração: uma introdução. Prof. André Luiz Peron Martins Lanna

Refatoração: Melhorando a Qualidade de Código Pré-Existente. Cursos de Verão 2008 IME/USP Mariana Bravo & Hugo Corbucci

Teste de Software. Roberta Coelho

INTRODUÇÃO A ENGENHARIA DE SOFTWARE

Testes de Unidade. Curso de Verão IME/USP Hugo Corbucci

Análise e Projeto Orientados a Objetos

Tabelas Hash Endereçamento Direto

Princípios e práticas de extremme Programming

ENGENHARIA DE SOFTWARE O QUE SÃO TESTES? TESTES TESTES TESTES 26/08/2014. São pontuais; São previsíveis; São finitos;

03/10/14. Testes. Testar Depurar. Técnicas básicas. Exemplo: Teste o código em seus limites. Simplificando

Extreme Programming. Projeto de. Desenvolvimento. Software. Prof.: Ari Oliveira

J820. Mock objects. Testes de código com dependências. argonavis.com.br. Helder da Rocha

Extreme Programming: Valores e Práticas

Engenharia de Software

Uma introdução a Domain Driven Design. Daniel Cukier IME-USP

A Evolução de XP segundo Kent Beck Parte 1

Estágio II. Aula 04 Testes Ágeis. Prof. MSc. Fred Viana

Introdução a Teste de Software

Campus Capivari Análise e Desenvolvimento de Sistemas (ADS) Prof. André Luís Belini /

1. A função DevOps, que se concentra principalmente em Produtos & Serviços:

ERROS COMUNS EM TEST-DRIVEN DEVELOPMENT. Mauricio

Desenvolvimento ágil de software

Introdução à Programação extrema (XP)

BCC Engenharia de Software Professor Rodrigo Andrade

Testar: impossível. Jorge Diz Globalcode. Agile Brazil 2010 Slide 1

Disciplina: Engenharia de Software. 3 Bimestre Aula 2: EVOLUÇÃO DE SOFTWARE

Computação II Orientação a Objetos

Código Limpo. Curso de Verão IME/USP Hugo Corbucci

Teste Automatizado POO. Prof. Marcio Delamaro

PROJETO EM SISTEMAS DE INFORMAÇÃO. Unidade I - Metodologia de desenvolvimento a ser adotada. Luiz Leão

Refatoração: Melhorando código existente

O papel do QA (Testador) em um time Ágil. #caipiraagil2017

Desenvolvimento de Software de Qualidade através de Testes Automatizados

SSC 0721 Teste e Validação de Software

Desenvolvimento Ágil de Software. Prof. Edjandir Corrêa Costa

p Imagine que um Sistema de Controle do Banco pode ser acessado, além dos Gerentes, pelos Diretores do Banco

Revisitando as práticas de engenharia ágil. Danilo

Evolução de Software e Refatoração. Ian Sommerville 2006 Engenharia de Software, 8ª. edição. Capítulo 21 1

MANIFESTO ÁGIL, SCRUM E EXTREME PROGRAMMING COMO CONSTRUIR SOFTWARE COM QUALIDADE E QUE AGREGAM VALOR AO CLIENTE?

- 8ª Lista de Exercícios -

Engenharia de Software

Modulo II Técnicas para desenvolvimento de Software Ágil

2. Quais dos seguintes testes não é um teste do tipo funcional?

JAVA. Tópicos Especiais de Programação Orientada a Objetos. sexta-feira, 26 de outubro de 12

Padrões de Testes Automatizados

Cassio Greco. Fundador da Conta Simples

OO - Orientação a Objetos

Programação Orientada a Objetos

Collections Framework

JUnit: framework de testes unitários. Fred Lopes

Capítulo 8 Teste de Software 1

Teste de Software. Competência: Entender as técnicas e estratégias de testes de Software

Desenvolvimento de Software de Qualidade através de Testes Automatizados

PROCESSO DE DESENVOLVIMENTO DE SOFTWARE

Engenharia de Software II

Interfaces POO. Prof. Marcio Delamaro

Teste de Software. Proj. Desenvolvimento de Software. Prof. Cleverton Hentz. 30 de agosto de Material Apresentado

Testes com JUnit. Treinamento ALESP SPL. Danilo Toshiaki Sato.

Introdução a Testes Automatizados

Pré-requisitos: Conhecimentos de informática gerencial e lógica de programação.

UM POUCO DO NOSSO TRABALHO. Desenvolvimento de produtos digitais

Testes com objetos mock. Curso de Tecnologia em Análise e Desenvolvimento de Sistemas Análise e Projeto Orientados a Objetos

UNIVERSIDADE ESTADUAL DE PONTA GROSSA SETOR DE CIÊNCIAS AGRÁRIAS E DE TECNOLOGIA DEPARTAMENTO DE INFORMÁTICA

Uma avaliação da abordagem TDD (Test Driven Development) em uma empresa desenvolvedora de software madura

Introdução. Conteúdo. Usabilidade. Engenharia de software X Usabilidade. Benefícios. Introdução. Introdução. Introdução. Introdução.

Engenharia de Software Aula 21. Revisão da Prova 2. Eduardo Figueiredo.

Engenharia de Software

Como criar um menu pop-up no Dreamweaver

Introdução aos Testes de Software

Computação II Orientação a Objetos

Introdução 27/9/2005. Prof.: Clarindo Isaías Pereira da Silva e Pádua Departamento de Ciência da Computação UFMG Gestus. Usabilidade.

Estágio II. Aula 01 Qualidade de Software. Prof. MSc. Fred Viana

... 5) também não consigo compreender porque muita gente mete o pau no delphi sem conhece-lo de verdade

Métodos Ágeis e Programação Extrema (XP)

Análise e Projeto Orientados a Objetos

Desenvolvimento Dirigido por Testes (TDD)

Teste de Software. Professor Maurício Archanjo Nunes Coelho

Sumário. Parte I Fundamentos Capítulo 1 O Problema de Entregar Software... 3

PROGRAMAÇÃO EXTREMA - XP

Instituto Federal de Educação, Ciência e Tecnologia da Bahia Campus Irecê Disciplina: Linguagem Técnica II Prof o Jonatas Bastos

Transcrição:

Desenvolvimento orientado por testes, padrões de testes e JWebUnit ou por que você quer fazer isso mas sempre deixa pro final? Copyleft -- Alexandre Freire

Por que testar? Precisamos saber se o software funciona Todo software (minimamente razoável) é testado Testes manuais aumentam as chances de falhas Testar as mudanças não é equivalente a ter testes

Ciclo vicioso do teste manual Quanto mais stress, menos você testa! Quanto menos você testa, mais erros ira cometer. Quanto mais erros você comete, mais stress Goto 1

Xp e metodologias ágeis Entre as práticas se introduz o costume de escrever testes automatizados Os testes são escritos preferêncialmente antes do próprio código Mesmo dependendo de outras práticas, ter testes é quase sempre benéfico como uma prática isolada

Ciclo dos testes automatizados Quanto mais stress, rode os testes mais vezes. Rodar os testes diminui o stress, diminuindo o número de erros cometidos. O que reduz ainda mais o stress! Os testes transformam medo em tédio.

O Objetivo do desenvolvimento orientado a testes Código limpo, que funciona! É uma maneira previsível de desenvolver. Você sabe quando acabou aquilo que tinha que fazer. Não precisa se preocupar (tanto) com bugs.

Vamos por partes Primeiro, cuide do que funciona. Depois, cuide do código limpo. Mantra do TDD: Vermelho Verde Refatorar para eliminar duplicação (consequentemente dirigindo o design organicamente)

Orientando o desenvolvimento com testes Código cresce a partir da criação de testes. Você realiza pequenas mudanças (podem ser feias). Roda os testes (todos) frequentemente. Refatore em pequenos passos para melhorar o código.

Coragem! A existência dos testes da coragem aos desenvolvedores Sabemos se o software esta funcionando como devia Adicionamos novas funcionalidades sem medo de criar bugs (se acontecer, seremos avisados!)

Quais tipos de testes? Estamos falando de testes de unidade, que nos ajudam a desenvolver o software. Outros tipos de testes: Performance Stress Usabilidade Aceitação

Como sei que os testes são bons Você testou toda lógica de negócios do seu software? Existem ferramentas que verificam a cobertura dos testes (http://quilt.sourceforge.net/) Inserção de defeitos Ao inserir defeitos no seu código propossitalmente, os testes devem falhar! Existem ferramentas que fazem isso também (http://jester.sourceforge.net/)

2 regras simples para testar direito Só escreva código de negócio quando um teste falhou Elimine qualquer duplicação encontrada

Essas regras criam comportamentos complexos Design orgânico, orientado por código que roda! Escreva seus próprios testes, não dá para ficar esperando outros escreverem os testes pra você O seu ambiente tem que suportar feedback veloz Para ser fácil de testar, o seu design tem que ser composto de objetos altamente coesos e com baixo acoplamento

Testes de unidade bons Rodam rápido (e rodar todos testes deve demorar no máximo 10 minutos) Rodam isolados (você deve poder rodá-los em qualquer ordem) Usam dados que sejam fáceis de ler e entender Usam dados reais quando necessário (cópia de dados de produção) Representam um passo em direção ao seu objetivo geral

Ótimo, mas o que testar? Faça uma lista (ao programar novas idéias vão surgir, coloque-as no fim da lista, ou até mesmo em uma outra lista) Coloque na lista exemplos de todas operações que você sabe que vai implementar Coloque a versão nula dessas operações na lista Liste as refatorações que você acha que terá de fazer para ter código limpo no final.

e quando testar? Teste primeiro Você não vai testar depois, admita isso. Quando escrever as asserções? Escreva as asserções primeiro! Qual é a resposta certa? Como vou verificar isso?

Exemplo de asserções primeiro Vamos testar comunicação via socket com outro sistema. Qual a resposta certa? Depois de tudo o socket deveria estar fechado e eu devo ter conseguido ler a string foobar

testtransacaocompleta(){ } asserttrue(socket.isclosed()); assertequals( foobar, resposta.tostring());

De onde vem a resposta? testtransacaocompleta(){ } Buffer resposta = socket.contents(); asserttrue(socket.isclosed()); assertequals( foobar, resposta.tostring());

De onde vem o socket? testtransacaocompleta(){ } Socket socket = new Socket( localhost, portadefault()); Buffer resposta = socket.contents(); asserttrue(socket.isclosed()); assertequals( foobar, resposta.tostring());

E o servidor? testtransacaocompleta(){ Server fooba = new Server(portaDefault, foobar ); Socket socket = new Socket( localhost, portadefault()); Buffer resposta = socket.contents(); asserttrue(socket.isclosed()); assertequals( foobar, resposta.tostring()); }

Teste dados, dados evidentes Não espalhe dados por ai. Nunca use a mesma constante para mais de uma coisa Se não existe diferença conceitual entre 1 e 2, use o 1. Nunca teste 2+2, prefira testar 2+3

Demonstre a intenção dos dados Banco b = new Banco(); b.adicionacambio( $, R$, TAXA_DOLAR); b.comissao(comissao_padrao); Dinheiro saldo = banco.converte(new Nota(100, $ ), R$ ); assertequals(new Nota(278.54, R$ ), saldo);

Demonstre a intenção dos dados Banco b = new Banco(); b.adicionacambio( $, R$, 2.7); b.comissao(0.01); Dinheiro saldo = banco.converte(new Nota(100, $ ), R$ ); assertequals(new Nota(100 / 2.7 * (1-0.01), R$ ), saldo);

Com qual teste começar? (Red bar patterns) Comece com uma operação nula Começar com um teste realístico dá muito mais trabalho Testes com entrada igual a saída A entrada deve ser a menor possível Redutor r = new Redutor(new Poligono()); assertequals(0, r.resultado().pontos());

E para continuar Use e abuse de testes como documentação Testes de aprendizado (quando for usar uma nova API por exemplo) Novas idéias entram na lista como novos testes Testes de regressão - se algo falha, escreva o teste!

Padrões para código que funciona (Green bar patterns) Ok, você escreveu o teste e ele falha, e agora? Faça o teste rodar, 3 técnicas boas: fake it Triangularização Implementação óbvia

Fake it ( til you make it) Retorne uma constante Gradualmente transforme a constante em expressões usando variáveis Ter algo rodando é melhor do que nada Limpe o código imediatamente

Exemplo de fake it assertequals(new Data( 5/12/2004 ), new Data( 6/12/2004 ).ontem()); Data: public Data ontem(){ } return new Data( 5/12/2004 ); Duplicação!

Exemplo de fake it Data: public Data ontem(){ } return new Data(new Data( 6/12/2004 ).dias() -1); Ainda duplicado!

Exemplo de fake it Data: public Data ontem(){ } return new Data(this.dias() -1); No meu teste, this = 6/12/2004!

Triangularização Abstrair somente quando você tem dois ou mais exemplos assertequals(4, soma(3,1)); soma(int a, int b){ } retorna 4;

Triangularização assertequals(4, soma(3,1)); assertequals(7, soma(3,4)); soma(int a, int b){ } retorna a + b;

Implementação óbvia Quando é óbvio, implemente a solução óbivia! Não é óbvio?

Padrões de testes ChildTest Testes grandes são divididos em testes menores, trabalhe no teste menor, depois retorne ao teste grande MockObject Use implementações vazias quando você depende de objetos caros ou complexos

+ padrões de testes Self shunt Use o próprio teste como MockObject (implementando alguma interface) LogString Use uma string para logar chamadas a métodos e verifique o conteudo da String no final CrashTestDummy Subclasses para testar casos de erro

Testes de interface Não são impossíveis JWebUnit para testar interfaces HTML em Java assertlinkpresent( link"); clicklink( link"); assertformpresent( form"); setformelement("field1", "value1"); submit();

Exemplos de JWebUnit Direto da fonte