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
Download

PPT