Executando verificação de segurança...
2

A importância de ter um código testável para a qualidade do sistema.

Olá, comunidade. Vamos falar de testes?!

Qual a importância dos testes de software na qualidade do sistema?

É inegável que os testes trazem qualidade e robustez em toda aplicação. Ter um código coberto por testes evita sempre a criação de bugs, inclusive aqueles bugs misteriosos que se desenvolvem misteriosamente em toda aplicação (quem já passou por isso, sabe! Hahaha.).

Benefícios de se ter cobertura de testes nas aplicações:

  • Permite identificar erros durante o seu desenvolvimento;
  • Garante a confiança do usuário final e sua satisfação ao utilizar o software;
  • Permite assegurar a qualidade do produto e seu funcionamento;
  • Em um sistema monolítico, evita que uma implementação afete outros métodos negativamente, se afetar.

Um ponto a se observar, em termos de segurança, o primeiro passo para atingir uma vulnerabilidade é justamente encontrar um ponto em que a aplicação se comporte de uma forma que não deveria. Um exemplo: algumas vezes, quando não temos erros tratados dentro da aplicação, o usuário final pode ter acesso ao erro de uma conexão com o banco de dados, onde poderia ter acesso ao nome da tabela, talvez ao driver de uso, e quem sabe a algo pior. Por isso, é estritamente necessário que a aplicação seja coberta por testes de casos de uso. A ideia é pensar como um usuário mesmo. E se eu clicar aqui? E se eu enviar essa requisição dessa forma? Claro, nem todo usuário final vai saber sequer o que é uma requisição, mas a ideia é pensar em todas as possibilidades. Por mais idiota que possa parecer dentro do campo do "e se?", teste!

Quais são os objetivos de testar a aplicação?

  • Verificar a integração adequada dos componentes;
  • Analisar se todos os requisitos foram implementados corretamente;
  • Garantir que os defeitos encontrados sejam corrigidos antes da implantação do software;
  • Reduzir custos de manutenção corretiva e retrabalho.

Executar estas validações garante que todos estes pilares sejam atendidos e que a empresa mantenha um alto nível no mercado. Lembre-se: a ideia é crescer junto à empresa, então acrescente qualidade ao que você faz!

Tipos de testes

Testes de unidade ou unitários
Um teste unitário é basicamente o teste da menor parte testável de um sistema. Se você trabalha no paradigma funcional, por exemplo, a menor parte testável do seu sistema será uma função! Se você trabalha com orientação a objetos, então a menor parte testável do seu sistema será de um método do seu objeto.

Um exemplo, na prática, de teste unitário:

function oddOrEven(number) {
    return number % 2 == 0 ? 'Even' : 'Odd';
}

Acima eu tenho uma função que determina se o número é par ou ímpar. Para testar esse trecho, fazemos:

const result = oddOrEven(2);
expect(result).toBe('Even');

Testes de integração ou de feature
São testes utilizados para verificar a integração correta entre os componentes da aplicação, visto que já tenham sido testados em unidade. No geral, são testes de módulos, onde abrigam todo um conjunto de métodos e regras. O recomendado de ser testado nessa fase é: testes de interface e testes de dependências entre os componentes.

Um exemplo simples de teste de integração:

it('navigates to login', async () => {
    const { getByText, user } = renderWithProviders(<Routes />)

    const link = getByText('Login')

    expect(link).toBeInTheDocument()

    await user.click(link)

    const email = getByText('Fill your email')

    expect(email).toBeInTheDocument()
})

Teste end-to-end
Servem para testar todo o fluxo de aplicação, do início ao fim, daí o nome. Seu objetivo é identificar dependências do sistema e garantir que a informação certa seja passada entre vários componentes e sistemas do sistema. É uma forma de testar o sistema simulando um ambiente real, desde acesso ao banco de dados à interação entre hardwares ou sistemas. Exemplos de testes end-to-end:

  • Iniciar uma sessão em algum aplicativo ou website;
  • Finalizar uma sessão;
  • Coletar os dados do usuário e assegurar que tudo está sendo retornado e exibido corretamente etc.

E estes são os mais conhecidos, são testes automatizados que deverão rodar antes de cada deploy, para evitar que haja dor de cabeça e retrabalho. O recomendado é que rodem em cada pull request também! Algo essencial para não passar em branco, é realizar code reviews. Lembrem-se: isso também faz parte do trabalho do desenvolvedor!

Outros tipos de testes
Há diversos tipos de testes que podem entregar cada vez mais robustez para a sua aplicação. São eles:

  • Teste Operacional: É utilizado para assegurar que o sistema pode rodar por muito tempo sem apresentar problemas;
  • Teste Positivo-Negativo: É utilizado para assegurar que o sistema vai funcionar pelo caminho feliz de sua execução;
  • Teste de Caixa-Preta: É utilizado para verificar todas as entradas e saídas desejadas. É ignorado a estrutura interna do código, detalhes de implementação ou cenários de execução internos no software, focando apenas nos requisitos funcionais do sistema;
  • Teste Caixa-Branca: É utilizado para testar o código. Garante a análise de todos os caminhos independentes de cada módulo, programa ou método;
  • Teste Funcional: É utilizado para validar as funcionalidades, requisitos e regras de negócios;
  • Teste de Interface: É utilizado para verificar se a navegabilidade e os elementos da tela estão funcionando corretamente, bem como se atende melhor o usuário;
  • Teste de Performance: É utilizado para verificar se o tempo de resposta do sistema é o desejado;
  • Teste de Carga: É utilizado para analisar se o sistema vai funcionar como o esperado mesmo havendo uma quantidade grande de usuários simultâneos;
  • Teste de Volume: É utilizado para testar a quantidade de dados envolvidos;
  • Testes de Estresse: É utilizado para testar o sistema em situações inesperadas;
  • Testes de Configuração: É utilizado para verificar se o sistema vai funcionar em diferentes hardware e software;
  • Teste de Compatibilidade: É utilizado para verificar se o sistema funciona corretamente em diferentes navegadores e sistemas operacionais;
  • Testes de Segurança: É utilizado para testar a segurança do sistema ou aplicação, usando diversos tipos de perfis e permissões.

Os testes manuais também são importantes! Uma coisa muito legal que eu aprendi atualmente é a realizar testes pelo Postman. É muito interessante essa forma de testar, pois asseguram todo o fluxo em um ambiente de homologação, que é o mais próximo que podemos chegar de um ambiente de produção. Outro teste interessante também é o teste de fumaça, que visa testar as funcionalidades básicas da aplicação, para verificar se nada foi afetado depois de determinado deploy.

Minhas considerações

Eu já trabalhei em sistemas gigantescos, com mais de 100 rotas que haviam apenas 30 testes, e a maioria unitário. Haviam vários packages descontinuados em utilização e o resultado não é outro. Diversos e diversos bugs. O problema não é ser legado, o problema é não ter responsabilidade com algo que está fazendo. A evolução da sua carreira não vai partir de outrém além de você!

O início de testes pode parecer algo complicado, você normalmente não tem muitas ideias do que se pode ser testável, mas a experiência vai te dar tudo que você precisa! Não se preocupe. Apenas tenha a vontade de querer sempre evoluir. Não tornem os testes opcionais! Seja um desenvolvedor consciente. Nós somos vários, e cada vez mais a área cresce e cada vez mais surgem novos profissionais, vise o que lhe dará destaque. Não seja apenas mais um.

Carregando publicação patrocinada...
2

muito bom o material.
vou usá-lo para passar para o time.

Certamente testes de software e um fator que faz diferença no nosso trabalho de desenvolvimento.

1