SlideShare uma empresa Scribd logo
1 de 38
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/2003
VI Semana da
Computação
Problema com testes
Todos sabem: devem ser escritos;
Poucos o fazem, e por quê não ?
Estou com muita pressa
Mas, isto cria um círculo vicioso:
menos testes
menos produtividade
menos estabilidade
mais pressão
03/04/2003
VI Semana da
Computação
Como quebrar este ciclo
Criando um ambiente simples de testes
Depois de fazer os primeiros testes
o hábito vem para ficar
Vamos mostrar como seria um
desenvolvimento ideal....
Através do JUnit...
Mas, antes uma visão geral:
03/04/2003
VI Semana da
Computação
JUnit - como funciona ?
Arcabouço Java para testes de unidade
API para construir testes
Classes básicas: Test, TestCase,
TestSuite,...
Usam-se métodos tipo premissa:
• assertTrue(), assertEquals, fail(), ...
API para a execução de testes (TestRunners)
Modo texto
Modo gráfico
03/04/2003
VI Semana da
Computação
Junit - origens e uso
Criado por K. Beck e E. Gamma
Padrão para testes em Java
Permite a execução automática de testes
Executa os testes de forma silenciosa
Dirigido a testes de unidade
Métodos
Pode-se agrupar diversos testes
03/04/2003
VI 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
assertEquals( objeto1, objeto2);
assertTrue( varBool);
assertNotNull( objeto);
fail();
03/04/2003
VI 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/2003
VI Semana da
Computação
Criando uma seqüência de
testes
Classe TestSuite
Método addTest adiciona um teste a lista
Encontra os testes em uma classe (reflexão)
new TestSuite( ClasseDeTestes.class);
Pode-se juntar tudo
TestSuite ts = new TestSuite(“tudo”);
ts.addTest( pacote.Teste1.testeX);
ts.addTest( ClasseDeTestes.suite());
03/04/2003
VI Semana da
Computação
Premissas em Java (JDK 1.4)
Nova palavra chave: assert
assert (n > 0) : “n não é positivo”;
Podem ser desligadas facilmente
Provocam um AssertionError quando falham
Para usá-las:
javac -source 1.4 Classe.java
java -ea Classe
03/04/2003
VI Semana da
Computação
JUnit e premissas:
Premissas são usadas dentro do código
Os testes JUnit ficam em classes
separadas
Não tem acesso a partes encapsuladas
JUnit testa a partir da interface
Premissas podem verificar lógica interna
03/04/2003
VI Semana da
Computação
Testes de desempenho
JUnitPerf
Métodos para medir desempenho e escalabilidade
TimedTest
Mede, e limita o tempo do teste
LoadTest
Execução concorrente, configuração por timers
ThreadTest
Executa o teste como uma thread separada
03/04/2003
VI Semana da
Computação
Testes de Stress
JMeter - testa nos limites
De carga
Para diferentes tipos BDs, páginas WEB, objetos
Java
Gera gráficos
Pode ser usado em conjunto com o JUnitPerf
03/04/2003
VI Semana da
Computação
Testes de páginas WEB
Testar do ponto de vista do usuário
Através de páginas
Testes funcionais
Extensões do Junit
HttpUnit e ServletUnit
JXweb (especifica os testes em XML)
XMLUnit
Todos são projetos sourceforge
03/04/2003
VI Semana da
Computação
JUnit na prática: O programa
Um sistema para representar diversas
moedas;
Para 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/2003
VI 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/2003
VI Semana da
Computação
Questão de hábito
Code a little, test a little, code a little, test
a little....
Já temos um objeto, vamos testá-lo !!
No 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)
}
}
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/2003
VI 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/2003
VI 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() {
f12CHF= new Money(12, "CHF");
f14CHF= new Money(14, "CHF");
}
}
03/04/2003
VI 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/2003
VI Semana da
Computação
Próximos passos
Definir como rodar um teste individual;
Definir 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/2003
VI Semana da
Computação
Pode-se automatizar testes
Criando 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/2003
VI Semana da
Computação
Pode-se automatizar testes
Ou apenas:
public static Test suite() {
return new TestSuite(MoneyTest.class);
}
Agora, um pouco de JUnit na prática.
03/04/2003
VI 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/2003
VI Semana da
Computação
Desenvolvimento com testes
Testes devem ser escritos assim que
possível;
Testes devem ser adaptados segundo as
mudanças;
Deixe os testes antigos rodando;
Quando surgem novas idéias (simplify),
crie testes, veja se funcionam, e se
necessário altere o código.

