21
Daniel Cukier – IME - USP 1 Junit 4.0 Daniel Cukier – IME – USP [email protected] MAC5700

Daniel Cukier – IME - USP 1 Junit 4.0 Daniel Cukier – IME – USP [email protected] MAC5700

Embed Size (px)

Citation preview

Page 1: Daniel Cukier – IME - USP 1 Junit 4.0 Daniel Cukier – IME – USP danicuki@mandic.com.br MAC5700

Daniel Cukier – IME - USP1

Junit 4.0

Daniel Cukier – IME – [email protected]

MAC5700

Page 2: Daniel Cukier – IME - USP 1 Junit 4.0 Daniel Cukier – IME – USP danicuki@mandic.com.br MAC5700

Daniel Cukier – IME - USP2

Conteúdo● Sobre o JUnit ● Migrando do Junit 3 para 4● Novidades da nova versão● Testes de Tempo e performance● J2MEUnit● Outros arcabouços

Page 3: Daniel Cukier – IME - USP 1 Junit 4.0 Daniel Cukier – IME – USP danicuki@mandic.com.br MAC5700

Daniel Cukier – IME - USP3

Sobre o JUnit ● Arcabouço para testes de unidades –

pequenos testes para as várias partes (módulos, métodos, classes, etc) de um sistema

● Usado fortemente em XP, TDD e outros métodos ágeis

● Código fonte livre● Testes de unidades mostram a

presença de erros, não a auência deles

Page 4: Daniel Cukier – IME - USP 1 Junit 4.0 Daniel Cukier – IME – USP danicuki@mandic.com.br MAC5700

Daniel Cukier – IME - USP4

Velho JUnitimport junit.framework.TestCase;

public class NovelaTest extends TestCase {

public void testNovelaExiste() {

ArquivoDeNovelas novelas = new ArquivoDeNovelas();

assertEquals("Arquivo deve possuir Sassaricando", true, novelas

.possuiNovela("Sassaricando"))}

} métodos da classe TestCase

reflexão

Page 5: Daniel Cukier – IME - USP 1 Junit 4.0 Daniel Cukier – IME – USP danicuki@mandic.com.br MAC5700

Daniel Cukier – IME - USP5

Velho JUnitimport junit.framework.TestCase;

public class NovelaTest extends TestCase {

public void setUp() {novelas = new ArquivoDeNovelas();

}

public void tearDown() {novelas = null;

}

}

Page 6: Daniel Cukier – IME - USP 1 Junit 4.0 Daniel Cukier – IME – USP danicuki@mandic.com.br MAC5700

Daniel Cukier – IME - USP6

Migrando para Junit 4.0import junit.framework.JUnit4TestAdapter;

import org.junit.Test;import static org.junit.Assert.assertEquals;

public class NovelaNovoTest {

@Test public void novelaJaTerminou() {

ArquivoDeNovelas novelas = new ArquivoDeNovelas();assertEquals("Arquivo deve possuir Sassaricando",

true, novelas

.possuiNovela("Sassaricando"));}

public static junit.framework.Test suite(){return new JUnit4TestAdapter(NovelaNovoTest.class);

}}

não é subclasse de TestCase – classe normal

não começa com ‘test’

Page 7: Daniel Cukier – IME - USP 1 Junit 4.0 Daniel Cukier – IME – USP danicuki@mandic.com.br MAC5700

Daniel Cukier – IME - USP7

import junit.framework.JUnit4TestAdapter;

import org.junit.Test;import static org.junit.Assert.assertEquals;

public class NovelaNovoTest {

@Test public void novelaJaTerminou() {

ArquivoDeNovelas novelas = new ArquivoDeNovelas();assertEquals("Arquivo deve possuir Sassaricando",

true, novelas

.possuiNovela("Sassaricando"));}

public static junit.framework.Test suite(){return new JUnit4TestAdapter(NovelaNovoTest.class);

}}

