Aula 04 - JUnit no Eclipse - parte 1

Testes de software
O assunto desta aula é sobre testes. Teste de software é um dos assuntos mais ricos e controversos que temos na área de de desenvolvimento de software e até no gerenciamento de projetos de software. Sendo assim, acabei por criar uma página específica para tratar deste assunto, de forma mais abrangente, indo além de Java e JUnit. Esta página, pode ser acessada aqui.

O que é o JUnit?
JUnit é um framework de suporte a testes automatizados para a linguagem de programação Java. Ela tem sido importante na popularização do Test Driven Development (TDD) ou "Desenvolvimento Orientado a Testes".

Como funciona o JUnit?
Em termos de funcionamento, o JUnit é um programa usado para executar testes unitários em virtualmente qualquer aplicação. Os testes com JUnit são efetuados escrevendo "casos de teste" em Java, compilando estes casos de testes e executando as classes resultantes com o "JUnit Test Runner".

Obtendo o JUnit
O JUnit, pode ser obtido no site da JUnit.org. Mas na prática, no caso dos usuários do Eclipse, ele já vem disponível como um plugin, possuindo sua própria View, a qual podemos exibir usando:
Window » Show View » Other, e na janela que se abre, selecionar Java » JUnit.

Mas o que são testes unitários afinal?
Testes Unitários constituem um processo de desenvolvimento de software onde a menor porção "testável" de uma aplicação, chamada unidade, é individual e independentemente verificada em relação ao comportamento dela esperado. Testes Unitários são em geral automatizados, mas podem ser feitos manualmente.
Testes Unitários envolvem apenas as características essenciais da unidade sob teste. Isso encoraja o desenvolvedor a poder alterar livremente a implementação de uma unidade buscando uma melhor performance por exemplo, sem se preocupar com uma possível interferência em outras unidades ou na aplicação como um todo.
Uma vez que todas as unidades de uma aplicação estiverem funcionando de forma satisfatória e sem erros, porções maiores da aplicação poderão ser avaliados na forma de testes integrados, depois com testes do sistema e finalmente com testes de aceitação. Os testes unitários são a base de todo o processo de testes.

Preparando o ambiente de Testes
O primeiro passo é definir onde no projeto vão ficar os nossos testes. A não ser que exista orientação do cliente em contrário, o normal, é que não desejamos incluir os nossos testes no pacote a ser entregue para deploy. Sendo assim, faz sentido armazenar as Classes de teste numa pasta diferente da usada para armazenar as Classes com o código da aplicação propriamente dito.
Observando a janela do "Package Explorer", podemos ver a localização da nossa Classe de negócio (Classe Pessoa).
Vamos então criar uma pasta no mesmo nível da pasta "src", com o nome "test". Vamos fazer da seguinte forma: Botão direito do mouse sobre o projeto » New » Source Folder
Na janela que se abre, digitar o nome da pasta ("test" neste caso) e acionar o botão "Finish".
Com isso, temos agora a seguinte estrutura:
Para manter a organização, vamos querer que as nossas Classes de teste fiquem sob os mesmos pacotes que as Classes sendo testadas. Sendo assim, vamos criar o mesmo pacote sob a pasta "test" que acabamos de criar.
Para isso, vamos selecionar a pasta "test".
Usar na barra de menu: File » New » Package, assim:
E na janela que se abre, digitar o mesmo nome de pacote usado na pasta "src", assim:
Obtendo:

Sobre o uso de Menus no Eclipse
Na maior parte das ações que efetuamos sobre itens de um projeto, podemos optar por usar...
A barra de menus sobre um item selecionado:
O menu flutuante, usando o botão direito do mouse, também sobre um item selecionado:

