Introdução ao Teste de Software: Fundamentos e Técnicas
Tags: testing, programming, beginners, softwaredevelopment
Published: 2024-02-18 17:53:43

O teste de software é uma componente indispensável do desenvolvimento de software, com foco em assegurar que o software funciona conforme previsto. Esta prática envolve a execução do software com o objetivo de identificar quaisquer irregularidades ou defeitos. Alguns exemplos comuns de falhas incluem: erros de runtime (*crash*), resultados incorretos, incapacidade do usuário de executar uma operação do software, respostas fora do padrão, senhas não ofuscadas ao serem digitadas, e links quebrados.

## Fundamentos do Teste de Software 📚

Um dos fundamentos primordiais do teste de software é a distinção entre teste funcional (ou caixa-preta) e teste estrutural (ou caixa-branca).

### Teste Funcional (Caixa-Preta) 🎁

O teste funcional, frequentemente referido como teste de caixa preta, concentra-se na funcionalidade do software. O código interno do software não é considerado neste tipo de teste. Em vez disso, o teste é realizado com base nos requisitos funcionais do software.

Por exemplo, se tivermos um programa em JavaScript que calcula a soma de dois números, um teste funcional pode se parecer com isto:

```jsx
test('testa soma', () => {
   const calc = new Calculadora();
   const resultado = calc.soma(2, 3);
   expect(resultado).toBe(5);
});

```

Se quiser saber mais sobre teste de caixa preta, [há um artigo meu mais detalhado aqui](https://dev.to/vanscript/teste-funcional-ou-caixa-preta-black-box-uma-introducao-descomplicada-5c9l).

### Teste Estrutural (Caixa Branca) 📦

O teste estrutural, também conhecido como caixa branca, é um tipo de teste de software que se concentra no código interno do software. Este teste visa garantir que o código esteja funcionando corretamente.

Usando o mesmo exemplo do programa em JavaScript, um teste estrutural poderia focar em verificar se a função de soma está corretamente implementada:

```jsx
test('testa soma', () => {
   const calc = new Calculadora();
   const resultado = calc.soma(2, 3);
   const esperado = 2 + 3;
   expect(resultado).toBe(esperado);
});

```

## Técnicas de Teste 🔧

Há uma variedade de técnicas de teste disponíveis para desenvolvedores de software. Algumas incluem o teste baseado em estados e o teste de mutação.

### Teste Baseado em Estados 🌟

O teste baseado em estados é uma técnica de teste que se concentra em testar as diferentes transições de estado de um programa. Esta é uma técnica útil para programas que possuem um número claro de diferentes estados e transições entre eles.
Um exemplo de teste de estado que verifica se o status do login do usuário é verdadeiro, o que indica que o login foi bem-sucedido:

```jsx
test('testa estado do login', () => {
   const user = new User();
   user.login('username', 'password');
   expect(user.isLoggedIn()).toBe(true);
});

```

### Teste de Mutação 🧬

O teste de mutação é uma técnica de teste que envolve a modificação do código do programa para criar uma versão "mutante", e em seguida, executar o conjunto de testes contra esta versão. Se o conjunto de testes não consegue distinguir entre o programa original e o mutante, então o teste falhou.

No exemplo abaixo, uma função original "soma" é alterada para criar uma versão "mutante" onde o operador '+' é substituído por '-'. O teste então compara o resultado da função original e da função mutante. Se os resultados forem iguais, o teste falhará, indicando que o teste não conseguiu detectar a mutação (alteração) feita no código:

```jsx
// código original
function soma(a, b) {
  return a + b;
}

// código mutante
function soma(a, b) {
  return a - b; // operador '+' foi substituído por '-'
}

test('testa mutação na função soma', () => {
   const resultadoOriginal = soma(3, 2);
   const resultadoMutante = soma(3, 2);
   expect(resultadoOriginal).not.toBe(resultadoMutante);
});

```

### Teste de Regressão ⏮️

O teste de regressão é uma técnica de teste que assegura que as mudanças recentes no código não afetaram as funcionalidades existentes. É comummente usado após a implementação de uma nova funcionalidade ou correção de defeitos.

O teste abaixo verifica a funcionalidade de soma após a implementação de uma nova funcionalidade. Ele cria um novo objeto do tipo Calculadora, utiliza o método "soma" para somar 2 e 3, e então verifica se o resultado é igual a 5. Se o resultado for 5, o teste passa. Se não for, o teste falha:

```jsx
test('testa soma após implementação de nova funcionalidade', () => {
   const calc = new Calculadora();
   const resultado = calc.soma(2, 3);
   expect(resultado).toBe(5);
});

```

## Conclusão

O teste de software é uma prática crucial que contribui para garantir que o software é robusto e livre de defeitos. Não podemos esquecer o quanto o teste de software é essencial no ciclo de vida de desenvolvimento de software. As técnicas e conceitos que vimos são a base para construir software de qualidade e para encontrar e corrigir defeitos logo no começo, economizando tempo, esforço e recursos.

Curte aí se gostou e compartilhe com os amigos! ✨
Até a próxima e vamos testar! 🚀💕