Testes de Sistema 🌐
Tags: javascript
Published: 2024-04-07 18:56:41

Testes de sistema são uma **simulação completa** de como um **usuário real** interage com o aplicativo, de ponta a ponta. São os testes mais abrangentes e, por isso, geralmente os mais **caros** e os que levam mais **tempo** para serem executados.

---

Para automatizar testes de sistemas Web em JavaScript, você pode usar ferramentas como [Selenium](https://www.selenium.dev/) ou alternativas modernas como [Cypress](https://www.cypress.io/) ou [Puppeteer](https://pptr.dev/). Essas ferramentas permitem que você escreva scripts de teste que interagem com o navegador, assim como um usuário real faria.

---

## Exemplo: Teste de Sistemas Web 💻
Essa é a forma em como você poderia escrever um teste para uma pesquisa no Google usando Puppeteer, que é uma biblioteca Node.js para controlar navegadores Headless Chrome ou Chromium:

```
// googleSearch.test.js
const puppeteer = require('puppeteer');

describe('Google Search', () => {
  it('should search for "software"', async () => {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    await page.goto('http://www.google.com');

    await page.type('input[name=q]', 'software');
    await page.keyboard.press('Enter');

    await page.waitForSelector('h3'); // Espera pelo carregamento dos resultados

    const pageTitle = await page.title();
    console.log(`Page title is: ${pageTitle}`);

    await browser.close();

    expect(pageTitle).toMatch('software - Google Search');
  }, 16000); // Aumentar o timeout para testes que podem levar mais tempo
});

```

Neste script, Puppeteer abre o navegador, vai para o Google, digita a palavra "software" na pesquisa, pressiona Enter e espera pelos resultados da pesquisa.

---

## Exemplo: Teste de um Compilador 🛠️
Se você estivesse testando um compilador em JavaScript, o teste poderia ser mais direto porque você está apenas lidando com arquivos de entrada e saída, não uma interface de usuário.

```
// compiler.test.js
const { compile } = require('./compiler');
const fs = require('fs');

describe('Compiler Tests', () => {
  it('should compile program correctly', async () => {
    const inputProgram = 'path/to/program.x';
    const expectedOutput = 'expected program output';
    
    await compile(inputProgram);

    const output = fs.readFileSync('path/to/output', 'utf8');
    expect(output).toBe(expectedOutput);
  });
});

```
Aqui, o `compile` é uma função que você escreveria para pegar o caminho para um arquivo de programa, compilar esse programa e, em seguida, você verificaria a saída contra o esperado.

---

## Considerações 🤔

- Testes de sistema devem refletir cenários de uso reais;
- Mudanças na interface do usuário ou nos sistemas externos podem quebrar seus testes, então eles precisam ser mantidos atualizados;

---

A maior parte desse conteúdo veio do livro "Engenharia de Software Moderna", escrito por Marco Tulio Valente. Esse livro é um tesouro cheio de dicas sobre como criar testes do jeito certo, usando o que tem de mais novo e eficiente no mundo da programação. Entretanto, a única diferença, é que o livro é em Java e aqui eu adaptei para utilizar Javascript.

---