|
| 1 | +# Introdução |
| 2 | + |
| 3 | +Aprender testes de unidade não para após dominar as habilidades técnicas. Tem muito mais coisas envolvidas do que só escrever testes. Você sempre deve se esforçar para alcançar o melhor retorno do tempo investido escrevendo testes de unidade, minimizando o esforço e maximizando os benefícios que eles oferecem. |
| 4 | + |
| 5 | +Projetos que alcançam esse equilíbrio crescem sem esforço, não precisam de muita manutenção, e podem se adaptar rapidamente a mudanças. |
| 6 | + |
| 7 | +## A definição de "teste de unidade" |
| 8 | + |
| 9 | +Testes de unidade são uma técnica de teste em que as menores partes testáveis de uma aplicação, chamadas unidades, são individualmente e independentemente verificadas para validar seu comportamento correto. |
| 10 | + |
| 11 | +Uma unidade é um "caso de uso" dentro do sistema e sempre tem um "ponto de entrada" e um "ponto de saída". Um exemplo simples é uma função que calcula algo e retorna um valor. Vale ressaltar que uma unidade pode ser uma função, várias funções, ou até mesmo vários módulos ou componentes. |
| 12 | + |
| 13 | +## Pontos de Entrada e pontos de saída |
| 14 | + |
| 15 | +Um ponto de entrada é algo que podemos acionar de fora (via testes ou código de produção) e resulta em algo: retorna um valor, altera um estado ou faz uma chamada para algo externo. |
| 16 | + |
| 17 | +O código abaixo mostra uma exemplo simples de unidade. |
| 18 | + |
| 19 | +```js |
| 20 | +function sum(a, b) { |
| 21 | + return a + b; |
| 22 | +} |
| 23 | +``` |
| 24 | + |
| 25 | +Nesse caso, a função é o ponto de entrada, e como a chamada da função resulta em um valor retornado, ele é o ponto de saída. |
| 26 | + |
| 27 | +## Um teste do zero |
| 28 | + |
| 29 | +Um teste é basicamente um código que dispara um erro quando o resultado da execução é diferente do esperado. O exemplo a seguir mostra o que seria um teste sem o uso de nenhum framework. |
| 30 | + |
| 31 | +```js |
| 32 | +const result = sum(6, 4); |
| 33 | +const expected = 10; |
| 34 | + |
| 35 | +if (result !== expected) { |
| 36 | + throw new Error(`${result} is not equal to ${expected}`); |
| 37 | +} |
| 38 | +``` |
| 39 | + |
| 40 | +É possível adicionar mais testes com variações nos inputs usando o mesmo ponto de entrada. Para isso, provalvemente você vai querer ter métodos genéricos para usar em todos os testes. |
| 41 | + |
| 42 | +```js |
| 43 | +function expect(result) { |
| 44 | + return { |
| 45 | + toEqual(expected) { |
| 46 | + if (result !== expected) { |
| 47 | + throw new Error(`${result} is not equal to ${expected}`); |
| 48 | + } |
| 49 | + }, |
| 50 | + }; |
| 51 | +} |
| 52 | + |
| 53 | +export function test(title, callback) { |
| 54 | + try { |
| 55 | + callback(); |
| 56 | + console.log(`PASSED: ${title}`); |
| 57 | + } catch (error) { |
| 58 | + console.error(`FAILED: ${title}`); |
| 59 | + console.error(error); |
| 60 | + } |
| 61 | +} |
| 62 | + |
| 63 | +test("sum with 6 and 4 is equal 10", () => { |
| 64 | + const result = sum(6, 4); |
| 65 | + expect(result).toEqual(10); |
| 66 | +}); |
| 67 | + |
| 68 | +test("sum with 2 and 3 is equal 5", () => { |
| 69 | + const result = sum(2, 3); |
| 70 | + expect(result).toEqual(5); |
| 71 | +}); |
| 72 | +``` |
| 73 | + |
| 74 | +Observe como os testes são fáceis de ler e escrever com apenas alguns métodos utilitários. Frameworks de teste fornecem mais métodos como esses, facilitando ainda mais a escrita de testes. |
0 commit comments