Artigo original: JUnit Test with Maven in VSCode

Escrito por: Clark Jason Ngo

Instalar o VSCode

Configuração aqui: Configurando o Visual Studio Code

Instalar e criar um projeto do Maven

Guia de instalação completo aqui: Maven – Maven em 5 minutos (em inglês)

Se você tem o Maven instalado, siga estas etapas:

Gerar o projeto

mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4 -DinteractiveMode=false

Mudar para o diretório do projeto

cd my-app

Construir o projeto

mvn package

Testar e compilar o projeto

java -cp target/my-app-1.0-SNAPSHOT.jar com.mycompany.app.App

Você deve obter uma saída com: Hello World!

Modificar nosso projeto

Vamos começar criando funções matemáticas simples

Procure o arquivo App.java e substitua o conteúdo por este código:

package com.mycompany.app;

public class App 
{
  public static int add(int firstNumber, int secondNumber) {
    return firstNumber + secondNumber;
  }

  public static int multiply(int multiplicand, int multiplier) {
    return multiplicand * multiplier;
  }

  public static int divide(int dividend, int divisor) {
    if (divisor == 0)
      throw new IllegalArgumentException("Cannot divide by zero (0)."); // Não pode dividir por zero (0).

    return dividend / divisor;
  }
  public static void main( String[] args )
  {
    System.out.println(App.add(3, 3)); 
  }
}

Procure por AppTest.java e substitua o conteúdo por este código:

package com.mycompany.app;

import static org.junit.Assert.assertTrue;

import org.junit.Assert;
import org.junit.Test;

/**
* Teste unitário para App simples. 
*/ 
public class AppTest 
{
    /**
    *Teste Rigoroso :-)
    */
    @Test
    public void shouldAnswerWithTrue() // deveResponderComVerdadeiro
    {
        assertTrue( true );
    }
    @Test
    public void add_TwoPlusTwo_ReturnsFour() { // adicionar_DoisMaisDois_RetornaQuatro
      // Organizar
      final int expected = 4;

      // Agir
      final int actual = App.add(2, 2);

      // Afirmar
      Assert.assertEquals(expected, actual);
    }    
    @Test
    public void multiply_FourTimesTwo_ReturnsEight() { // multiplicar_QuatroVezesDois_RetornaOito
      // Organizar
      final int expected = 8;

      // Agir
      final int actual = App.multiply(4, 2);

      // Afirmar
      Assert.assertEquals(expected, actual);
    }        

    @Test
    public void divide_TenDividedTwo_ReturnsFive() { // dividir_DezDivididoPorDois_RetornaCinco
      // Organizar
      final int expected = 5;

      // Agir
      final int actual = App.divide(10, 2);

      // Afirmar
      Assert.assertEquals(expected, actual);
    }           
}

Você pode continuar criando testes como, por exemplo:

@Test    
public void multiply_FiftyTimesTwo_ReturnsOneHundred()  // multiplicar_CinquentaVezesDois_RetornaCem
{      
  // // Organizar
  final int expected = 100;        
  // // Agir
  final int actual = App.multiply(50, 2);        
  // // Afirmar
  Assert.assertEquals(actual, expected);    
}

Construir o projeto

mvn package

Saída:

