Go Golang

9 mai, 2023

Como fazer fuzz test em requests HTTP (parte 1)

Publicidade

Na edição de 2022 da GopherCon Brasil, tive o prazer de palestrar sobre Fuzz Test. Foi muito bacana, pois durante a palestra, assim como nos corredores do evento, fizeram vários questionamentos que eu ainda não tinha feito sobre essa feature do Go.

Se você ainda não conhece esse tipo de teste, convido você a ler um post que publicamos no blog (link para o post) onde explicamos melhor o assunto.

O que vou tratar nesse post é o resultado das perguntas feitas no evento mais um link que o Ricardo Maricato me enviou.

Para ver uma das formas de implementar o Fuzz Test para requests HTTP, vamos implementar um endpoint para validação dos dados de uma pessoa.

Vamos começar criando uma struct com um método de validação, e algumas variáveis para armazenar os erros de validação que podemos ter.

Agora, vamos implementar o handler que irá fazer o decode do payload e executar as validações necessárias.

Por último, precisamos implementar nossa função main. O arquivo completo ficará assim:

Maravilha! Agora que já temos nosso endpoint implementado, vamos começar escrever a nossa função de Fuzz Test.

Podemos pensar nossa função em cinco blocos:

  • Criar alguns test cases;
  • Adicionar os test cases como Seed para o fuzz;
  • Mapear os erros conhecidos;
  • Iniciar um servidor para testes;
  • Função que irá receber os inputs gerados.

Dentro da função que irá receber os inputs, vamos realizar um POST com o input que foi gerado e depois validar se o status code é diferente de 200.

Caso seja diferente de 200, precisamos validar se o erro retornado foi um dos erros que mapeamos ou algo não esperado por nós.

O arquivo completo ficará assim:

Ao executar nosso teste com o comando go test -fuzz . -v obtive o seguinte resultado:

Dando uma olhada na pasta testdata/fuzz/FuzzValidate, conseguimos verificar qual foi o input da request que falhou.

Huummm… realmente eu não estava esperando um input fora do formato. Para resolver esse problema e deixar nosso código testável, vamos adicionar uma nova variável de erro, modificar o status e a mensagem de erro quando o payload não está no formato esperado.

Ao executar novamente o go test -fuzz . -v por mais de 1 minuto, não obtive mais nenhum erro.

Esse tipo de teste que escrevemos irá nos ajudar a validar payloads inesperados. Após esse cenário, podemos escrever um outro tipo de fuzz test para gerar inputs inesperados em um payload esperado.

Porém, para não ficar muito extenso, esse outro modo ficará para outro post.

Enquanto isso, se você quer saber mais sobre como fazer testes em Go, confira nosso curso “Testes e Benchmark“.

No mais, deixe suas dúvidas nos comentários.

Até a próxima.

*O conteúdo deste artigo é de responsabilidade do(a) autor(a) e não reflete necessariamente a opinião do iMasters.