2. Agenda
Parte 1 - teoria
Testes unitários
JUnit
Introdução
Arquitetura
API resumida
Boas práticas
Exemplos de uso
Parte 2 – prática (Eclipse)
Criando testes
Test Case
Test Suite
Executando testes
3. Testes unitários
Fase do processo de teste em que se testam as menores
unidades de software desenvolvidas
Objetivo
prevenir o aparecimento de bug’s oriundo de códigos mal escritos e
garantir um nível de qualidade de produto durante o
desenvolvimento de software
Responsabilidade do próprio desenvolvedor
Tipicamente executa um método individualmente
compara uma saída conhecida após o processamento da mesma
Não testam todo o software
Em POO: unidade pode ser um método, uma classe ou um
objeto
4. JUnit - introdução
Framework (arcabouço) livre para testes
automatizados escrito em Java
Escrito originalmente por Kent Beck (Extreme
Programming) e Erich Gamma (Design Patterns)
Integração com as principais IDEs
Grande comunidade de usuários
Utilizado principalmente no desenvolvimento de
testes de unidade
http://www.junit.org
5. JUnit - introdução
Vantagens
Permite a criação rápida de código de teste possibilitando um
aumento na qualidade do desenvolvimento e teste;
Amplamente utilizado pelos desenvolvedores da comunidade
código-aberto, possuindo um grande número de exemplos;
Uma vez escritos, os testes são executados rapidamente sem
que, para isso, seja interrompido o processo de
desenvolvimento;
JUnit checa os resultados dos testes e fornece uma resposta
imediata;
JUnit é livre e orientado a objetos.
Pode verificar cada método de uma classe
Exibição de possíveis erros e/ou falhas
7. JUnit - arquitetura
Classe TestCase
run() – Cria um contexto (método setUp); em seguida executa o
código usando um contexto e verifica o resultado (método
runTest); e por fim, limpa o contexto (método tearDown).
setUp() – Método chamado antes de cada método, pode ser
utilizado para abrir uma conexão de banco de dados.
tearDown() – Método chamado depois de cada método de teste,
usado para desfazer o que setUp() fez, por exemplo fechar uma
conexão de banco de dados.
runTest() – Método responsável por controlar a execução de um
teste particular.
Classe TestSuite
addTest() – Método responsável por adicionar um novo teste.
8. JUnit – API resumida
Método Descrição Teste passa se
assertEquals(a,b) Compara dois valores a.equals(b)
assertFalse(a) a == false
Avalia uma expressão
assertTrue(a) booleana a == true
assertNotNull(a) a != null
Compara uma variável
assertNull(a) com nulo a == null
assertNotSame(a,b) a == b
Compara dois objetos
assertSame(a,b) a != b
fail() Causa uma falha no
teste atual
9. JUnit – boas práticas
Test Case Class: [NomeClasse]Test.java,
onde NomeClasse é o nome da classe a ser
testada.
Exemplo:
Classe: Pessoa classe de teste: PessoaTest
Test Case Method: test[NomeMetodo], onde
NomeMetodo é o método a ser testado.
Exemplo:
Método: Pessoa.calculaIdade()
PessoaTest.testCalculaIdade()
10. JUnit – exemplo de uso
import junit.framework.TestCase;
/**
* Testes de unidade para a classe {@link Pessoa}
*/
public class TestPessoa extends TestCase {
/**
* Um teste de unidade para verificar se o nome está
* formatado corretamente
*/
public void testObterNomeCompleto() {
Pessoa p = new Pessoa(“Fulano”, “Tal”);
assertEquals(“Fulano Tal”, p.getNomeCompleto());
}
11. JUnit – exemplo de uso
/**
* Um teste de unidade para verificar se os nulos são
* tratados corretamente
*/
public void testNomeEhNulo() {
Pessoa p = new Pessoa(null, “Tal”);
assertEquals(“? Tal”, p.getNomeCompleto());
// Este código só é executado se passar pelo
// assertEquals anterior.
p = new Pessoa(“Fulano”, null);
assertEquals(“Fulano ?”, p.getNomeCompleto());
}
}
12. JUnit – exemplo de uso
Fixture: Conjunto de dados de teste e objetos
utilizados na execução de um ou mais testes
Para reaproveitar uma Fixture em mais de um teste:
Sobrescreva o método setUp() (inicialização)
protected void setUp() {
contatos = new ArrayList();
}
Sobrescreva o método tearDown() (limpeza)
protected void tearDown() {
contatos.clear();
}
13. JUnit – exemplo de uso
public class TesteSimples extends TestCase {
private Collection colecao;
protected void setUp() {
contatos = new ArrayList();
}
protected void tearDown() {
contatos.clear();
}
public void testColecaoVazia() {
assertTrue(contatos.isEmpty());
}
public void testColecaoComUmItem() {
contatos.add(quot;itemAquot;);
assertEquals(1, contatos.size());
}
}
14. JUnit – exemplo de uso
Possível ordem de execução:
setUp()
testColecaoComUmItem()
tearDown()
setUp()
testColecaoVazia()
tearDown()
Como os testes são chamados por reflexão, a ordem
de execução dos testes pode não seguir o mesmo
fluxo do código
Garantia: setUp() será executado antes e tearDown()
será executado depois