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 teste

  • Executar 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 test

  • O 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á!