# O que são testes automatizados

Quer saber como melhorar a qualidade de seus projetos e trazer mais segurança e agilidade para os seus testes? A solução são os testes automatizados!

## O que são testes automatizados

Um teste automatizado nada mais é do que um “teste comum”, que você mesmo poderia fazer em seu projeto, mas que utilizando de programação conseguimos automatizar todo o processo, ganhando em eficiência, segurança e agilidade.

Pense da seguinte forma:

- Se você precisa testar uma função X, que faz uma soma `a + b`, e você sabe que `1 + 2` é igual a `3`, crie uma função Y, que chame a função Y passando como parâmetros `a = 1` e `b = 2` e compare se o resultado é realmente `3`.
- Se você precisa testar um botão, que ao clicar apareça um modal, crie uma função que entre na página, clique no botão e confira se um novo elemento modal está sendo exibido da página
- Se você precisa conferir o desempenho de seu sistema, e uma página não pode demorar mais de 5 segundos para exibir o conteúdo, crie uma função que acesse essa página e faça uma contagem do tempo que levou

Perceba que estes testes, podem sido feitos facilmente por um “humano”, em um processo bastante natural. A ideia por trás de um teste automatizado é incluir um software que faça este trabalho para você.

## Porque fazer testes automatizados

A automação de testes vem para poupar trabalho e economizar tempo.

Em um sistema real, estes mesmos testes devem ser feitos várias e várias vezes, a cada vez que um novo recurso é implementado, a cada vez que a versão é atualizada e em diversas outras situações. Ter um “humano” fazendo estes testes é bastante cansativo e uma tarefa bem monótoma, além de levar bastante tempo.

Mas se você tem um computador por trás destes testes, eles serão feitos em uma velocidade muito maior e com um esforço muito menor, não importando quantas vezes este teste será realizado. Ter um processo automatizado também garante uma segurança e uma menor chance de erros em seu projeto.

## Como é um teste automatizado

Existem diferentes ferramentas que você pode utilizar em seu teste a depender do teste que será feito e da linguagem de programação que será usada. 

Bibliotecas bastante comuns para desenvolvimento de testes automatizados são o [Selenium](https://www.selenium.dev/) ou o  [Playwrigt](https://playwright.dev/), focadas em testes “end-to-end” —quando você testa de ponta a ponta a sua aplicação, inclusive elementos no frontend com cliques, exibição de componentes, etc. Outra bastante comum, essa para testes unitários —quando você testa apenas o próprio código de uma função, é o [Jest](https://jestjs.io/).

Com o Jest, ou em qualquer outro teste unitário, a ideia é sempre criar um contexto de teste, que simula um caso que você já conhece o resultado que deve ser retornado. Podemos apresentar nosso cenário de teste: “Sendo utilizada a função de soma, quando os parametros forem `1` e `2` , é esperado que o valor seja igual a `3`”. E este mesmo contexto, é aplicado em código:

```jsx
// Definição da função de soma
const sum = (a, b) => {
	return a + b;
};

// Contexto para testes unitários
describe('Sendo utilizada a função de soma', () => {
	test('quando os parametros forem 1 e 2', () => {
		expect(sum(1, 2)).toBe(3);
	});
});
```

Com o seguinte resultado:

```bash
PASS  ./index.test.js
  Sendo utilizada a função de soma
    ✓ quando os parametros forem 1 e 2 (2 ms)
```

Diferentes cenários de testes são criados testando cada situação possível de uso para cada função do seu código. Assim, com um único comando como `npm run test` você tem toda a sua aplicação testada.

Testes unitários como este podem ser incluídos diretamente no código da sua aplicação, e na maioria dos frameworks, este já é um recurso nativo.

## Testes automatizados na prática

Na prática, costumamos incluir estes testes como rotinas dentro do fluxo do nosso novo software: uma mudança no código? Rode a rotina de testes e confira que nenhum pedaço de código foi quebrado no caminho; uma nova demanda? Rode a rotina de testes e confira que a performance não foi afetada. 

Existem até metodologias, como o Test Driven Development, a qual é “construir o teste, antes de desenvolver”. Você desenvolve com base no próprio teste a ser realizado. É uma prática bem interessante, que iremos abordar em artigos futuros.

Mas não se engane se você acha que testes automatizados excluem o trabalho de testers e analistas de QA: um bom teste, mesmo que automatizado, é muito mais do que algo técnico, um bom teste é sempre aquele feito por alguém que entende o processo, prevê falhas e sabe o que e onde testar.

Em nossos projetos na devGo, vamos tentar sempre trabalhar com testes automatizados. Confiram nosso canal no Discord e se inscrevam em nossa newsletter para acompanhar nossos próximos conteúdos.
