Aula 05 - JUnit no Eclipse - parte 2

JUnit Básico
Neste tópico vamos começar com um exemplo simples para ilustrar os conceitos básicos envolvidos nos testes com JUnit.

Vamos analisar este exemplo linha a linha:

      import junit.framework.*;
      
Como nós estamos usando recursos criados pela equipe do JUnit, precisamos importar as classes que desejarmos usar. A maioria reside no subdiretório "framework", daí a necessidade do comando import.

      public class SimpleTest extends TestCase {
      
A nossa Classe de teste precisa definir seus próprios métodos para ter qualquer utilidade para nós. Sendo assim, ela estende a Classe "TestCase" a qual vai nos permitir criar nossos próprios métodos de teste.

      public SimpleTest(String name) {
         super(name);
      }
      
Todo teste, recebe um nome para que quando observamos o resultado geral de todos os testes possamos distinguir qual teste gerou o erro se for o caso. O método construtor provê esta funcionalidade passando o parâmetro recebido para a Classe pai.

      public void testSimpleTest() {
        int answer = 2;
        assertEquals((1+1), answer);
      }
      
Este é no momento o único teste constante do nosso "TestCase". Poderiam haver mais, tantos quantos você quisesse. Você pode ver que podemos definir variáveis e efetuar cálculos como qualquer outro programa Java.

      public void testSimpleTest() {
         int answer = 2;
         assertEquals((1+1), answer);
      }
      
Vamos ver o resultado da execução deste teste, usando: botão direito do mouse sobre a Classe de teste » Run As » JUnit Test

Se alterarmos o valor da variável "answer" para algo diferente de "2" e executarmos o teste novamente, vamos obter um erro, assim:

Este teste simples, testa se 1+1 é igual ao valor de answer. Este é apenas um exemplo de teste extremamente simples.
Normalmente, o que desejamos é testar o resultado de algum método. Por exemplo, um método que remova todos os caracteres "a", de um String. Você pode testá-lo assim:
      public void testStringStripFunction() {
         String expected = "bb"
         StringStripper stripper = new StringStripper();
         assertEquals(expected, stripper.stringStrip("aabaaaba"));
      }
      
O que pode fazer o "assertEquals" falhar se o método StringStripper não se comportar como esperado. Assim, podemos tentar corrigir o método e executar o teste novamente até que ele tenha sucesso.

De volta aos nossos testes
Voltando aos nossos testes, vamos começar, implementando um teste real para garantir que o método Construtor da Classe Pessoa esteja fazendo o que dele se espera. Vejamos o método Construtor:
      public Pessoa() {
        nome = "Nome Desconhecido";
        maxLivros = 3;
      }
      
Ele deve inicializar uma nova instância da Classe Pessoa com "Nome Desconhecido" para o atributo "nome" e "3" para o atributo "maxLivros". O que precisamos fazer é criar um método de teste que verifique se estes valores estão corretos.
Vamos usar alguns assistentes do Eclipse para nos ajudar a criar este teste, assim:
No método "testPessoa()" retiramos a chamada do método "fail" e digitamos a instrução "new" + CTRL + Espaço, o que nos apresenta o seguinte:

Selecionar a opção "create new object", o que leva ao seguinte:

Vamos agora alterar cada um dos parâmetros, usando a tecla TAB para navegar entre eles, o que nos leva ao seguinte:

Agora, temos definida uma instância "p1" da Classe Pessoa. Reparem no alerta à esquerda da linha 8. Ele indica que a variável "p1" não está sendo usada.
Se uma nova instância da Classe Pessoa foi criada, o seu método Construtor foi executado. Vamos agora complementar o nosso teste verificando se os valores dos atributos estão com os valores esperados, usando o método "assertEquals" do JUnit, assim:
E preenchendo os parâmetros, assim:
O que nos leva ao seguinte:
Para completar, vamos corrigir o erro indicado colocando o ";" ao final da linha, e adotar o mesmo procedimento para o atributo "maxLivros". O que nos leva ao seguinte:
O que estamos fazendo aqui é: verificando com o método "assertEquals" se os atributos estão com os valores esperados depois que o método Construtor da Classe Pessoa foi executado.
Mas de onde vem o método "assertEquals" ? Ele vem da Classe "TestCase" que é a Super Classe da nossa Classe "PessoaTest". E por que este método não pode ser chamado da seguinte forma:
      PessoaTest pt = new PessoaTest();
      pt.assertEquals(...);
      
A resposta é que o método "assertEquals" é um método estático (cuja declaração deve conter o modificador static). Um método estático, não pertence a nenhuma instância de uma Classe, e sim à Classe como um todo.
A sintaxe de uso de um método estático, é a seguinte: <Classe>.<método>, o que nos levaria ao seguinte: PessoaTest.assertEquals(...), sendo que o nome da Classe é opcional dentro da mesma Classe. O Eclipse nos ajuda a diferenciar os métodos estáticos, exibindo-os em itálico.
Vamos agora executar os testes novamente, usando o botão "Rerun Test":
E ver o que acontece... O que vai nos levar ao seguinte:
Reparem que foram executados 3 de 3 testes. Destes, 2 falharam e um foi bem sucedido. Aquele sobre o método Construtor que acabamos de implementar. Ele foi bem sucedido, pois os valores dos atributos da instância "p1" da Classe Pessoa, foram atribuídos pelo método Construtor conforme o esperado.
Usando os mesmos passos, vamos implementar o método de teste para o método "setNome" da nossa Classe Pessoa, obtendo o seguinte:
Executando os testes novamente, vamos obter o seguinte:
Agora, 2 dos testes foram bem sucedidos (os que implementamos), apenas um continua falhando. Vamos cuidar dele em seguida.
Mais uma vez, usando os mesmos passos, vamos implementar o método de teste para o método "setMaxLivros" da nossa Classe Pessoa. A título de aprendizado, vamos forçar um erro, usando um nome de variável não definido. Teremos o seguinte:
Como a variável não existe, o assistente do Eclipse não consegue nos ajudar.
Vamos agora corrigir o erro, obtendo o seguinte:
Executando os testes novamente, vamos ter:
Mais uma vez, a título de aprendizado, vamos forçar um erro no teste do método "setNome", e ver o que acontece:
E executando os testes novamente...
Reparem no botão "Compare Actual With Expected Test Result" à direita. Se acionado, ele exibe uma janela com as diferenças entre o que era esperado pelo seu teste e o que foi obtido do método sendo testado, assim:
Agora, basta voltar o teste à sua condição anterior, onde todos os métodos passam.

Nenhum comentário:

Postar um comentário