Testes Parametrizados no JUnit 5
Algumas vezes, quando estamos criando os cenários de testes dos nossos componentes de software, sentimos a necessidade de passar diferentes parâmetros para um mesmo cenário de teste e observar se o comportamento é o esperado.
Podemos utilizar os testes parametrizados do JUnit para receber parâmetros que podem ser utilizados como entradas ou/e referência para asserções do teste.
Para exemplificar a funcionalidade vamos utilizar o desafio da 99Taxis apresentado no QCon 2017, que contém uma massa de dados para 99 casos de teste. Cada caso de teste contém dois arquivos texto, um com informações de entrada e outro com informações da saída esperada.
.
└── sample-data
├── 0
│ ├── input
│ └── output
├── 1
│ ├── input
│ └── output
...
└── 99
├── input
└── outputCaso deseje conhecer mais sobre o desafio, veja o arquivo leia-me.
Imagine a criação destes casos de teste. Imaginou? Se escrevêssemos 99 métodos de teste para cada cenário nós iriamos perceber que o corpo de cada método seria idêntico, mudando apenas a entrada e a saída esperada. Neste caso podemos utilizar os testes parametrizados, que na nova versão poderia ser escrito da seguinte forma:
O trecho de código acima apresenta um teste parametrizado devido a presença da anotação @ParameterizedTest, que é declarada da mesma forma da anotação @Test. Além disso, utilizando a @ArgumentsSource nós declaramos uma fonte de parâmetros para cada execução que será realizada. O teste será executado enquanto houver argumentos para serem fornecidos.
Existem algumas formas já providas pelo JUnit 5 para fornecer argumentos, tais como @ValueSource, @EnumSource, @MethodSource, @CsvSource e @CsvFileSource, mas neste caso estamos implementando a nossa própria estratégia pela classe RouteArgumentsProvider, que implementa da interface ArgumentsProvider do JUnit.
A interface contém apenas um método, chamado provideArguments e retorna um Stream de instâncias de Arguments que será usado como parâmetro para o método de teste.
O trecho de código acima é responsável por ler os arquivos input e output dos 99 casos de testes presente no diretório “sample-data” e popular os objetos Route - criado para representar o domínio do problema - e passar como argumento para o método testCompress.
Conclusões
Já conversamos sobre as novidades do JUnit 5, que hoje está em sua versão Milestone 6, e desta vez exploramos um pouco mais sobre a API de testes parametrizados. Para utilizar esta funcionalidade é necessário definir a dependência do artefato junit-jupiter-param.Vale ressaltar que a API encontra-se em fase experimental e pode sofrer alterações até a sua versão final.
O código completo do exemplo apresentado pode ser encontrado no github.

