Skip to content

Este guia demonstra como usar a opção concurrentTestGlob para executar testes seletivamente de forma concorrente com base em padrões de nomenclatura de arquivos.

Estrutura do Projeto

Estrutura do Projeto
sh
my-project/
├── bunfig.toml
├── tests/
   ├── unit/
   ├── math.test.ts          # Sequencial
   └── utils.test.ts         # Sequencial
   └── integration/
       ├── concurrent-api.test.ts     # Concorrente
       └── concurrent-database.test.ts # Concorrente

Configuração

Configure seu bunfig.toml para executar arquivos de teste com o prefixo "concurrent-" de forma concorrente:

bunfig.toml
toml
[test]
# Executar todos os arquivos de teste com prefixo "concurrent-" de forma concorrente
concurrentTestGlob = "**/concurrent-*.test.ts"

Arquivos de Teste

Teste de Unidade (Sequencial)

Testes sequenciais são bons para testes que compartilham estado ou têm requisitos de ordenação específicos:

tests/unit/math.test.ts
ts
import { test, expect } from "bun:test";

// Estes testes rodam sequencialmente por padrão
let sharedState = 0;

test("adição", () => {
  sharedState = 5 + 3;
  expect(sharedState).toBe(8);
});

test("usa estado anterior", () => {
  // Este teste depende do estado do teste anterior
  expect(sharedState).toBe(8);
});

Teste de Integração (Concorrente)

Testes em arquivos que correspondem ao padrão glob automaticamente rodam de forma concorrente:

tests/integration/concurrent-api.test.ts
ts
import { test, expect } from "bun:test";

// Estes testes rodam automaticamente de forma concorrente devido ao nome do arquivo corresponder ao padrão glob.
// Usar test() é equivalente a test.concurrent() quando o arquivo corresponde ao concurrentTestGlob.
// Cada teste é independente e pode rodar em paralelo.

test("buscar dados do usuário", async () => {
  const response = await fetch("/api/user/1");
  expect(response.ok).toBe(true);
});

// também pode usar test.concurrent() para marcar explicitamente como concorrente
test.concurrent("buscar posts", async () => {
  const response = await fetch("/api/posts");
  expect(response.ok).toBe(true);
});

// também pode usar test.serial() para marcar explicitamente como sequencial
test.serial("buscar comentários", async () => {
  const response = await fetch("/api/comments");
  expect(response.ok).toBe(true);
});

Executando Testes

bash
# Executar todos os testes - arquivos concurrent-*.test.ts serão executados concorrentemente
bun test

# Substituir: Forçar TODOS os testes a rodarem concorrentemente
# Nota: Isso substitui o bunfig.toml e executa todos os testes concorrentemente, independentemente do glob
bun test --concurrent

# Executar apenas testes de unidade (sequencial)
bun test tests/unit

# Executar apenas testes de integração (concorrente devido ao padrão glob)
bun test tests/integration

Benefícios

  1. Migração Gradual: Migre para testes concorrentes arquivo por arquivo renomeando-os
  2. Organização Clara: A convenção de nomenclatura de arquivos indica o modo de execução
  3. Performance: Testes de integração rodam mais rápido em paralelo
  4. Segurança: Testes de unidade permanecem sequenciais quando necessário
  5. Flexibilidade: Fácil mudar o modo de execução renomeando arquivos

Estratégia de Migração

Para migrar testes existentes para execução concorrente:

  1. Comece com testes de integração independentes - Estes tipicamente não compartilham estado
  2. Renomeie arquivos para corresponder ao padrão glob: mv api.test.ts concurrent-api.test.ts
  3. Verifique se os testes ainda passam - Execute bun test para garantir que não há condições de corrida
  4. Monitore problemas de estado compartilhado - Observe testes intermitentes ou falhas inesperadas
  5. Continue migrando testes estáveis incrementalmente - Não apresse a migração

Dicas

  • Use prefixos descritivos: concurrent-, parallel-, async-
  • Mantenha testes sequenciais relacionados juntos no mesmo diretório
  • Documente por que certos testes devem permanecer sequenciais com comentários
  • Use test.concurrent() para controle fino em arquivos sequenciais (Nota: Em arquivos correspondidos pelo concurrentTestGlob, test() simples já roda concorrentemente)

Múltiplos Padrões

Você pode especificar múltiplos padrões para diferentes categorias de teste:

bunfig.toml
toml
[test]
concurrentTestGlob = [
  "**/integration/*.test.ts",
  "**/e2e/*.test.ts",
  "**/concurrent-*.test.ts"
]

Esta configuração executará testes concorrentemente se corresponderem a qualquer um destes padrões:

  • Todos os testes em diretórios integration/
  • Todos os testes em diretórios e2e/
  • Todos os testes com prefixo concurrent- em qualquer lugar do projeto

Bun by www.bunjs.com.cn edit