Mais conteúdo relacionado

Mais procurados

Mais procurados (19)

Junit
JunitJunit
Junit
 
JUnit
JUnitJUnit
JUnit
 
Junit 4.0
Junit 4.0Junit 4.0
Junit 4.0
 
Palestra Testes Unidade Com JUnit
Palestra Testes Unidade Com JUnitPalestra Testes Unidade Com JUnit
Palestra Testes Unidade Com JUnit
 
POO - 22 - Tratamento de Exceções em Java
POO - 22 - Tratamento de Exceções em JavaPOO - 22 - Tratamento de Exceções em Java
POO - 22 - Tratamento de Exceções em Java
 
Excecoes
ExcecoesExcecoes
Excecoes
 
Tratamento de exceções em Java
Tratamento de exceções em JavaTratamento de exceções em Java
Tratamento de exceções em Java
 
Java 13 Excecoes
Java 13 ExcecoesJava 13 Excecoes
Java 13 Excecoes
 
Erros, exceções e asserções
Erros, exceções e asserçõesErros, exceções e asserções
Erros, exceções e asserções
 
Tratamento de exceções em Java
Tratamento de exceções em JavaTratamento de exceções em Java
Tratamento de exceções em Java
 
UnP Eng. Software - Aula 28
UnP Eng. Software - Aula 28UnP Eng. Software - Aula 28
UnP Eng. Software - Aula 28
 
JAVA - Tratamento de Erros
JAVA - Tratamento de ErrosJAVA - Tratamento de Erros
JAVA - Tratamento de Erros
 
Certificação Java: Exceções
Certificação Java: ExceçõesCertificação Java: Exceções
Certificação Java: Exceções
 
Aexo TI - Boas práticas de testes tdd
Aexo TI - Boas práticas de testes tddAexo TI - Boas práticas de testes tdd
Aexo TI - Boas práticas de testes tdd
 
Java14
Java14Java14
Java14
 
Refatoração e Boas Práticas no Desenvolvimento de Software com a Linguagem Ja...
Refatoração e Boas Práticas no Desenvolvimento de Software com a Linguagem Ja...Refatoração e Boas Práticas no Desenvolvimento de Software com a Linguagem Ja...
Refatoração e Boas Práticas no Desenvolvimento de Software com a Linguagem Ja...
 
Tratamento de exceções java
Tratamento de exceções   javaTratamento de exceções   java
Tratamento de exceções java
 
Java12
Java12Java12
Java12
 
Instruções de controle 1
Instruções de controle 1Instruções de controle 1
Instruções de controle 1
 

Destaque

1980’s power point
1980’s power point1980’s power point
1980’s power pointtylerphillips
 
Situacion problema historia 3 er grado.ppt nuevo
Situacion problema historia 3 er grado.ppt nuevoSituacion problema historia 3 er grado.ppt nuevo
Situacion problema historia 3 er grado.ppt nuevotalusi
 
Mixing Identities with Ease
Mixing Identities with EaseMixing Identities with Ease
Mixing Identities with EasePatrik Bichsel
 
Get Shorty via Group Signatures without Encryption
Get Shorty via Group Signatures without EncryptionGet Shorty via Group Signatures without Encryption
Get Shorty via Group Signatures without EncryptionPatrik Bichsel
 