Migrando para Junit 4.0Importa Test Annotation

Todos os testes são anotado com @Test

Importa método de classe

Importa JUnit4TestAdapter

Usado para rodar usando JUnit runner antigo

Page 8: Daniel Cukier – IME - USP 1 Junit 4.0 Daniel Cukier – IME – USP danicuki@mandic.com.br MAC5700

Daniel Cukier – IME - USP8

Executando os testes● A maioria dos ambientes de

desenvolvimento ainda não suportam Junit 4

● JUnit4Adapter permite rodar testes do JUnit 4 nesses ambientes, usando o método suite()

● Rodar via linha de comando: java org.junit.runner.JUnitCore LibraryTest

Page 9: Daniel Cukier – IME - USP 1 Junit 4.0 Daniel Cukier – IME – USP danicuki@mandic.com.br MAC5700

Daniel Cukier – IME - USP9

Antes e Depois de Cada Testeimport org.junit.After;import org.junit.Before;import org.junit.Test;import static org.junit.Assert.assertEquals;

public class NovelaNovoTest {private ArquivoDeNovelas novelas;

@Beforepublic void rodaAntesDeCadaTeste() {

novelas = new ArquivoDeNovelas();}

@Afterpublic void rodaDepoisDeCadaTeste() {

novelas = null;}

@Testpublic void testNovelaExiste() {

assertEquals("Arquivo deve possuir Sassaricando", true, novelas .possuiNovela("Sassaricando"));

}}

Page 10: Daniel Cukier – IME - USP 1 Junit 4.0 Daniel Cukier – IME – USP danicuki@mandic.com.br MAC5700

Daniel Cukier – IME - USP10

Antes e Depois de Cada Teste● É possível ter quantos métodos

@Before e @After quiser● Métodos @Before e @After são

herdados das superclasses. Métodos @Before das superclasses são executados antes dos métodos @Before da subclasse. Métodos @After das superclasses são executados depois.

● Objetivo: agrupar código comum a vários testes

Page 11: Daniel Cukier – IME - USP 1 Junit 4.0 Daniel Cukier – IME – USP danicuki@mandic.com.br MAC5700

Daniel Cukier – IME - USP11

Antes e Depois da Classe de Testes

● Somente um método por classe● Bom para inicializações demoradas

@BeforeClasspublic void rodaAntesDeTodosOsTestes() {

novelas = new ArquivoDeNovelas();novelas.carregaDadosDaRede();

}

@AfterClasspublic void rodaDepoisDeTodosOsTestes() {

novelas = null;}

Processamento pesado!

Page 12: Daniel Cukier – IME - USP 1 Junit 4.0 Daniel Cukier – IME – USP danicuki@mandic.com.br MAC5700

Daniel Cukier – IME - USP12

Exceções Esperadas

● Se exceção não for gerada, teste falha

@Test public void testDivisaoPorZero() { try { int n = 2 / 0; fail("Dividiu por zero!"); } catch (ArithmeticException success) { assertNotNull(success.getMessage());

}}

@Test(expected=ArithmeticException.class) public void testDivisaoPorZero () { int n = 2 / 0;}

ANTES

JUnit 4

Page 13: Daniel Cukier – IME - USP 1 Junit 4.0 Daniel Cukier – IME – USP danicuki@mandic.com.br MAC5700

Daniel Cukier – IME - USP13

Teste de tempo

● Teste falha se demorar mais do que timeout● Útil para testes de redes e conexões com

bancos de dados● Detalhe: @After não é executado caso

falhe!

@Test(timeout=500)public void buscaTodasAsNovelas(){

novelas.buscaTodas();}

Page 14: Daniel Cukier – IME - USP 1 Junit 4.0 Daniel Cukier – IME – USP danicuki@mandic.com.br MAC5700

Daniel Cukier – IME - USP14

Teste de Tempo● Aplicações modernas existem tempo de

resposta máximo.● O tempo de resposta pode mudar na

