O documento descreve o framework JUnit para testes de unidade em Java. Apresenta as principais funcionalidades das versões 3 e 4 do JUnit, incluindo a migração entre elas, e cita outros frameworks para testes como J2MEUnit, SQLUnit e XMLUnit.
2. 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
3. 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
4. Velho JUnit import junit.framework.TestCase; public class NovelaTest extends TestCase { public void test NovelaExiste() { ArquivoDeNovelas novelas = new ArquivoDeNovelas(); assertEquals ("Arquivo deve possuir Sassaricando", true, novelas .possuiNovela("Sassaricando")) } } métodos da classe TestCase reflexão
5. Velho JUnit import junit.framework.TestCase; public class NovelaTest extends TestCase { public void setUp () { novelas = new ArquivoDeNovelas(); } public void tearDown () { novelas = null; } }
6. Migrando para Junit 4.0 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); } } não é subclasse de TestCase – classe normal não começa com ‘test’
7. Migrando para Junit 4.0 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); } } Importa Test Annotation Todos os testes são anotado com @Test Importa método de classe Importa JUnit4TestAdapter Usado para rodar usando JUnit runner antigo
8. 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
9. Antes e Depois de Cada Teste import org.junit.After; import org.junit.Before; import org.junit.Test; import 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")); } }
10. 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
11. Antes e Depois da Classe de Testes Somente um método por classe Bom para inicializações demoradas @BeforeClass public void rodaAntesDeTodosOsTestes() { novelas = new ArquivoDeNovelas(); novelas.carregaDadosDaRede(); } @AfterClass public void rodaDepoisDeTodosOsTestes() { novelas = null; } Processamento pesado!
12. 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
13. 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(); }
14. 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!
15. Outras Funcionalidades @Ignore – Para desabilitar temporariamente um teste assertEquals(Object[] expected, Object[] actual) – compara elemento a elemento
16. 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
17. 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
18. 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
19. 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
20. 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)