Situacion problema historia 3 er grado.ppt nuevo
Situacion problema historia 3 er grado.ppt nuevoSituacion problema historia 3 er grado.ppt nuevo
Situacion problema historia 3 er grado.ppt nuevotalusi
 
Situacion problema historia 3 er grado.ppt nuevo
Situacion problema historia 3 er grado.ppt nuevoSituacion problema historia 3 er grado.ppt nuevo
Situacion problema historia 3 er grado.ppt nuevotalusi
 
clothing for special groups
clothing for special groupsclothing for special groups
clothing for special groupslinda-karimi
 
Situacion problema historia 3 er grado.ppt nuevo
Situacion problema historia 3 er grado.ppt nuevoSituacion problema historia 3 er grado.ppt nuevo
Situacion problema historia 3 er grado.ppt nuevotalusi
 
Immunity to infection indonesia lengkap
Immunity to infection indonesia lengkapImmunity to infection indonesia lengkap
Immunity to infection indonesia lengkapdarwin_slideshare
 
Murni lasari, emulsi
Murni lasari, emulsiMurni lasari, emulsi
Murni lasari, emulsimurnilasari
 
Murni lasari, emulsi
Murni lasari, emulsiMurni lasari, emulsi
Murni lasari, emulsimurnilasari
 
Fundraising & Social Media
Fundraising & Social MediaFundraising & Social Media
Fundraising & Social Mediamargotlefebvre
 
Oracle cash management_Anne
Oracle cash management_AnneOracle cash management_Anne
Oracle cash management_Anneanuraj-sandhu
 
Электронный архив
Электронный архивЭлектронный архив
Электронный архивE_L_A_U
 

Destaque (19)

Presentació plàstics mariano
Presentació plàstics marianoPresentació plàstics mariano
Presentació plàstics mariano
 
1980’s power point
1980’s power point1980’s power point
1980’s power point
 
Cover
CoverCover
Cover
 
Situacion problema historia 3 er grado.ppt nuevo
Situacion problema historia 3 er grado.ppt nuevoSituacion problema historia 3 er grado.ppt nuevo
Situacion problema historia 3 er grado.ppt nuevo
 
Mixing Identities with Ease
Mixing Identities with EaseMixing Identities with Ease
Mixing Identities with Ease
 
Get Shorty via Group Signatures without Encryption
Get Shorty via Group Signatures without EncryptionGet Shorty via Group Signatures without Encryption
Get Shorty via Group Signatures without Encryption
 
Situacion problema historia 3 er grado.ppt nuevo
Situacion problema historia 3 er grado.ppt nuevoSituacion problema historia 3 er grado.ppt nuevo
Situacion problema historia 3 er grado.ppt nuevo
 
Situacion problema historia 3 er grado.ppt nuevo
Situacion problema historia 3 er grado.ppt nuevoSituacion problema historia 3 er grado.ppt nuevo
Situacion problema historia 3 er grado.ppt nuevo
 
clothing for special groups
clothing for special groupsclothing for special groups
clothing for special groups
 
special groups
special groupsspecial groups
special groups
 
Situacion problema historia 3 er grado.ppt nuevo
Situacion problema historia 3 er grado.ppt nuevoSituacion problema historia 3 er grado.ppt nuevo
Situacion problema historia 3 er grado.ppt nuevo
 
Cover dan intro 2007
Cover dan intro 2007Cover dan intro 2007
Cover dan intro 2007
 
Immunity to infection indonesia lengkap
Immunity to infection indonesia lengkapImmunity to infection indonesia lengkap
Immunity to infection indonesia lengkap
 
Murni lasari, emulsi
Murni lasari, emulsiMurni lasari, emulsi
Murni lasari, emulsi
 
La salsa[1]
La salsa[1]La salsa[1]
La salsa[1]
 
Murni lasari, emulsi
Murni lasari, emulsiMurni lasari, emulsi
Murni lasari, emulsi
 
Fundraising & Social Media
Fundraising & Social MediaFundraising & Social Media
Fundraising & Social Media
 
