Junit 4.0 Daniel Cukier – IME – USP [email protected] MAC5700 1 Daniel Cukier – IME - USP Conteúdo ● ● ● ● ● ● 2 Sobre o JUnit Migrando do Junit 3 para 4 Novidades da nova versão Testes de Tempo e performance J2MEUnit Outros arcabouços Daniel Cukier – IME - USP Sobre o JUnit ● ● ● ● 3 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 Daniel Cukier – IME - USP Velho JUnit import junit.framework.TestCase; public class NovelaTest extends TestCase { reflexão public void testNovelaExiste() { ArquivoDeNovelas novelas = new ArquivoDeNovelas(); assertEquals("Arquivo deve possuir Sassaricando", true, novelas .possuiNovela("Sassaricando")) } } 4 métodos da classe TestCase Daniel Cukier – IME - USP Velho JUnit import junit.framework.TestCase; public class NovelaTest extends TestCase { public void setUp() { novelas = new ArquivoDeNovelas(); } public void tearDown() { novelas = null; } } 5 Daniel Cukier – IME - USP Migrando para Junit 4.0 import junit.framework.JUnit4TestAdapter; import org.junit.Test; import static org.junit.Assert.assertEquals; public class NovelaNovoTest { não é subclasse de TestCase – classe normal @Test public void novelaJaTerminou() {não começa com ‘test’ ArquivoDeNovelas novelas = new ArquivoDeNovelas(); assertEquals("Arquivo deve possuir Sassaricando", true, novelas .possuiNovela("Sassaricando")); } public static junit.framework.Test suite(){ return new JUnit4TestAdapter(NovelaNovoTest.class); } } 6 Daniel Cukier – IME - USP Migrando para Junit 4.0 import junit.framework.JUnit4TestAdapter; Importa JUnit4TestAdapter import org.junit.Test; Importa Test Annotation import static org.junit.Assert.assertEquals; Importa método de classe public class NovelaNovoTest { @Test public void novelaJaTerminou() { Todos os testes são anotado com @Test ArquivoDeNovelas novelas = new ArquivoDeNovelas(); assertEquals("Arquivo deve possuir Sassaricando", true, novelas .possuiNovela("Sassaricando")); } Usado para rodar usando JUnit runner antigo public static junit.framework.Test suite(){ return new JUnit4TestAdapter(NovelaNovoTest.class); } } Daniel Cukier – IME - USP 7 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 8 Daniel Cukier – IME - USP Antes e Depois de Cada Teste import import import import org.junit.After; org.junit.Before; org.junit.Test; static org.junit.Assert.assertEquals; public class NovelaNovoTest { private ArquivoDeNovelas novelas; @Before public void rodaAntesDeCadaTeste() { novelas = new ArquivoDeNovelas(); } @After public void rodaDepoisDeCadaTeste() { novelas = null; } @Test public void testNovelaExiste() { assertEquals("Arquivo deve possuir Sassaricando", true, novelas .possuiNovela("Sassaricando")); } } 9 Daniel Cukier – IME - USP Antes e Depois de Cada Teste ● ● ● 10 É 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 Daniel Cukier – IME - USP Antes e Depois da Classe de Testes @BeforeClass public void rodaAntesDeTodosOsTestes() { novelas = new ArquivoDeNovelas(); novelas.carregaDadosDaRede(); } Processamento pesado! @AfterClass public void rodaDepoisDeTodosOsTestes() { novelas = null; } 11 ● Somente um método por classe ● Bom para inicializações demoradas Daniel Cukier – IME - USP Exceções Esperadas @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; } ● 12 ANTES JUnit 4 Se exceção não for gerada, teste falha Daniel Cukier – IME - USP Teste de tempo @Test(timeout=500) public void buscaTodasAsNovelas(){ novelas.buscaTodas(); } ● ● ● 13 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! Daniel Cukier – IME - USP Teste de Tempo ● ● ● ● 14 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! Daniel Cukier – IME - USP Outras Funcionalidades ● ● 15 @Ignore – Para desabilitar temporariamente um teste assertEquals(Object[] expected, Object[] actual) – compara elemento a elemento Daniel Cukier – IME - USP Resumo ● ● ● ● ● ● ● 16 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 Daniel Cukier – IME - USP Resumo ● ● ● 17 @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 Daniel Cukier – IME - USP 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 18 Daniel Cukier – IME - USP J2MEUnit imports … 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 19 Daniel Cukier – IME - USP Outros Arcabouços Unit ● ● ● ● 20 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) Daniel Cukier – IME - USP Referências 21 ● 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 Daniel Cukier – IME - USP