O nosso primeiro código de teste
Agora, estamos prontos para criar o nosso primeiro teste usando JUnit.
Para isso, vamos contar com a ajuda de uma facilidade do Eclipse. O Eclipse possui modelos de ajuda prontos (Wizards) para efetuar várias tarefas. Criar testes usando JUnit, é uma delas.
Usando o menu flutuante, vamos marcar o package que acabamos de criar e selecionar o Wizard: New » JUnit Test Case, assim:
Na janela que se abre, vamos digitar um nome para a nossa Classe de teste. Um padrão que pode e deve ser seguido aqui é: usar para o nome da Classe de teste, o nome da Classe sendo testada, seguido do sufixo "Test". Além disso, é necessário digitar o nome da Classe sendo testada. Teremos portanto, a tela assim:
A tela não exibe nenhum erro ou alerta. Tudo está certo, pois o JUnit 4 já está disponível nesta instalação. A título de aprendizado, vamos alterar a versão do JUnit para 3 e observar o que acontece:
Reparem que agora surge um alerta indicando que a Super Classe "TestCase" do JUnit não existe. Isso se deve ao fato de o pacote (JAR) do Junit 3 não estar configurado no "caminho de construção" (build path) do projeto. O "build path" indica a localização de todas as bibliotecas externas necessárias à compilação da aplicação. O JUnit é uma dessas bibliotecas externas, daí a necessidade de uma referência a ela constar no "build path".
Vamos ignorar isso no momento e seguir adiante com o botão "Next".
Na tela que se segue, podemos escolher os métodos para os quais vamos gerar código de teste. Não só métodos da Classe Pessoa, como também os métodos da Classe Object, da qual a Classe Pessoa herda. Vamos escolher no momento, o método construtor da Classe Pessoa e também os métodos "set", assim:
Ao acionar o botão "Finish", o eclipse abre uma outra janela, dando chance de resolver o problema detectado anteriormente, adicionado o JUnit 3 no "buid path". Vamos, mais uma vez, ignorar este problema selecionando a opção "Not now" e acionado o botão "OK".
O que nos leva a seguinte situação:
Como era de se esperar, a nossa classe de teste foi criada, porém surgem várias indicações de erro. Vamos analisar cada uma destas indicações:
  1. No Package Explorer, podemos ver que o projeto como um todo, está marcado com erro, porque alguma parte dele está com erro. Neste caso, a classe "PessoaTest" dentro do pacote "com.iniciantes.java.tutorial" dentro da pasta "test".
  2. Na janela de código, podemos ver a nossa Classe de teste com indicações de erro em toda linha que menciona recursos do JUnit, inclusive no "import".
  3. Na aba de "Outline", podemos ver de forma esquemática onde ocorrem os erros no nosso código.
  4. Na aba "Problems", temos acesso individualizado a cada linha de código causando problema, indicando sua localização exata.
Vamos então usar esta última área para aprender como resolver problemas no nosso código com a ajuda do Eclipse.
Começando pelo problema indicado da linha 3 (o import), vamos acionar a opção "Quick Fix", usando o botão direito do mouse sobre ele, assim:
Na janela que surge, selecionamos: "Fix project setup..."
E na janela seguinte: "Add JUnit 3 library to the build path"
O que faz com que os erros desapareçam, assim:
Reparem que o pacote JUnit 3 foi adicionado ao nosso projeto.
A opção "Quick Fix" do Eclipse oferece:
  • Sugestões para corrigir erros de compilação
  • Implementa os ajustes selecionados automaticamente
  • Pode-se usar o botão direito do mouse ou o atalho CTRL-1
  • O Quick Fix do Eclipse é o melhor amigo do desenvolvedor.
Para entender um pouco mais do que o Eclipse fez para corrigir o erro, vamos verificar o "buid path" do nosso projeto. Poderiamos usar: botão direito do mouse sobre o projeto » Properties. Mas desta vez, vamos usar um atalho: Selecione o projeto e use: Alt + Enter.
Na janela que se abre, selecionar: "Java Buid Path" e a aba "Libraries"
Podemos ver que o pacote do JUnit 3 foi adicionado ao "buid path".
Nós poderíamos obter o mesmo efeito, usando o botão "Add Library", localizando o pacote do JUnit 3 no nosso sistema de arquivos e selecionando-o.
Vamos examinar o código gerado linha a linha, e entendê-lo.
  • 1 - Identificação do pacote da nossa Classe de teste
  • 3 - Import do pacote do JUnit para a Classe "TestCase"
  • 5 - Declaração da nossa Classe de teste "PessoaTest" estendendo a Classe "TestCase" do JUnit
  • 7 - Declaração do método de teste para o método Construtor da Classe Pessoa
  • 11 - Declaração do método de teste para o método setNome da Classe Pessoa
  • 15 - Declaração do método de teste para o método setMaxLivros da Classe Pessoa
Sendo a nossa Classe "PessoaTest" uma Subclasse de "TestCase", podemos usar os métodos herdados desta última. No momento, todos os métodos de teste estão usando o método "fail", apenas para gerar um resultado padrão dizendo que o teste ainda não foi implementado.
Vamos executar os métodos de teste da forma que estão e ver o que acontece, assim:
Podemos observar na área inferior, na aba JUnit, o resultado da execução de todos os métodos de teste. Para cada um deles a mensagem já esperada de "Not yet implemented" é exibida.
O próximo passo, é modificar os métodos que foram criados automaticamente para efetivamente testar os métodos implementados na Classe Pessoa.

Nenhum comentário:

Postar um comentário