Oracle cash management_Anne
Oracle cash management_AnneOracle cash management_Anne
Oracle cash management_Anne
 
Электронный архив
Электронный архивЭлектронный архив
Электронный архив
 

Semelhante a Desenvolvimento com testes JUnit

Introdução a testes unitários automatizados com JUnit e NUnit
Introdução a testes unitários automatizados com JUnit e NUnitIntrodução a testes unitários automatizados com JUnit e NUnit
Introdução a testes unitários automatizados com JUnit e NUnitelliando dias
 
Padrões para Desenvolvimento de Software Guiado por Testes
Padrões para Desenvolvimento de Software Guiado por TestesPadrões para Desenvolvimento de Software Guiado por Testes
Padrões para Desenvolvimento de Software Guiado por TestesEverton Rodrigues
 
Testes Automatizados de Software
Testes Automatizados de SoftwareTestes Automatizados de Software
Testes Automatizados de SoftwareMaurício Aniche
 
DOJO - TDD com C++
DOJO - TDD com C++DOJO - TDD com C++
DOJO - TDD com C++thiagodp
 
TDD em C++
TDD em C++TDD em C++
TDD em C++thiagodp
 
Atividades de Teste e Cobertura de Código em Java
Atividades de Teste e Cobertura de Código em JavaAtividades de Teste e Cobertura de Código em Java
Atividades de Teste e Cobertura de Código em Javaaceiro
 
TDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no AndroidTDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no Androidtdc-globalcode
 
Como escrever bons testes! - Dex transforming days
Como escrever bons testes! - Dex transforming days Como escrever bons testes! - Dex transforming days
Como escrever bons testes! - Dex transforming days Danilo Pereira De Luca
 
Testes de performance com JUnitPerf
Testes de performance com JUnitPerfTestes de performance com JUnitPerf
Testes de performance com JUnitPerfDenis L Presciliano
 

Semelhante a Desenvolvimento com testes JUnit (20)

Testes de Unidade com JUnit
Testes de Unidade com JUnitTestes de Unidade com JUnit
Testes de Unidade com JUnit
 
Aula5
Aula5Aula5
Aula5
 
Testes com JUnit
Testes com JUnitTestes com JUnit
Testes com JUnit
 
Introdução a testes unitários automatizados com JUnit e NUnit
Introdução a testes unitários automatizados com JUnit e NUnitIntrodução a testes unitários automatizados com JUnit e NUnit
Introdução a testes unitários automatizados com JUnit e NUnit
 
Aula3
Aula3Aula3
Aula3
 
Mock Objects
Mock ObjectsMock Objects
Mock Objects
 
Padrões para Desenvolvimento de Software Guiado por Testes
Padrões para Desenvolvimento de Software Guiado por TestesPadrões para Desenvolvimento de Software Guiado por Testes
Padrões para Desenvolvimento de Software Guiado por Testes
 
Testes de Sofware
Testes de SofwareTestes de Sofware
Testes de Sofware
 
Introdução a tdd
Introdução a tddIntrodução a tdd
Introdução a tdd
 
Testes Automatizados de Software
Testes Automatizados de SoftwareTestes Automatizados de Software
Testes Automatizados de Software
 
DOJO - TDD com C++
DOJO - TDD com C++DOJO - TDD com C++
DOJO - TDD com C++
 
TDD em C++
TDD em C++TDD em C++
TDD em C++
 
J unit xp
J unit xpJ unit xp
J unit xp
 
Atividades de Teste e Cobertura de Código em Java
Atividades de Teste e Cobertura de Código em JavaAtividades de Teste e Cobertura de Código em Java
Atividades de Teste e Cobertura de Código em Java
 
TDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no AndroidTDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no Android
 
Programação Defensiva
Programação DefensivaProgramação Defensiva
Programação Defensiva
 
Como escrever bons testes! - Dex transforming days
Como escrever bons testes! - Dex transforming days Como escrever bons testes! - Dex transforming days
Como escrever bons testes! - Dex transforming days
 
