Testes parametrizados com Junit 5

Com a versão mais recente do Junit ficou muito simples de fazer testes “parametrizados”, onde, com apenas um método, é possível fazer testes em vários cenários.

Neste post vamos ver dois cenários:

@CsvSource

@ValueSource

Inicialmente a dependência do Junit em seu projeto deve estar assim:

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter</artifactId>
    <version>5.6.2</version>
    <scope>test</scope>
</dependency>

Com a dependência correta, o nosso primeiro teste já pode ser escrito:

@ParameterizedTest
  @CsvSource({
      "AAA,AAA",
      "ALL,ALL",
      "VMM,VMM"
  })
  public void deveChecarValor(final String input, final String expected) {
    assertEquals(expected, input);
  }
  • @CsvSource recebe um array de valores em formato “CSV”.
  • Repare que nosso teste é anotado com @ParameterizedTest.
  • O método tem duas entradas que representam os valores separados por “,".
  • Também é possível fazer o teste usando um arquivo “.csv”
    • @CsvFileSource(resources = “arquivo.csv”, numLinesToSkip = 1)
      • resouces: é o nome do arquivo
      • numLinesToSkip: arquivos csv iniciando com o cabeçalho na primeira linha, se esse for o caso, esse parâmetro diz para pular a primeira linha, ou o número de linhas passado como valor.

O método é executado 3 vezes, cada uma passando os valores por linhas, e caso tenha algum erro em um dos cenários, o Junit mostra qual deles deu erro:

@ParameterizedTest
@CsvSource({
    "AAA,AAA",
    "ALL,AYY",
    "VMM,VMM"
})
public void deveChecarValor(final String input, final String expected) {
    assertEquals(expected, input);
}

Resultado:

org.opentest4j.AssertionFailedError:
Expected :AYY
Actual   :ALL

A outra interface que podemos utilizar é a @ValueSource:

@ParameterizedTest
@ValueSource(ints = {
    2,
    4,
    6
})
public void numerosPares(final Integer input) {
    assertEquals(0, input % 2);
}
  • @ValueSource recebe o tipo e um array com os valores
    • Os tipos podem ser:
      • ints
      • strings
      • booleans
      • byte
      • char
      • double
      • short
      • etc….

A ideia é a mesma do @CsvSource mas recebendo apenas um valor.