JUnit: framework de testes unitários Fred Lopes
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
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
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
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
JUnit - arquitetura
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.
JUnit API resumida Método Descrição Teste passa se assertequals(a,b) Compara dois valores a.equals(b) assertfalse(a) asserttrue(a) assertnotnull(a) assertnull(a) assertnotsame(a,b) assertsame(a,b) fail() Avalia uma expressão booleana Compara uma variável com nulo Compara dois objetos Causa uma falha no teste atual a == false a == true a!= null a == null a == b a!= b
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()
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());
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());
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();
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("itema"); assertequals(1, contatos.size());
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
JUnit Eclipse Agora vamos ver exemplos reais funcionando...