Javascript
JavascriptJavascript
Javascript
 
J unit
J unitJ unit
J unit
 
Testes de performance com JUnitPerf
Testes de performance com JUnitPerfTestes de performance com JUnitPerf
Testes de performance com JUnitPerf
 

Último

PROGRAMA DE AÇÃO 2024 - MARIANA DA SILVA MORAES.pdf
PROGRAMA DE AÇÃO 2024 - MARIANA DA SILVA MORAES.pdfPROGRAMA DE AÇÃO 2024 - MARIANA DA SILVA MORAES.pdf
PROGRAMA DE AÇÃO 2024 - MARIANA DA SILVA MORAES.pdfMarianaMoraesMathias
 
Livro O QUE É LUGAR DE FALA - Autora Djamila Ribeiro
Livro O QUE É LUGAR DE FALA  - Autora Djamila RibeiroLivro O QUE É LUGAR DE FALA  - Autora Djamila Ribeiro
Livro O QUE É LUGAR DE FALA - Autora Djamila RibeiroMarcele Ravasio
 
"É melhor praticar para a nota" - Como avaliar comportamentos em contextos de...
"É melhor praticar para a nota" - Como avaliar comportamentos em contextos de..."É melhor praticar para a nota" - Como avaliar comportamentos em contextos de...
"É melhor praticar para a nota" - Como avaliar comportamentos em contextos de...Rosalina Simão Nunes
 
AD2 DIDÁTICA.KARINEROZA.SHAYANNE.BINC.ROBERTA.pptx
AD2 DIDÁTICA.KARINEROZA.SHAYANNE.BINC.ROBERTA.pptxAD2 DIDÁTICA.KARINEROZA.SHAYANNE.BINC.ROBERTA.pptx
AD2 DIDÁTICA.KARINEROZA.SHAYANNE.BINC.ROBERTA.pptxkarinedarozabatista
 
Pedologia- Geografia - Geologia - aula_01.pptx
Pedologia- Geografia - Geologia - aula_01.pptxPedologia- Geografia - Geologia - aula_01.pptx
Pedologia- Geografia - Geologia - aula_01.pptxleandropereira983288
 
VARIEDADES LINGUÍSTICAS - 1. pptx
VARIEDADES        LINGUÍSTICAS - 1. pptxVARIEDADES        LINGUÍSTICAS - 1. pptx
VARIEDADES LINGUÍSTICAS - 1. pptxMarlene Cunhada
 
Literatura Brasileira - escolas literárias.ppt
Literatura Brasileira - escolas literárias.pptLiteratura Brasileira - escolas literárias.ppt
Literatura Brasileira - escolas literárias.pptMaiteFerreira4
 
CRÔNICAS DE UMA TURMA - TURMA DE 9ºANO - EASB
CRÔNICAS DE UMA TURMA - TURMA DE 9ºANO - EASBCRÔNICAS DE UMA TURMA - TURMA DE 9ºANO - EASB
CRÔNICAS DE UMA TURMA - TURMA DE 9ºANO - EASBAline Santana
 
Considere a seguinte situação fictícia: Durante uma reunião de equipe em uma...
Considere a seguinte situação fictícia:  Durante uma reunião de equipe em uma...Considere a seguinte situação fictícia:  Durante uma reunião de equipe em uma...
Considere a seguinte situação fictícia: Durante uma reunião de equipe em uma...azulassessoria9
 
Música Meu Abrigo - Texto e atividade
Música   Meu   Abrigo  -   Texto e atividadeMúsica   Meu   Abrigo  -   Texto e atividade
Música Meu Abrigo - Texto e atividadeMary Alvarenga
 
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...azulassessoria9
 
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...azulassessoria9
 
Atividades sobre Coordenadas Geográficas
Atividades sobre Coordenadas GeográficasAtividades sobre Coordenadas Geográficas
Atividades sobre Coordenadas Geográficasprofcamilamanz
 
