Noções Básicas de Teste
10 exemplos para você começar com Testes - 7 básicos e 3 intermediários.
Pré-requisitos
- Node.js 24.18.0 com
node:testenode:assertintegrados. - Serviço TypeScript com o padrão de exportação
createApp(). - Opcional:
npm install -D tsx supertest @types/supertestpara testes de integração HTTP.
Exemplos Básicos
1. Pirâmide de Testes para APIs HTTP
Equilibre testes unitários rápidos com testes de integração e E2E mais reduzidos.
/ E2E \ poucos - jornadas críticas do usuário
/ contrato \ acordos consumidor-provedor
/ integração \ HTTP + DB com Testcontainers
/ testes unitários \ muitos - lógica pura, manipuladores com mock
- A maioria dos testes deve ser em nível unitário (milissegundos cada).
- Testes de integração provam a conexão; E2E prova o ambiente implantado.
- Testes de contrato são importantes quando vários serviços evoluem APIs independentemente.
2. Teste de Fumaça com node:test
Executador de testes sem dependências externas, integrado ao Node 24.
import assert from "node:assert/strict";
import { describe, it } from "node:test";
import { calculateTax } from "../src/billing/tax.js";
describe("calculateTax", () => {
it("aplica a taxa ao subtotal", () => {
assert.equal(calculateTax(100, 0.2), 20);
});
});node --import tsx --test test/tax.test.ts- Não é necessário Jest para funções puras.
node:assert/strictusa semântica===.
Relacionado: node:test & node:assert - guia completo do executador
3. Exportar createApp para Testes HTTP
Separe a fábrica do servidor do listen para o Supertest.
// src/app.ts
import express from "express";
export function createApp() {
const app = express();
app.get("/health", (_req, res) => res.json({ ok: true }));
return app;
}- Testes importam
createApp()sem vincular uma porta. - A produção
server.tschamacreateApp().listen(...). - O padrão funciona para Express 5 e Fastify com
app.ready().
Relacionado: Supertest & Integração HTTP - HTTP em processo
4. Estrutura Arrange-Act-Assert
Testes legíveis documentam o comportamento esperado.
it("retorna 404 para fatura desconhecida", async () => {
// Arrange (Organizar)
const app = createApp();
// Act (Agir)
const res = await request(app).get("/invoices/missing");
// Assert (Verificar)
assert.equal(res.status, 404);
});- Um foco lógico de asserção por teste, quando possível.
- Nomeie os testes como comportamento:
retorna 404 quando .... - Evite testar funções privadas; teste a API pública HTTP ou de módulo.
5. Isolar Testes com beforeEach
Redefina mocks e o estado entre os casos.
import { beforeEach, describe, it } from "node:test";
let cache: Map<string, string>;
beforeEach(() => {
cache = new Map();
});- Previne falhas dependentes da ordem.
- Use armazenamento em memória em testes unitários; banco de dados real apenas na suíte de integração.
6. Script npm test
Ponto de entrada único para local e CI.
{
"scripts": {
"test": "node --import tsx --test",
"test:unit": "node --import tsx --test test/unit",
"test:integration": "node --import tsx --test test/integration"
}
}- Divida as suítes quando a integração precisar de serviços Docker.
- A CI executa ambas; os desenvolvedores executam o loop de unidade durante o TDD.
7. Variáveis de Ambiente de Teste
Use .env.test ou padrões inline para configuração apenas de teste.
process.env.DATABASE_URL ??= "postgres://localhost:5432/billing_test";
process.env.LOG_LEVEL = "silent";- Nunca aponte testes para bancos de dados de produção.
LOG_LEVEL=silentmantém a saída do teste legível.
Exemplos Intermediários
8. Teste de Integração com Postgres Real
Testcontainers inicia um banco de dados efêmero na CI.
// test/integration/invoices.test.ts - posicionamento conceitual
// Veja a página Testcontainers para configuração completa- Execute em um job separado com Docker disponível.
- Uma migração de schema por suíte; trunque tabelas entre testes.
Relacionado: Testcontainers - Postgres/Redis na CI
9. Teste de Contrato Entre Serviços
O consumidor define a forma esperada da resposta do provedor.
// Teste de pacto do consumidor - o provedor deve corresponder ao contrato publicado
// Veja a página Contract & Pact- Captura alterações de API que quebram antes da implantação.
- Execute na CI do provedor verificando todos os pactos do consumidor.
Relacionado: Testes de Contrato & Pact - limites de microsserviços
10. Teste de Carga Antes do Lançamento
Latência base e taxa de erro sob RPS esperado.
k6 run scripts/load/smoke.js- Não é um substituto para testes unitários; valida suposições de SLO.
- Execute contra o staging com volume de dados semelhante à produção.
Relacionado: Teste de Carga com k6/Artillery - RPS base
Versões da Stack: Esta página foi escrita para Node.js 24.18.0 (LTS Ativo), npm 10+, TypeScript 5.6+, Express 5, Fastify 5 e NestJS 11.