Exemplo de desenvolvimento com testes Prof. Dr. Alfredo Goldman Departamento de Ciência da Computação IME / USP 3 de Abril de 2003 VI Semana da Computação.

Slides:



Advertisements
Similar presentations
VHDL Coding Style MO801/MC912.
Advertisements

JUnit Tutorial Hong Qing Yu Nov JUnit Tutorial The testing problems The framework of JUnit A case study JUnit tool Practices.
Java Testing Tools. junit is a testing harness for unit testing. emma is a code coverage tool. The tools can be used in concert to provide statement and.
ESCALONAMENTO DE TAREFAS
No outono de 1982, nos EUA iniciou-se o Marriage Ministries lnternational, através do casal Mike e Marilyn Phillipps, que, depois de se reconciliarem,
J-Unit Framework.
Exercício de Interfaces O código terá erro de compilação ou executará normalmente?
Objectives: Test Options JUnit Testing Framework TestRunners Test Cases and Test Suites Test Fixtures JUnit.
3. A Testing Framework. © O. Nierstrasz P2 — A Testing Framework 3.2 A Testing Framework Overview  What is a framework?  What is an Annotation?  JUnit.
Componentes de Software Resumido e Adaptado dos apontamentos do Prof. José Tavares (Ambientes de Desenvolvimento Avaçados)
3. A Testing Framework. © O. Nierstrasz P2 — A Testing Framework 3.2 A Testing Framework Overview  What is a framework?  JUnit — a simple testing framework.
3. A Testing Framework. © O. Nierstrasz P2 — A Testing Framework 3.2 A Testing Framework Sources  JUnit documentation (from
JUnit Introduction and Advanced Features. Topics Covered  Junit Introduction  Fixtures  Test Suites  Currency Example.
FEP 114 – Aula 3b. Objetivo: Determinar o intervalo de temperatura em que os calorímetros utilizados podem ser considerados ideais. Determinar o calor.
Administração 2°semestre - Aula 2 Classificação dos Sistemas de Informação.
DABPMaio 2009 Cálculo de uma poligonal Universidade do Algarve Instituto Superior de Engenharia Licenciatura em Engenharia Topográfica Disciplina de Topografia.
Luiz Carlos d´Oleron SJCP Java Avançado Conceitos de aplicações que acessam banco de dados.
3. A Testing Framework. © O. Nierstrasz P2 — A Testing Framework 3.2 A Testing Framework Sources  JUnit 4.0 documentation (from
Algoritmos de Busca Heurísticos. Sumario Heurísticos –Best-first –Greedy best-first –A * –Algoritmos de Busca local –Hill-climbing Metaheuristicos –Simulated.
1 Até aqui a nossa discussão dos fenómenos eléctricos concentraram-se em cargas em repouso CORRENTE ELÉCTRICA Consideraremos agora as situações que envolvem.
Conceitos Fundamentais: da Moral à Bioética José Roberto Goldim.
Semáforos Plataforma Java 1.5 Juliano Cardoso Vacaro.
Arquitectura Tecnológica dos Sistemas de Informação Enterprise Architecture Validation Pedro da Silva - Nº João Jesus – Nº Nuno Dias – Nº
1 CSC/ECE 517 Fall 2010 Lec. 2 Overview of Eclipse Lectures 1.Overview 2.Installing and Running 3.Building and Running Java Classes 4.Debugging 5.Testing.
Unit Testing Discussion C. Unit Test ● public Method is smallest unit of code ● Input/output transformation ● Test if the method does what it claims ●
A Unit Testing Framework: JUnit COMP 302 Software Engineering Koc University, Istanbul.
JUnitTest Infected: Programmers Love Writing Tests A little test, a little code, a little test, a little code…
The Design of JUnit Yonglei Tao. Test-First Development  An essential element in eXtreme Programming (XP)  Test is written before the code  As an executable.
Learning JUnit for Unit Testing JUnit Tutorial Dr. Robert L. Probert S.I.T.E., University of Ottawa Sept
JUnit The framework. Goal of the presentation showing the design and construction of JUnit, a piece of software with proven value.
1 Code Quality, Maintainability, Reusability, Debugging, Testing SIF8080, Sep. 27th 2001 Customer-driven project Carl-Fredrik Sørensen
1 Testing With The JUnit Framwork Carl-Fredrik Sørensen, PhD Fellow
Software Testing, Debugging and JUnit Ananda Gunawardena Hao Cen.
JUnit test and Project 3 simulation. 2 JUnit The testing problems The framework of JUnit A case study Acknowledgement: using some materials from JUNIT.
Introduction to JUnit 3.8 SEG 3203 Winter ‘07 Prepared By Samia Niamatullah.
Unit Testing with JUnit and Clover Based on material from: Daniel Amyot JUnit Web site.
CSC 480 Software Engineering Lecture 15 Oct 21, 2002.
JUnit Dwight Deugo Nesa Matic
A tool for test-driven development
Testing and Build JUnit and Ant. JUnit Testing is not closely integrated with development. This prevents you from measuring the progress of development-
Program Testing, Debugging and JUnit. Program Development Process A simplified process –User requirement  Development  Delivery A simplified process.
JUnit Eclipse, Java and introduction to Junit. Topics Covered  Using Eclipse IDE  Example Java Programs  Junit Introduction.
JUnit A framework which provides hooks for easy testing of your Java code, as it's built Note: The examples from these slides can be found in ~kschmidt/public_html/CS265/Labs/Java/Junit.
Java tools for XP (Testing your Web App) Web Apps and Services.
S Ramakrishnan1 Systems V & V, Quality and Standards Dr Sita Ramakrishnan School CSSE Monash University.
Unit, Regression, and Behavioral Testing Based On: Unit Testing with JUnit and CUnit by Beth Kirby Dec 13, 2002 Jules.
OOSC – Lab 1. Welcome Object Oriented programming is first and foremost a method for software construction, whose goal is to build high-quality software.
Test a Little, Code a Little Colin Sharples IBM Global Services New Zealand Colin Sharples IBM Global Services New Zealand.
Topic: Junit Presenters: Govindaramanujam, Sama & Jansen, Erwin.
Sistemas Operativos Multiprogramação; Multiplexação; Memória Física; Memória virtual; Trabalho/Job - Processo/Process/Task - Thread.
Sistemas Operativos Introdução. Sistema Operativo - definição De maneira menos informal podemos definir Sistema Operativo, como sendo o Software fundamental.
COMPONENTES BÁSICOS DE UM COMPUTADOR Disco-Rígido – Fonte - Motherboard - O disco rígido ou HD (Hard Disk) - Estrutura - Placa lógica (hard drive logic.
Arquitetura do SET de instruções Instruction SET CISC vs RISC What’s assembly as to do with it?
Arduino CHIP. Pins analógicos – (1 de 2) Recordar: Analog In - pin 0 ao 5 – analog to digital Recebe sinais analógicos e transforma-os em sinais digitais.
Arduino CHIP Hardware -Pins Digitais - Pins 0 ao 13Pins Digitais - Pins 0 ao 13 -Pins pulse modulation ~Pins Pins 0 e 1 –
COMPONENTES BÁSICOS DE UM COMPUTADOR Processador – Memória – Bus/Barramento – Periféricos.
Qual é a diferença entre fonética e fonologia?. Fonética Estuda a natureza física da produção e da percepção dos sons da fala humana. Preocupa-se com.
HCA - 10º ANO: A CULTURA DA ÁGORA ESCULTURA GREGA: ESTATUÁRIA PROF. PEDRO XAVIER ESAAA.
Computer Science 209 Testing With JUnit.
I MPORTÂNCIA DA E LETROMECÂNICA NA A GROPECUÁRIA O presente trabalho tem como objetivo propor uma crescente análise das rápidas e profundas inovações tecnológicas.
Liste todos os “símiles” usados pelos autores de LD para o Hyracotherium,indicando pelo menos uma página em que cada um deles é citado FOX TERRIERPÁG.
null, true, and false are also reserved.
O Mercado  Os Economistas estudam e analisam o funcionamento de uma série de instituições, no intuito de determinarem a forma como são usados os recursos.
Learning JUnit for Unit Testing
PUC por um Semestre - PIUES Termoquímica Calor de reação.
Psicologia Grupo: Allyne Mendes Amanda Lima George Nascimento Maria Lira Mirian Alves Luaryanne.
Guija, Julho de 2019 Mabalane AP– Planificação Detalhada Sessão – – Passo 4 1.
VALOR AGREGADO Para agregar valor, deve-se ir além, inovar, ser criativo, ousar e correr o risco de ser imitado e de não poder cobrar mais pelo que faz.
JUnit Tutorial Hong Qing Yu Nov 2005.
Presentation transcript:

Exemplo de desenvolvimento com testes Prof. Dr. Alfredo Goldman Departamento de Ciência da Computação IME / USP 3 de Abril de 2003 VI Semana da Computação

03/04/2003VI Semana da Computação Problema com testes zTodos sabem: devem ser escritos; zPoucos o fazem, e por quê não ? yEstou com muita pressa zMas, isto cria um círculo vicioso: menos testes menos produtividade menos estabilidade mais pressão

03/04/2003VI Semana da Computação Como quebrar este ciclo zCriando um ambiente simples de testes zDepois de fazer os primeiros testes yo hábito vem para ficar zVamos mostrar como seria um desenvolvimento ideal.... yAtravés do JUnit... zMas, antes uma visão geral:

03/04/2003VI Semana da Computação JUnit - como funciona ? zArcabouço Java para testes de unidade yAPI para construir testes  Classes básicas: Test, TestCase, TestSuite,... xUsam-se métodos tipo premissa: assertTrue(), assertEquals, fail(),...  API para a execução de testes ( TestRunners ) xModo texto xModo gráfico

03/04/2003VI Semana da Computação Junit - origens e uso zCriado por K. Beck e E. Gamma zPadrão para testes em Java zPermite a execução automática de testes yExecuta os testes de forma silenciosa zDirigido a testes de unidade yMétodos yPode-se agrupar diversos testes

03/04/2003VI Semana da Computação Exemplo de uso  Padrão use o método testXxx() para testar o método xxx()  Utilize os métodos da classe TestCase yassertEquals( objeto1, objeto2); yassertTrue( varBool); yassertNotNull( objeto); yfail();

03/04/2003VI Semana da Computação JUnit na prática 1) O TestRunner recebe uma subclasse de TestCase ; 2) Descobre seus métodos (reflexão); 3) Para cada testXxx(); cria nova instância garante independência !! executa setUp(); testXxx(); tearDown(); 4) Possibilidades: término OK, falha, ou exceção