RedacoesComentadasModeloAnalisarFazer.pdf
RedacoesComentadasModeloAnalisarFazer.pdfRedacoesComentadasModeloAnalisarFazer.pdf
RedacoesComentadasModeloAnalisarFazer.pdfAlissonMiranda22
 
Manual da CPSA_1_Agir com Autonomia para envio
Manual da CPSA_1_Agir com Autonomia para envioManual da CPSA_1_Agir com Autonomia para envio
Manual da CPSA_1_Agir com Autonomia para envioManuais Formação
 
DESAFIO LITERÁRIO - 2024 - EASB/ÁRVORE -
DESAFIO LITERÁRIO - 2024 - EASB/ÁRVORE -DESAFIO LITERÁRIO - 2024 - EASB/ÁRVORE -
DESAFIO LITERÁRIO - 2024 - EASB/ÁRVORE -Aline Santana
 
AULA SOBRE AMERICA LATINA E ANGLO SAXONICA.pptx
AULA SOBRE AMERICA LATINA E ANGLO SAXONICA.pptxAULA SOBRE AMERICA LATINA E ANGLO SAXONICA.pptx
AULA SOBRE AMERICA LATINA E ANGLO SAXONICA.pptxLaurindo6
 
A poesia - Definições e Característicass
A poesia - Definições e CaracterísticassA poesia - Definições e Característicass
A poesia - Definições e CaracterísticassAugusto Costa
 

Último (20)

PROGRAMA DE AÇÃO 2024 - MARIANA DA SILVA MORAES.pdf
PROGRAMA DE AÇÃO 2024 - MARIANA DA SILVA MORAES.pdfPROGRAMA DE AÇÃO 2024 - MARIANA DA SILVA MORAES.pdf
PROGRAMA DE AÇÃO 2024 - MARIANA DA SILVA MORAES.pdf
 
Livro O QUE É LUGAR DE FALA - Autora Djamila Ribeiro
Livro O QUE É LUGAR DE FALA  - Autora Djamila RibeiroLivro O QUE É LUGAR DE FALA  - Autora Djamila Ribeiro
Livro O QUE É LUGAR DE FALA - Autora Djamila Ribeiro
 
"É melhor praticar para a nota" - Como avaliar comportamentos em contextos de...
"É melhor praticar para a nota" - Como avaliar comportamentos em contextos de..."É melhor praticar para a nota" - Como avaliar comportamentos em contextos de...
"É melhor praticar para a nota" - Como avaliar comportamentos em contextos de...
 
AD2 DIDÁTICA.KARINEROZA.SHAYANNE.BINC.ROBERTA.pptx
AD2 DIDÁTICA.KARINEROZA.SHAYANNE.BINC.ROBERTA.pptxAD2 DIDÁTICA.KARINEROZA.SHAYANNE.BINC.ROBERTA.pptx
AD2 DIDÁTICA.KARINEROZA.SHAYANNE.BINC.ROBERTA.pptx
 
Pedologia- Geografia - Geologia - aula_01.pptx
Pedologia- Geografia - Geologia - aula_01.pptxPedologia- Geografia - Geologia - aula_01.pptx
Pedologia- Geografia - Geologia - aula_01.pptx
 
Bullying, sai pra lá
Bullying,  sai pra láBullying,  sai pra lá
Bullying, sai pra lá
 
VARIEDADES LINGUÍSTICAS - 1. pptx
VARIEDADES        LINGUÍSTICAS - 1. pptxVARIEDADES        LINGUÍSTICAS - 1. pptx
VARIEDADES LINGUÍSTICAS - 1. pptx
 
Literatura Brasileira - escolas literárias.ppt
Literatura Brasileira - escolas literárias.pptLiteratura Brasileira - escolas literárias.ppt
Literatura Brasileira - escolas literárias.ppt
 
