Curso JUnit: #2 - Escrevendo seu primeiro teste de unidade com JUnit
No post anterior entendemos o básico sobre testes de software e vimos a importância de construir nossos testes de unidade para garantir a qualidade de nossos projetos. Chegou a hora e escrever nosso primeiro teste unitário e consequentemente entender como o JUnit funciona, mas antes vamos criar um novo projeto Java e vamos instalar o JUnit.
Criando um novo projeto Java
Você pode utilizar a IDE de sua preferência, mas aconselho fortemente a utilização do IntelliJ IDEA em sua versão Community, por ser uma excelente IDE e ainda por cima ser free.
Com a IntelliJ IDEA aberta, vá em File > New > Project...
Na tela que irá se abrir, dê um nome ao seu projeto, selecione uma pasta em seu computador para armazenar o projeto, defina a linguagem como Java, o Build System como Maven, a versão do JDK como 17 e clique em Create
Prontinho, seu projeto está criado :)
Instalando e configurando o JUnit
Em nosso arquivo pom.xml, vamos incluir o seguinte trecho de código no final da tag project
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.9.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<version>5.9.1</version>
<scope>test</scope>
</dependency>
</dependencies>
Se você estiver utilizando o IntelliJ IDEA, esse ícone será exibido sobre o seu editor de código. Basta clicar nele para realizar a instalação da dependência do JUnit
Prontinho, o JUnit foi instalado em seu projeto
Escrevendo o primeiro teste unitário
Por mais estranho que possa parecer, o ideal é escrever antes os testes de software para só então escrever a implementação de nosso código fonte, essa abordagem trás uma série de benefício, sendo uma dela o melhor entendimento das regras de negócio de nossa aplicação, porém isso é algo bem complicado para quem está iniciando no cenário de testes, por esse motivo vamos fazer do método tradicional: Primeiro faz, depois testa.
Nosso projeto será um simples gerador de senhas. Deve ser possível:
Gerar senhas numéricas
Gerar senhas alphanuméricas
Gerar senhas fortes (Com caracteres especiais)
Definir a quantidade de caracteres das senhas
Temos as seguintes regras para nossa aplicação:
Não deve ser possível gerar uma senha com menos de 4 digitos
Não deve ser possível gerar uma senha com mais de 100 digitos
Senhas alphanuméricas deve possuir pelo menos 1 letra e pelo menos 1 número inteiro
Para isso vamos criar nossa primeira classe dentro de um pacote chamado service
package org.example.service;
import java.util.Random;
public class GeradorDeSenhas {
public String gerarSenhaNumerica(int tamanho) {
String senha = "";
Random random = new Random();
int MAIOR_VALOR_POSSIVEL = 9;
for (int i = 0; i < tamanho; i++) {
int numeroAleatorio = random.nextInt(MAIOR_VALOR_POSSIVEL + 1);
senha = senha.concat(String.valueOf(numeroAleatorio));
}
return senha;
}
}
Essa é a primeira versão de nosso método para gerar senhas numéricas. Para realizar um teste automatizando vamos criar uma classe chamada GeradorDeSenhasTest, dentro do pacote org.example.service, dentro do nosso diretórios de testes.
Nosso primeiro teste será da seguinte forma:
package org.example.service;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
public class GeradorDeSenhasTest {
@Test
@DisplayName("Deve ser possível gerar uma senha numérica com 8 digitos")
public void testGerarSenhaNumericaComOitoDigitos() {
// Arrange
int tamanho = 8;
GeradorDeSenhas geradorDeSenhas = new GeradorDeSenhas();
// Act
String senhaGerada = geradorDeSenhas.gerarSenhaNumerica(tamanho);
// Assert
Assertions.assertEquals(tamanho, senhaGerada.length());
}
}
Vamos analisar cada trecho desse código:
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
As linhas acima são responsáveis por importar os módulos que utilizaremos para:
Definir a annotation
@Test
que informará para o JUnit que aquele método em específico é um método de testeExecutar a asserção, ou seja, a verificação de que algo está conforme esperado.
@Test
@DisplayName("Deve ser possível gerar uma senha numérica com 8 digitos")
public void testGerarSenhaNumericaComOitoDigitos() {}
Como informado acima, o trecho
@Test
é uma annotation responsável por indicar que se trata de um método de test. Essa annotation sempre deve existir antes de um método que realizará um test no JUnit.@DisplayName
é uma annotation opcional. Se você não informá-la o nome que será exibido durante a execução do teste será o nome do método. Então ela funciona como um "Apelido" para o seu testO método criado é um método comum do Java.
Normalmente separamos nosso código de testes em 3 ou 5 partes, nesse caso serão só 3 partes porque por enquanto não teremos nenhum Mock.
A primeira parte é a definição dos dados que precisamos para nosso teste
// Arrange
int tamanho = 8;
GeradorDeSenhas geradorDeSenhas = new GeradorDeSenhas();
A segunda parte é execução do seu código a ser testado
// Act
String senhaGerada = geradorDeSenhas.gerarSenhaNumerica(tamanho);
E por fim, a terceira parte é verificar se o valor retornado é de fato o que você esperava
// Assert
Assertions.assertEquals(tamanho, senhaGerada.length());
Agora vamos executar nossa classe de testes
Se você digitou tudo corretamente, o resultado final será algo como:
Show de bola, conseguimos escrever nosso primeiro teste, sei que ainda é muito simples, mas nos próximos posts vamos deixar ele cada vez mais robusto e completo. Aguardo vocês lá!