03/04/2003VI Semana da Computação Criando uma seqüência de testes  Classe TestSuite  Método addTest adiciona um teste a lista yEncontra os testes em uma classe (reflexão)  new TestSuite( ClasseDeTestes.class); yPode-se juntar tudo TestSuite ts = new TestSuite(“tudo”); ts.addTest( pacote.Teste1.testeX); ts.addTest( ClasseDeTestes.suite());

03/04/2003VI Semana da Computação Premissas em Java (JDK 1.4) zNova palavra chave: assert  assert (n > 0) : “n não é positivo”; zPodem ser desligadas facilmente zProvocam um AssertionError quando falham zPara usá-las: yjavac -source 1.4 Classe.java yjava -ea Classe

03/04/2003VI Semana da Computação JUnit e premissas: zPremissas são usadas dentro do código zOs testes JUnit ficam em classes separadas yNão tem acesso a partes encapsuladas zJUnit testa a partir da interface zPremissas podem verificar lógica interna

03/04/2003VI Semana da Computação Testes de desempenho  JUnitPerf yMétodos para medir desempenho e escalabilidade  TimedTest xMede, e limita o tempo do teste  LoadTest xExecução concorrente, configuração por timers  ThreadTest xExecuta o teste como uma thread separada

03/04/2003VI Semana da Computação Testes de Stress  JMeter - testa nos limites yDe carga xPara diferentes tipos BDs, páginas WEB, objetos Java yGera gráficos  Pode ser usado em conjunto com o JUnitPerf

