Esta guía demuestra cómo usar la opción concurrentTestGlob para ejecutar selectivamente pruebas de forma concurrente basándose en patrones de nombres de archivos.
Estructura del Proyecto
sh
mi-proyecto/
├── bunfig.toml
├── tests/
│ ├── unit/
│ │ ├── math.test.ts # Secuencial
│ │ └── utils.test.ts # Secuencial
│ └── integration/
│ ├── concurrent-api.test.ts # Concurrente
│ └── concurrent-database.test.ts # ConcurrenteConfiguración
Configura tu bunfig.toml para ejecutar archivos de prueba con el prefijo "concurrent-" de forma concurrente:
toml
[test]
# Ejecutar todos los archivos de prueba con el prefijo "concurrent-" de forma concurrente
concurrentTestGlob = "**/concurrent-*.test.ts"Archivos de Prueba
Prueba Unitaria (Secuencial)
Las pruebas secuenciales son buenas para pruebas que comparten estado o tienen requisitos específicos de orden:
ts
import { test, expect } from "bun:test";
// Estas pruebas se ejecutan secuencialmente por defecto
let sharedState = 0;
test("adición", () => {
sharedState = 5 + 3;
expect(sharedState).toBe(8);
});
test("usa el estado anterior", () => {
// Esta prueba depende del estado de la prueba anterior
expect(sharedState).toBe(8);
});Prueba de Integración (Concurrente)
Las pruebas en archivos que coinciden con el patrón glob se ejecutan automáticamente de forma concurrente:
ts
import { test, expect } from "bun:test";
// Estas pruebas se ejecutan automáticamente de forma concurrente debido a que el nombre del archivo coincide con concurrentTestGlob.
// Usar test() es equivalente a test.concurrent() cuando el archivo coincide con concurrentTestGlob.
// Cada prueba es independiente y puede ejecutarse en paralelo.
test("obtener datos de usuario", async () => {
const response = await fetch("/api/user/1");
expect(response.ok).toBe(true);
});
// también se puede usar test.concurrent() para marcarlo explícitamente como concurrente
test.concurrent("obtener publicaciones", async () => {
const response = await fetch("/api/posts");
expect(response.ok).toBe(true);
});
// también se puede usar test.serial() para marcarlo explícitamente como secuencial
test.serial("obtener comentarios", async () => {
const response = await fetch("/api/comments");
expect(response.ok).toBe(true);
});Ejecutar Pruebas
bash
# Ejecutar todas las pruebas - los archivos concurrent-*.test.ts se ejecutarán de forma concurrente
bun test
# Anular: Forzar que TODAS las pruebas se ejecuten de forma concurrente
# Nota: Esto anula bunfig.toml y ejecuta todas las pruebas de forma concurrente, independientemente del glob
bun test --concurrent
# Ejecutar solo pruebas unitarias (secuencial)
bun test tests/unit
# Ejecutar solo pruebas de integración (concurrente debido al patrón glob)
bun test tests/integrationBeneficios
- Migración Gradual: Migrar a pruebas concurrentes archivo por archivo renombrándolos
- Organización Clara: La convención de nombres de archivos indica el modo de ejecución
- Rendimiento: Las pruebas de integración se ejecutan más rápido en paralelo
- Seguridad: Las pruebas unitarias permanecen secuenciales cuando es necesario
- Flexibilidad: Fácil cambiar el modo de ejecución renombrando archivos
Estrategia de Migración
Para migrar pruebas existentes a ejecución concurrente:
- Comenzar con pruebas de integración independientes - Estas típicamente no comparten estado
- Renombrar archivos para que coincidan con el patrón glob:
mv api.test.ts concurrent-api.test.ts - Verificar que las pruebas aún pasan - Ejecutar
bun testpara asegurar que no hay condiciones de carrera - Monitorear problemas de estado compartido - Observar pruebas inestables o fallos inesperados
- Continuar migrando pruebas estables incrementalmente - No apresurar la migración
Consejos
- Usar prefijos descriptivos:
concurrent-,parallel-,async- - Mantener pruebas secuenciales relacionadas juntas en el mismo directorio
- Documentar por qué ciertas pruebas deben permanecer secuenciales con comentarios
- Usar
test.concurrent()para control fino en archivos secuenciales (Nota: En archivos coincidentes conconcurrentTestGlob,test()ya se ejecuta de forma concurrente)
Múltiples Patrones
Puedes especificar múltiples patrones para diferentes categorías de pruebas:
toml
[test]
concurrentTestGlob = [
"**/integration/*.test.ts",
"**/e2e/*.test.ts",
"**/concurrent-*.test.ts"
]Esta configuración ejecutará pruebas de forma concurrente si coinciden con cualquiera de estos patrones:
- Todas las pruebas en directorios
integration/ - Todas las pruebas en directorios
e2e/ - Todas las pruebas con prefijo
concurrent-en cualquier lugar del proyecto