O que fazer quando você se perder nos testes de API?

(12 de maio de 2020)

Se você não está escrevendo testes ainda, você deve começar. Os testes irão melhorar a qualidade do seu código, reduzir bugs e provavelmente forçar você a pensar mais sobre design e qualidade. Na verdade, a coisa mais difícil é começar e descobrir que tipo de teste escrever.

Então você começa a pesquisar no Google e encontra muitos tipos de teste: unidade, integração, aceitação, funcional, sistema, fumaça, e2e… Alguns recursos dirão que você precisa ter 100\% de cobertura, alguns dirão que cobertura total não significa que seu código foi totalmente testado. Mesmo quando você decide que tipo de teste usar, pode ser difícil decidir como testar alguma lógica específica em seu aplicativo.

Não desista! Temos algumas dicas que aprendemos ao longo do caminho e esperamos que tornem sua vida mais fácil.

Não tente testar tudo apenas com testes funcionais

Este é o erro número um os desenvolvedores fazem em testes. Então, vamos deixar isso claro primeiro.

Testes funcionais em REST Api significariam enviar solicitação em um endpoint e declarar sua resposta. Se sua rota tem vários casos diferentes nos quais a lógica de domínio pode funcionar, você precisa escrever um teste separado para cada caso para ter certeza de que todos funcionam.

Isso pode funcionar até em um aplicativo muito pequeno, mas como assim que seu aplicativo crescer, isso se tornará muito difícil de manter e eles serão muito lentos. Em algum ponto, você começará a perder mais tempo consertando e mantendo testes do que realmente trabalhando em seu aplicativo. Não é disso que se tratam os testes. Aprendemos isso da maneira mais difícil.

A pirâmide de teste

A pirâmide de teste é um gráfico que nos informa quanto teste você deve escrever em cada camada.

Camadas inferiores são mais rápidos e é por isso que precisamos cobrir o máximo possível com testes de unidade e integração. Quanto mais alto nível você obtém, menos testes você deve fazer. Você ouvirá nomes diferentes para camadas individuais, mas a lógica por trás delas é a mesma.

A pirâmide de teste

Testes de unidade

Então, vamos começar do início – Testes de unidade. Aqui está uma definição:

O teste de unidade é um nível de teste de software em que unidades / componentes individuais de um software são testados. O objetivo é validar se cada unidade separada do software funciona conforme o esperado. Uma unidade é a menor parte testável de qualquer software.

Isso significa que você deve testar cada método isoladamente e simular todos os outros métodos.

Não é testes de unidade, é você!

Os testes de unidade não são bons apenas para garantir que seu código funcione, mas também o farão refatorar. Eles devem ser fáceis de escrever. Se você tem dificuldade em testar uma parte específica do código, isso significa que seu código está mal escrito e deve ser refatorado. Princípios SOLID irão ajudá-lo aqui. SOLID é um conjunto de princípios de design para escrever código limpo, elegante e legível. Se você escrever código sólido, os testes de unidade serão moles.

Então, basicamente, com os testes de unidade, você garante que cada método isolado em seu código funcione como deveria. Isso significaria que todo o código funciona conforme o esperado, certo? Na verdade não. Você também precisa ter certeza de que os componentes individuais funcionam bem juntos. E é aí que vêm os testes de integração.

Testes de integração

O teste de integração é a fase de teste de software em que módulos de software individuais são combinados e testados como um grupo.

Um bom exemplo quando o teste de unidade não é suficiente é a consulta de banco de dados construtores. Nos testes de unidade, você pode ter certeza de que chamou as condições que deseja na consulta, mas se a sua consulta for mais complicada, você não pode ter certeza de que as condições usadas retornarão o resultado esperado até que você faça uma chamada real para o banco de dados. Então é aqui que o teste de integração que executa a consulta em um banco de dados de teste e afirma os resultados esperados deve vir.

Casos em que você precisa de testes de integração:

  • Verificando a integração correta com o 3rd bibliotecas de terceiros ou APIs
  • Verificação de dois ou mais módulos que possuem testes de unidade funcionam juntos como esperado

Testes funcionais

O teste funcional é definido como o teste da funcionalidade completa de algum aplicativo.