[INFO] -------------------------------------------------------
[INFO]  T E S T S
[INFO] -------------------------------------------------------
[INFO] Running com.mycompany.app.AppTest
[INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.026 s - in com.mycompany.app.AppTest
[INFO] 
[INFO] Results:
[INFO] 
[INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0

Testar e compilar o projeto

java -cp target/my-app-1.0-SNAPSHOT.jar com.mycompany.app.App

Saída:

6
Hello World!

Uma maneira alternativa de executar os testes é clicar em Run Test dentro de AppTest.java

No exemplo abaixo, Run Test está localizado logo abaixo da linha de código 44.

1_TFBgactTWvK7ColY1YgxEw
Nos comentários, "Arrange" (organizar), "Act" (agir) e Assert (afirmar)

Visualizar testes e relatório de teste

1_uNAouJG881s3iP0rX2zeVw

Migrando do JUnit 4 para o JUnit 5

Altere as dependências do seu pom.xml para:

  <dependencies>
      <dependency>
          <groupId>org.junit.jupiter</groupId>
          <artifactId>junit-jupiter-api</artifactId>
          <version>5.4.2</version>
          <scope>test</scope>
      </dependency>
      <dependency>
          <groupId>org.junit.jupiter</groupId>
          <artifactId>junit-jupiter-engine</artifactId>
          <version>5.4.2</version>
          <scope>test</scope>
      </dependency>
  </dependencies>

Altere seu AppTest.java para:

package com.mycompany.app;

import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.assertEquals;

import org.junit.jupiter.api.Test;

/** 
* Teste unitário para App simples. 
*/
public class AppTest 
{
    /**
    * Teste Rigoroso :-)
    */ 
    @Test
    public void shouldAnswerWithTrue() // deveResponderComVerdadeiro
    {
        assertTrue( true );
    }
    @Test
    public void add_TwoPlusTwo_ReturnsFour() { // adicionar_DoisMaisDois_RetornaQuatro
      // Organizar
      final int expected = 4;

      // Agir
      final int actual = App.add(2, 2);

      // Afirmar
      assertEquals(expected, actual);
    }    
    @Test
    public void multiply_FourTimesTwo_ReturnsEight() { // multiplicar_QuatroVezesDois_RetornaOito
      // Organizar
      final int expected = 8;

      // Agir
      final int actual = App.multiply(4, 2);

      // Afirmar
      assertEquals(expected, actual);
    }        

    @Test
    public void divide_TenDividedTwo_ReturnsFive() { // dividir_DezDivididoPorDois_RetornaCinco
      // Organizar
      final int expected = 5;

      // Agir
      final int actual = App.divide(10, 2);

      // Afirmar
      assertEquals(expected, actual);
    }           
}

Adicionando cobertura de teste

Verifique o relatório de cobertura de teste

No VSCode, abra o Extension MarketPlace e pesquise Coverage Gutters

1_OjkwUa9oX9s8MNgTMG6WdQ

Clique no botão Instalar (ou Install)

Abra o arquivo pom.xml na sua pasta raiz e substitua o conteúdo pelo pom.xml no GitHub para adicionar suporte a um plug-in.

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.mycompany.app</groupId>
  <artifactId>my-app</artifactId>
  <version>1.0-SNAPSHOT</version>

  <name>my-app</name>
  <!-- IMPORTANTE troque este endereço pelo do site do projeto -->
  <url>http://www.exemplo.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-api</artifactId>
        <version>5.4.2</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-engine</artifactId>
        <version>5.4.2</version>
        <scope>test</scope>
    </dependency>
  </dependencies>


  <build>
    <pluginManagement><!-- faça o lockdown das versões dos plug-ins para evitar o uso dos padrões do Maven (pode ser movido para o pom pai) -->
      <plugins>
        <plugin>
          <groupId>org.jacoco</groupId>
          <artifactId>jacoco-maven-plugin</artifactId>
          <version>0.8.2</version>
          <executions>
              <execution>
                  <goals>
                      <goal>prepare-agent</goal>
                  </goals>
              </execution>
              <execution>
                  <id>report</id>
                  <phase>prepare-package</phase>
                  <goals>
                      <goal>report</goal>
                  </goals>
              </execution>
          </executions>
        </plugin>
        <!-- Ciclo de vida limpo; consulte https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle (em inglês) -->
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <!-- Ciclo de vida padrão, empacotamento em jar; consulte https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging (em inglês) -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.22.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-jar-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
        <!-- Ciclo de vida do site; consulte https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle (em inglês) -->
        <plugin>
          <artifactId>maven-site-plugin</artifactId>
          <version>3.7.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-project-info-reports-plugin</artifactId>
          <version>3.0.0</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>

Abra o terminal no VSCode e execute

mvn install
mvn clean jacoco:prepare-agent install jacoco:report

Abra seu arquivo App.java na pasta main/java/com/mycompany/app e clique no botão Watch para verificar o relatório

1_eRmrtwQ23Gp6IGXRwphLvA

Barra vermelha: código de teste não coberto

Barra amarela: condição não coberta

Barra verde: código coberto

Abra o arquivo index.html na sua pasta root/target/site/jacoco.

Para abrir:

Eme seguida, cole (Ctrl + V para Windows e Command + V para MacOS) o caminho no seu navegador.

1_jj1o8eqXMZ27xK9crCng9w

Você pode ver um relatório de cobertura de teste muito detalhado:

1_LIgnn-CgO6vR9hBhZZGvug

Obrigado pela leitura! 😉