medida em que o sistema evolui● Testes de tempo garantem que o tempo

de resposta máximo seja satisfeito, mesmo que o sistema se torne mais complexo

● O sistema cresce em funcionalidades sem perder performance!

Page 15: Daniel Cukier – IME - USP 1 Junit 4.0 Daniel Cukier – IME – USP danicuki@mandic.com.br MAC5700

Daniel Cukier – IME - USP15

Outras Funcionalidades● @Ignore – Para desabilitar

temporariamente um teste● assertEquals(Object[] expected,

Object[] actual) – compara elemento a elemento

Page 16: Daniel Cukier – IME - USP 1 Junit 4.0 Daniel Cukier – IME – USP danicuki@mandic.com.br MAC5700

Daniel Cukier – IME - USP16

Resumo● Precisa do JDK 5 para rodar● Classes de teste não são subclasses de

TestCase● Métodos não começam com ‘test’● Métodos de asserção de classe● @Test para anotar um teste● @Before e @After para rodar antes e

depois de cada teste.● @Test recebe parâmetro de timeout

Page 17: Daniel Cukier – IME - USP 1 Junit 4.0 Daniel Cukier – IME – USP danicuki@mandic.com.br MAC5700

Daniel Cukier – IME - USP17

Resumo● @Test recebe parâmentro de excessão

esperada● JUnit4Adapter permite rodar JUnit 4 nos

runners antigos.● Testes do JUnit antigo rodam

normalmente no JUnit 4

Page 18: Daniel Cukier – IME - USP 1 Junit 4.0 Daniel Cukier – IME – USP danicuki@mandic.com.br MAC5700

Daniel Cukier – IME - USP18

J2MEUnit● J2ME não possui reflexão, muito menos

anotações!● Recursos limitados

public Test suite() { TestSuite suite = new TestSuite("testes paciente DAO"); suite.addTest(new InfoPacienteDAOTest("Teste adiciona Paciente", new TestMethod() {

public void run(TestCase tc) throws Exception { ((InfoPacienteDAOTest) tc).testAddInfoPaciente();}

}));}

Adicionando métodos

Page 19: Daniel Cukier – IME - USP 1 Junit 4.0 Daniel Cukier – IME – USP danicuki@mandic.com.br MAC5700

Daniel Cukier – IME - USP19

J2MEUnitimports …

public class BorboletaTestRunner extends TestRunner {

public BorboletaTestRunner() {super();

}

protected void startApp() {start(new String[] { InfoPacienteDAOTest.class.getName(),

FormPacienteTest.class.getName(),ExportPacienteTest.class.getName(),ImportPacienteTest.class.getName()});

}}

Array de strings com nome de classes de teste

Page 20: Daniel Cukier – IME - USP 1 Junit 4.0 Daniel Cukier – IME – USP danicuki@mandic.com.br MAC5700

Daniel Cukier – IME - USP20

Outros Arcabouços Unit● SQLUnit – testes para Stored Procedures

(http://sqlunit.sourceforge.net/)● JPDFUnit – testa documentos PDF gerados

dinamicamente (http://jpdfunit.sourceforge.net/)● XMLUnit – teste para arquivos XML

(http://xmlunit.sourceforge.net/)● Watij – teste de aplicações Web em java

(http://watij.xwiki.com/xwiki/bin/view/Main/WebHome)

Page 21: Daniel Cukier – IME - USP 1 Junit 4.0 Daniel Cukier – IME – USP danicuki@mandic.com.br MAC5700

Daniel Cukier – IME - USP21

Referências● http://www-128.ibm.com/developerworks/java/library/j-junit4.html● http://www.instrumentalservices.com/media/articles/java/junit4/

JUnit4.pdf● http://junit.sourceforge.net/doc/cookbook/cookbook.htm● http://j2meunit.sourceforge.net/doc.html● http://www.junit.org/● http://en.wikipedia.org/wiki/Unit_test