Eles são muito mais simples de escrever na API em comparação com um aplicativo com uma interface de usuário. Os testes funcionais da API devem consistir no envio de solicitações reais aos endpoints da API e na validação do formato da resposta. Você deve testar cada rota para resposta de sucesso e erro.

Mas não exagere, você não precisa de um teste para cada erro possível. Isso já deve ser coberto por testes de unidade e integração.Aqui, você apenas deseja garantir que sua rota retorne o formato de resposta correto para um erro. Se suas rotas têm funções diferentes, você também deve testar a resposta de erro de segurança.

Aqui estão algumas ferramentas úteis para tornar seus testes funcionais mais fáceis de escrever:

  • PHP Matcher – Biblioteca que permite que você compare sua resposta com os padrões. Você pode definir qual padrão espera para cada campo em sua resposta, em vez de declarar valores reais em seu banco de dados. Dessa forma, você pode testar apenas o formato de resposta e os tipos de campo sem se preocupar se alguma string ou número mudou em seu banco de dados de teste.
  • Testes Postman – você pode escrever seus testes funcionais no Postman, que é muito útil para a equipe de front-end, eles serão capazes de verificar e experimente seus endpoints da API. Será como uma documentação de API interativa. Você pode integrar testes Postman com Newman – executor de linha de comando que permite executar testes na linha de comando e integrá-los em Integração contínua (CI) .
  • Faker – biblioteca para gerar dados falsos para seu banco de dados de teste

Indo um passo adiante

Agora que você sabe que seu código funciona, você pode verificar seu desempenho.

Teste de carga

Teste de carga verifica se sua api está respondendo como esperado a vários servidores.

Teste de estresse

Verificando se a API funciona conforme o esperado ao receber um grande número de solicitações ao mesmo tempo.

Eu preciso ter 100\% de cobertura?

100\% de cobertura não garante que seu código seja totalmente testado e funcionando. Isso significa apenas que os testes usaram cada linha do seu código, mas com certeza ajuda a executar a cobertura do código para ver se você deixou de cobrir algumas partes do seu código.

Aprendemos que não nos beneficiamos escrevendo testa métodos simples como getters e setters. Eles levam tempo para escrever e manter, especialmente em grandes projetos.

Embora os testes eliminem a maioria dos possíveis bugs, ainda haverá alguns casos extremos nos quais você não pensou. Se aparecer um bug, certifique-se de reproduzi-lo com novos testes primeiro e, em seguida, corrija o código. Dessa forma, sua cobertura melhorará e você terá a certeza de cobrir esse caso. Essa também pode ser uma ótima maneira de começar a cobrir seus projetos legados que ainda não têm testes.

Aqui estão algumas ferramentas úteis para verificar a qualidade de seu código e testes:

  • Infecção – ferramenta para teste de mutação. Teste de mutação avalia a qualidade dos testes existentes. O teste de mutação modifica um programa em pequenas maneiras e espera que seus testes falhem, o que significa que o mutante será morto. Para cada teste aprovado, o mutante permanece vivo. Os conjuntos de testes são medidos pela porcentagem de mutantes que eles matam. O teste de mutação fornece um critério de teste denominado Indicador de pontuação de mutação (MSI) . O MSI mede a eficácia de um conjunto de testes em termos de sua capacidade de detectar falhas. Você também pode integrá-lo ao CI e definir o MSI mínimo necessário para que o CI seja aprovado.
  • PHPStan – PHPStan se concentra em encontrar erros em seu código sem realmente executá-lo. Ele detecta classes inteiras de bugs antes mesmo de você escrever testes para o código. Ele move o PHP para mais perto de linguagens compiladas no sentido de que a exatidão de cada linha do código pode ser verificada antes de executar a linha real.
  • Integração contínua (CI) – permite que você execute seus testes no git em cada commit. Isso o impedirá de mesclar PR-s com testes com falha.

Conclusão

É fácil se perder em todas as coisas que você encontra sobre como escrever testes. O principal objetivo do teste deve ser garantir que seu código funcione e seja fácil de manter. Se você for novo em testes, pode parecer que eles levam muito tempo, mas não desista, uma vez que você os tenha, tornará sua vida de codificação muito mais fácil e rápida. 🙂

Esta peça criativa foi postada originalmente no Locastic.com – https://locastic.com/blog/what-to-do-when- you-get-lost-in-api-testing /

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *