230 likes | 334 Views
J U nit. Um Framework Para Testes. Sylvia Campos Rodrigo 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
E N D
JUnit Um Framework Para Testes Sylvia Campos Rodrigo 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 • Decida o que o componente deve fazer. • Projeto o componente (sua interface pública) • Escreva os testes de unidade • Escreva o componente até que todos os testes passem • Escreva teste para outras possibilidade de falha • Escreva testes antes de corrigir um bug • Execute todos os testes antes de publicar uma alteração (regressão)
Referências http://www.junit.org
JUnit Um Framework Para Testes