CRÔNICAS DE UMA TURMA - TURMA DE 9ºANO - EASB
CRÔNICAS DE UMA TURMA - TURMA DE 9ºANO - EASBCRÔNICAS DE UMA TURMA - TURMA DE 9ºANO - EASB
CRÔNICAS DE UMA TURMA - TURMA DE 9ºANO - EASB
 
Considere a seguinte situação fictícia: Durante uma reunião de equipe em uma...
Considere a seguinte situação fictícia:  Durante uma reunião de equipe em uma...Considere a seguinte situação fictícia:  Durante uma reunião de equipe em uma...
Considere a seguinte situação fictícia: Durante uma reunião de equipe em uma...
 
Música Meu Abrigo - Texto e atividade
Música   Meu   Abrigo  -   Texto e atividadeMúsica   Meu   Abrigo  -   Texto e atividade
Música Meu Abrigo - Texto e atividade
 
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...
 
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...
 
Atividades sobre Coordenadas Geográficas
Atividades sobre Coordenadas GeográficasAtividades sobre Coordenadas Geográficas
Atividades sobre Coordenadas Geográficas
 
RedacoesComentadasModeloAnalisarFazer.pdf
RedacoesComentadasModeloAnalisarFazer.pdfRedacoesComentadasModeloAnalisarFazer.pdf
RedacoesComentadasModeloAnalisarFazer.pdf
 
Manual da CPSA_1_Agir com Autonomia para envio
Manual da CPSA_1_Agir com Autonomia para envioManual da CPSA_1_Agir com Autonomia para envio
Manual da CPSA_1_Agir com Autonomia para envio
 
DESAFIO LITERÁRIO - 2024 - EASB/ÁRVORE -
DESAFIO LITERÁRIO - 2024 - EASB/ÁRVORE -DESAFIO LITERÁRIO - 2024 - EASB/ÁRVORE -
DESAFIO LITERÁRIO - 2024 - EASB/ÁRVORE -
 
AULA SOBRE AMERICA LATINA E ANGLO SAXONICA.pptx
AULA SOBRE AMERICA LATINA E ANGLO SAXONICA.pptxAULA SOBRE AMERICA LATINA E ANGLO SAXONICA.pptx
AULA SOBRE AMERICA LATINA E ANGLO SAXONICA.pptx
 
CINEMATICA DE LOS MATERIALES Y PARTICULA
CINEMATICA DE LOS MATERIALES Y PARTICULACINEMATICA DE LOS MATERIALES Y PARTICULA
CINEMATICA DE LOS MATERIALES Y PARTICULA
 
A poesia - Definições e Característicass
A poesia - Definições e CaracterísticassA poesia - Definições e Característicass
A poesia - Definições e Característicass
 

