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
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 # ConcorrenteConfiguração
Configure seu bunfig.toml para executar arquivos de teste com o prefixo "concurrent-" de forma concorrente:
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:
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:
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/integrationBenefícios
- Migração Gradual: Migre para testes concorrentes arquivo por arquivo renomeando-os
- Organização Clara: A convenção de nomenclatura de arquivos indica o modo de execução
- Performance: Testes de integração rodam mais rápido em paralelo
- Segurança: Testes de unidade permanecem sequenciais quando necessário
- Flexibilidade: Fácil mudar o modo de execução renomeando arquivos
Estratégia de Migração
Para migrar testes existentes para execução concorrente:
- Comece com testes de integração independentes - Estes tipicamente não compartilham estado
- Renomeie arquivos para corresponder ao padrão glob:
mv api.test.ts concurrent-api.test.ts - Verifique se os testes ainda passam - Execute
bun testpara garantir que não há condições de corrida - Monitore problemas de estado compartilhado - Observe testes intermitentes ou falhas inesperadas
- 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 peloconcurrentTestGlob,test()simples já roda concorrentemente)
Múltiplos Padrões
Você pode especificar múltiplos padrões para diferentes categorias de teste:
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