03/04/2003VI Semana da Computação Testes de páginas WEB zTestar do ponto de vista do usuário yAtravés de páginas yTestes funcionais zExtensões do Junit  HttpUnit e ServletUnit  JXweb (especifica os testes em XML)  XMLUnit yTodos são projetos sourceforge

03/04/2003VI Semana da Computação JUnit na prática: O programa zUm sistema para representar diversas moedas; zPara começar: algo simples.

class Money { private int fAmount; private String fCurrency; public Money(int amount, String currency) { fAmount = amount; fCurrency = currency; } public int amount() { return fAmount; } public String currency() { return fCurrency; }

03/04/2003VI Semana da Computação Para somar dois “Moneys” da mesma moeda (currency): public Money add(Money m) { return new Money(amount()+m.amount(), currency()); }

03/04/2003VI Semana da Computação Questão de hábito zCode a little, test a little, code a little, test a little.... zJá temos um objeto, vamos testá-lo !! zNo JUnit os testes devem ser subclasses de TestCase

public class MoneyTest extends TestCase { //… public void testSimpleAdd() { Money m12CHF= new Money(12, "CHF"); // (1) Money m14CHF= new Money(14, "CHF"); Money expected= new Money(26, "CHF"); Money result= m12CHF.add(m14CHF); // (2) Assert.assertTrue(expected.equals(result)); // (3)assertTrue } O testSimpleAdd() consiste em: Código para criar os objetos; Código para usar os objetos; Código para verificar os resultados. Falta fazer a sobrecarga de equals

public void testEquals() { Money m12CHF= new Money(12, "CHF"); Money m14CHF= new Money(14, "CHF"); Assert.assertTrue(!m12CHF.equals(null)); Assert.assertEquals(m12CHF, m12CHF); Assert.assertEquals(m12CHF, new Money(12, "CHF")); // (1) Assert.assertTrue(!m12CHF.equals(m14CHF)); } // lembrete: o equals do object volta true se os // objetos comparados são o mesmo. Mas antes um teste para o equals

03/04/2003VI Semana da Computação Agora sim public boolean equals(Object anObject) { if (anObject instanceof Money) { Money aMoney = (Money) anObject; return aMoney.currency().equals(currency()) && amount() == aMoney.amount(); } return false; } // faltou sobrecarregar o método hashCode...

03/04/2003VI Semana da Computação Mas, já apesar dos testes serem pequenos já há código duplicado... public class MoneyTest extends TestCase { private Money f12CHF; private Money f14CHF; protected void setUp() {setUp f12CHF= new Money(12, "CHF"); f14CHF= new Money(14, "CHF"); }

03/04/2003VI Semana da Computação Agora os testes podem ser rescritos como: public void testEquals() { assert(!f12CHF.equals(null)); assertEquals(f12CHF, f12CHF); assertEquals(f12CHF, new Money(12, "CHF")); assert(!f12CHF.equals(f14CHF)); } public void testSimpleAdd() { Money expected= new Money(26, "CHF"); Money result= f12CHF.add(f14CHF); assert(expected.equals(result)); }

03/04/2003VI Semana da Computação Próximos passos zDefinir como rodar um teste individual; zDefinir como rodar uma seqüência de testes.

// forma estática, com classe interior TestCase test= new MoneyTest("simple add") { public void runTest() { testSimpleAdd(); } }; // forma dinâmica, usa reflexão TestCase test= new MoneyTest("testSimpleAdd");

03/04/2003VI Semana da Computação Pode-se automatizar testes zCriando uma seqüência de testes public static Test suite() { TestSuite suite= new TestSuite(); suite.addTest(new MoneyTest("testEquals")); suite.addTest(new MoneyTest("testSimpleAdd")); return suite; }

03/04/2003VI Semana da Computação Pode-se automatizar testes zOu apenas: public static Test suite() { return new TestSuite(MoneyTest.class); } Agora, um pouco de JUnit na prática.

03/04/2003VI Semana da Computação Continuando o projeto Deve-se poder guardar diversos tipos de moeda class MoneyBag { private Vector fMoneis= new Vector(); MoneyBag(Money m1, Money m2) { appendMoney(m1); appendMoney(m2); } MoneyBag(Money bag[]) { for (int i= 0; i < bag.length; i++) appendMoney(bag[i]); }

protected void setUp() { f12CHF= new Money(12, "CHF"); f14CHF= new Money(14, "CHF"); f7USD= new Money( 7, "USD"); f21USD= new Money(21, "USD"); fMB1= new MoneyBag(f12CHF, f7USD); fMB2= new MoneyBag(f14CHF, f21USD); } Para os testes deve se criar também objetos do novo tipo

public void testBagEquals() { assert(!fMB1.equals(null)); assertEquals(fMB1, fMB1); assert(!fMB1.equals(f12CHF)); assert(!f12CHF.equals(fMB1)); assert(!fMB1.equals(fMB2)); } Devem se criar novos testes, mas os testes antigos continuam lá E devem continuar funcionando...

public Money add(Money m) { if (m.currency().equals(currency()) ) return new Money(amount() + m.amount(), currency()); return new MoneyBag(this, m); } // ops MoneyBag != Money.... Agora podemos melhorar o método add Agora existem duas representações de dinheiro... interface IMoney { public abstract IMoney add(IMoney aMoney); //… }

Mas, ainda não temos testes para tipos mistos... public void testMixedSimpleAdd() { // [12 CHF] + [7 USD] == {[12 CHF][7 USD]} Money bag[]= { f12CHF, f7USD }; MoneyBag expected= new MoneyBag(bag); assertEquals(expected, f12CHF.add(f7USD)); } Os outros testes seguem o mesmo padrão:  testBagSimpleAdd - soma MoneyBag com Money  testSimpleBagAdd - soma Money com MoneyBag  testBagBagAdd - soma dois MoneyBags

Mais testes estão disponíveis: public static Test suite() { TestSuite suite= new TestSuite(); suite.addTest(new MoneyTest("testMoneyEquals")); suite.addTest(new MoneyTest("testBagEquals")); suite.addTest(new MoneyTest("testSimpleAdd")); suite.addTest(new MoneyTest("testMixedSimpleAdd")); suite.addTest(new MoneyTest("testBagSimpleAdd")); suite.addTest(new MoneyTest("testSimpleBagAdd")); suite.addTest(new MoneyTest("testBagBagAdd")); return suite; } Agora sim vamos implementá-los...

class Money implements IMoney { public IMoney add(IMoney m) { return m.addMoney(this); } //… } class MoneyBag implements IMoney { public IMoney MoneyBag.add(IMoney m) { return m.addMoneyBag(this); } //… } //… IMoney addMoney(Money aMoney); IMoney addMoneyBag(MoneyBag aMoneyBag); }

Em Money. public IMoney addMoney(Money m) { if (m.currency().equals(currency())) return new Money(amount()+m.amount(), currency()); return new MoneyBag(this, m); } public IMoney addMoneyBag(MoneyBag s) { return s.addMoney(this); }

Em MoneyBag. public IMoney addMoney(Money m) { return new MoneyBag(m, this); } public IMoney addMoneyBag(MoneyBag s) { return new MoneyBag(s, this); } Surge um problema.... E se retira-se 12CHF de um MoneyBag com 12CHF ???

Primeiro o teste... public void testSimplify() { // {[12 CHF][7 USD]} + [-12 CHF] == [7 USD] Money expected= new Money(7, "USD"); assertEquals(expected, fMS1.add(new Money(-12, "CHF"))); }

Depois o código. public IMoney addMoney(Money m) { return (new MoneyBag(m, this)).simplify(); } public IMoney addMoneyBag(MoneyBag s) { return (new MoneyBag(s, this)).simplify(); } private IMoney simplify() { if (fMonies.size() == 1) return (IMoney)fMonies.firstElement() return this; }

03/04/2003VI Semana da Computação Desenvolvimento com testes zTestes devem ser escritos assim que possível; zTestes devem ser adaptados segundo as mudanças; zDeixe os testes antigos rodando; zQuando surgem novas idéias (simplify), crie testes, veja se funcionam, e se necessário altere o código.