Desenvolvimento com testes JUnit

  • 1. 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
  • 2. 03/04/2003 VI Semana da Computação Problema com testes Todos sabem: devem ser escritos; Poucos o fazem, e por quê não ? Estou com muita pressa Mas, isto cria um círculo vicioso: menos testes menos produtividade menos estabilidade mais pressão
  • 3. 03/04/2003 VI Semana da Computação Como quebrar este ciclo Criando um ambiente simples de testes Depois de fazer os primeiros testes o hábito vem para ficar Vamos mostrar como seria um desenvolvimento ideal.... Através do JUnit... Mas, antes uma visão geral:
  • 4. 03/04/2003 VI Semana da Computação JUnit - como funciona ? Arcabouço Java para testes de unidade API para construir testes Classes básicas: Test, TestCase, TestSuite,... Usam-se métodos tipo premissa: • assertTrue(), assertEquals, fail(), ... API para a execução de testes (TestRunners) Modo texto Modo gráfico
  • 5. 03/04/2003 VI Semana da Computação Junit - origens e uso Criado por K. Beck e E. Gamma Padrão para testes em Java Permite a execução automática de testes Executa os testes de forma silenciosa Dirigido a testes de unidade Métodos Pode-se agrupar diversos testes
  • 6. 03/04/2003 VI 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 assertEquals( objeto1, objeto2); assertTrue( varBool); assertNotNull( objeto); fail();
  • 7. 03/04/2003 VI 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
  • 8. 03/04/2003 VI Semana da Computação Criando uma seqüência de testes Classe TestSuite Método addTest adiciona um teste a lista Encontra os testes em uma classe (reflexão) new TestSuite( ClasseDeTestes.class); Pode-se juntar tudo TestSuite ts = new TestSuite(“tudo”); ts.addTest( pacote.Teste1.testeX); ts.addTest( ClasseDeTestes.suite());
  • 9. 03/04/2003 VI Semana da Computação Premissas em Java (JDK 1.4) Nova palavra chave: assert assert (n > 0) : “n não é positivo”; Podem ser desligadas facilmente Provocam um AssertionError quando falham Para usá-las: javac -source 1.4 Classe.java java -ea Classe
  • 10. 03/04/2003 VI Semana da Computação JUnit e premissas: Premissas são usadas dentro do código Os testes JUnit ficam em classes separadas Não tem acesso a partes encapsuladas JUnit testa a partir da interface Premissas podem verificar lógica interna
  • 11. 03/04/2003 VI Semana da Computação Testes de desempenho JUnitPerf Métodos para medir desempenho e escalabilidade TimedTest Mede, e limita o tempo do teste LoadTest Execução concorrente, configuração por timers ThreadTest Executa o teste como uma thread separada
  • 12. 03/04/2003 VI Semana da Computação Testes de Stress JMeter - testa nos limites De carga Para diferentes tipos BDs, páginas WEB, objetos Java Gera gráficos Pode ser usado em conjunto com o JUnitPerf
  • 13. 03/04/2003 VI Semana da Computação Testes de páginas WEB Testar do ponto de vista do usuário Através de páginas Testes funcionais Extensões do Junit HttpUnit e ServletUnit JXweb (especifica os testes em XML) XMLUnit Todos são projetos sourceforge
  • 14. 03/04/2003 VI Semana da Computação JUnit na prática: O programa Um sistema para representar diversas moedas; Para começar: algo simples.
  • 15. 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; } }
  • 16. 03/04/2003 VI Semana da Computação Para somar dois “Moneys” da mesma moeda (currency): public Money add(Money m) { return new Money(amount()+m.amount(), currency()); }
  • 17. 03/04/2003 VI Semana da Computação Questão de hábito Code a little, test a little, code a little, test a little.... Já temos um objeto, vamos testá-lo !! No JUnit os testes devem ser subclasses de TestCase
  • 18. 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) } } 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
  • 19. 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
  • 20. 03/04/2003 VI 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...
  • 21. 03/04/2003 VI 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() { f12CHF= new Money(12, "CHF"); f14CHF= new Money(14, "CHF"); } }
  • 22. 03/04/2003 VI 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)); }
  • 23. 03/04/2003 VI Semana da Computação Próximos passos Definir como rodar um teste individual; Definir como rodar uma seqüência de testes.
  • 24. // 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");
  • 25. 03/04/2003 VI Semana da Computação Pode-se automatizar testes Criando 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; }
  • 26. 03/04/2003 VI Semana da Computação Pode-se automatizar testes Ou apenas: public static Test suite() { return new TestSuite(MoneyTest.class); } Agora, um pouco de JUnit na prática.
  • 27. 03/04/2003 VI 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]); } }
  • 28. 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
  • 29. 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...
  • 30. 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); //… }
  • 31. 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
  • 32. 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...
  • 33. 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); }
  • 34. 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); }
  • 35. 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 ???
  • 36. 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"))); }
  • 37. 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; }
  • 38. 03/04/2003 VI Semana da Computação Desenvolvimento com testes Testes devem ser escritos assim que possível; Testes devem ser adaptados segundo as mudanças; Deixe os testes antigos rodando; Quando surgem novas idéias (simplify), crie testes, veja se funcionam, e se necessário altere o código.