J U nit Um Framework Para Testes Sylvia Campos Rodrigo Lumack {scls, rlmb}@cin.ufpe.br.
Transcript of J U nit Um Framework Para Testes Sylvia Campos Rodrigo Lumack {scls, rlmb}@cin.ufpe.br.
JUnit
Um Framework Para Testes
Sylvia CamposRodrigo Lumack
{scls, rlmb}@cin.ufpe.br
Motivação
Todos os programadores sabem que devem testar seu código
Quanto mais curto o prazo menos testes são realizados
Necessidade de testar cada método separadamente
Centralizar o código de testes
Regras já definidas para apresentação de erros
Possibilidade de automatização
Testes em Software
Revelam erros no código
Garantem que a implementação respeita a especificação
Devem ser automatizados a fim de serem facilmente executados sempre que necessário
Garantem a qualidade do software durante todo o ciclo de vida
Testes Automatizados
Avaliam se um programa funciona como esperado
Exemplo: main()
Validam os requisitos
Testes de Unidade
Testam a aplicação em seus menores componentes, isoladamente
Testam unidades lógicas Métodos
Objetos
Maior número de erros detectados
Erros mais fáceis de corrigir
Devem ser executados continuamente
Testes de Integração
Testam como uma coleção de unidades interage entre si ou com o ambiente onde executam
Executados continuamente (caso as unidades em desenvolvimento dependam de outras)
Testes Funcionais
Ponto de vista do usuário
Testam casos de uso
Validam a interface com o usuário, as operações requisitadas, etc.
São menos estáveis do que os outros tipos
JUnit
Framework para facilitar o desenvolvimento e a execução de testes de unidade em programas Java
Modelo de programação para a criação de testes de unidade
Sugerido por Kent Beck
JUnit
API para construir testes junit.framework.*
Aplicações para executar testes TestRunner
JUnit
O framework JUnit pode ser resumido em uma classe pai para todos os casos de teste (chamada TestCase) que fornece ferramentas para rodar testes, gerar relatórios e definir conjuntos de testes
Escrevendo uma classe de teste
Assuma uma classe Conta Para testar a classe definimos uma classe
ContaTest
import test.framework.TestCase;
public class ContaTest extends TestCase {
public ContaTest(String testCase) {
super(testCase);
}
}
Escrevendo uma classe de teste
Para testar o método creditar(double valor) definimos o método testCreditar() na classe ContaTest;
public void testCreditar() {
Conta c = new Conta(1, 100);
c.creditar(50.0);
assertTrue(c.getSaldo() == 150);
}
Para cada método da classe Conta é definido um método na classe ContaTest
Principais Asserções
assertEquals(objEsperado, objRecebido);
assertTrue(expBooleana);
assertNull(obj);
assertNotNull(obj)
assertSame(obj1, obj2);
fail(mensagem);
Instalando e Rodando o JUnit
www.junit.org
Descompacte o arquivo junit3.8.1.zip.
Baixe a classe Conta.java em www.cin.ufpe.br/~scls/ES
Incluir o arquivo junit.jar no classpath
Crie uma classe ContaTest que será o test case da classe Conta.
Funcionamento
O TestRunner recebe uma subclasse de junit.framework.TestCase e executa o método run(Test) Obtém dados de TestSuite - suite()
TestSuite usa Java Reflection para descobrir os métodos de teste
Funcionamento
public static Test suite(){ return new TestSuite(ContaTest.class);
}
public static void main(String[] args){
junit.textui.TestRunner.run(suite());
}
TestSuite
Composição de testes
public static Test suite() {
TestSuite suite = new TestSuite();
suite.addTest(new ContaTest("testGetSaldo"));
suite.addTest(new ContaTest("testCreditar"));
return suite;
}
Um TestSuite é usado pelo TestRunner para saber quais métodos devem ser executados como testes
TestSuite
Para executar mais de um teste de uma vez e/ou reusar testes de outras classes (testes regressivos)
public static Test suite() {
TestSuite suite = new TestSuite();
suite.addTest(new ContaTest("testSaldoConta"));
suite.addTest(new ContaTest("testCredito"));
suite.addTest(PoupancaTest.suite());
return suite;
}
Como funciona
As asserções causam falhas quando os resultados não estiverem corretos test.framework.AssertionFailedError
Cada instância de TestCase será utilizada para executar um dos métodos de teste As alterações que ele fizer ao estado do objeto
não afetarão as demais classes
Boas Práticas
Escreva o código de testes antes da implementação. Dessa forma, você terá uma implementação dirigida por contrato
Teste somente métodos que podem estar quebrados (assim, métodos get e set não devem ser testados na maioria dos casos)
Teste sempre que possível
Testes conduzem o projeto OO
1. Decida o que o componente deve fazer.
2. Projeto o componente (sua interface pública)
3. Escreva os testes de unidade
4. Escreva o componente até que todos os testes passem
5. Escreva teste para outras possibilidade de falha
6. Escreva testes antes de corrigir um bug
7. Execute todos os testes antes de publicar uma alteração (regressão)
Referências
http://www.junit.org
JUnit
Um Framework Para Testes