Resultado de imagem para unit test

Praticando testes unitários com Projeto Euler

Alef Carlos
Bee Lab Academy
Published in
4 min readJan 8, 2019

--

Esse artigo é a continuação do anterior no qual eu crio um projeto do zero com um simples método de soma.

Bom dia. Boa tarde. Boa noite.

Nesse artigo vamos explorar mais casos de testes assim como novos métodos do Shouldly.

Para praticar testes unitários escolhi um projeto chamado Projeto Euler com diversos problemas matemáticos. Precisaremos criar os algoritmos — ou copiar do StackOverflow.

E sabe o que é interessante ? Nós podemos utilizar esses problemas para aprender outra linguagem ou até mesmo estudar a fundo nossa linguagem ganha pão. Aprofundar conhecimentos Estrutura de Dados… Temos diversos usos !

Aqui vamos focar em aprender a testar ;)

Ao acessar o site vemos uma lista com diversos enunciados. Vamos selecionar os 3 primeiros e começar a entender.

Multiples of 3 and 5

If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23.

Find the sum of all the multiples of 3 or 5 below 1000.

Analisando esse enunciado já conseguimos extrair algumas coisas:

  • Precisaremos de um método que valide um múltiplo
  • Precisaremos de um método que faça a soma desses múltiplos

Para tornar bem didático irei separar o máximo possível de método para termos bastante código para criar testes.

Métodos auxiliares

Vamos criar um método na nossa classe Helpers — no projeto Problems — chamado IsMultipleOf que recebe dois argumentos e válida se x é múltiplo de y.

Para validar se um número é múltiplo de outro basta verificarmos se o resto da divisão é 0.

Olha que interessante: temos três testes unitários para fazer:

  • Verificar se y = 0
  • Verificar se o resultado é true
  • Verificar se o resultado é false

Agora vamos criar os testes no projeto Problems.Test para esse método.

Exception

O Shouldly já tem uma asserção específica para Exceptions: ShouldThrow.

No arquivo HelpersTest.cs vamos adicionar mais um teste:

Observações:

  • Manter convenção do nome do teste
  • Utilizamos Fact, pois não temos mais casos para testar.
  • Devemos simplesmente executar o código e deixa a Exception estourar

Ao executar o teste acima temos o retorno um Output de sucesso.

Should.Throw recebe um argumento do tipo Action e então valida se ao executar a exceção do tipo ArgumentException foi disparada.

Vamos criar agora um teste unitário para verificar se nosso código está fazendo a verificação correta.

Observações:

  • Convenção do nome do teste.
  • Utilizamos Theory, pois queremos testar diversos casos.
  • Utilizando o extension method ShouldBeTrue()

Nós utilizamos os valores exibidos no enunciado para comprovar que nosso método está funcional.

Quando executamos o resultado é o seguinte:

E agora o teste mais importante: passar valores que não são múltiplos devem FALHAR!

Observações:

  • Convenção do nome do teste.
  • Utilizamos Theory, pois queremos testar diversos casos.
  • Utilizando o extension method ShouldBeFalse()

A execução do teste deve ser sucesso, pois 5 não é múltiplo 3 assim como 1 não é múltiplo de 3.

Quando eu disse no artigo anterior que devemos testar cada trecho do código é esse o exemplo.

Agora vamos para o método de resolução do problema que é descobrirmos qual é a soma de todos os múltiplos de 3 ou 5 abaixo de 1000.

Método da solução

No arquivo Helpers.cs vamos criar o seguinte método:

Observações:

  • Adicionado using System.Linq para extendermos as operações com arrays.

Explicando o método:

O primeiro argumento max indica o valor máximo que devemo pesquisar por múltiplo. Já o argumento possibleMultiples é um com todos os múltiplos que queremos buscar valores.

Iteramos de 1 até o valor de max e verificamos se o value atual corresponde a um múltiplo válido de algum elemento do array, se sim, somamos.

Vamos agora criar o método de teste. Aqui iremos criar um novo arquivo de teste chamado ProblemsSolutionTest.cs, fazemos isso para manter separado os testes unitários dos Helpers e das soluções.

O novo arquivo criado terá o conteúdo:

Observações:

  • Utilizamos Theory, pois queremos validar vários casos
  • Utilizamos os resultados dados pelo enunciado para validação
  • Um dos argumento do InlineData é um array de inteiros.

Executando esse teste o resultado será sucesso.

Mas e o resultado do desafio? A soma de todos os múltiplos de 3 ou 5 abaixo de 1.000?

Nós podemos fazer da seguinte forma, adiciona um novo InlineData com o valor que desejamos:

[InlineData(1000, new int[] { 3, 5 }, 0)]

Ao rodar novamente o teste unitário ocorrerá um erro, pois ele tentará validar o resultado com 0.

E aqui também vemos um exemplo de erro utilizando Shouldly.

Então vamos corrigir o nosso teste e executar novamente:

[InlineData(1000, new int[] { 3, 5 }, 233168)]

E agora o resultado é um sucesso.

A resposta para o desafio é 233.168.

Os códigos desse e dos outros desafios estão nesse repositório.

No próximo artigo falaremos sobre Cobertura de testes.

--

--

Alef Carlos
Bee Lab Academy

Desenvolvedor por paixão, arquiteto de software por profissão.