Tus pruebas pasan en tu laptop, las mandas al pipeline o a un contenedor, y Karma se queda esperando hasta morir con alguno de estos mensajes:
Running as root without --no-sandbox is not supported.
No usable sandbox! Update your kernel or see ...
ChromeHeadless have not captured in 60000 ms, killing.
La causa casi siempre es la misma: dentro de un contenedor Chrome corre como root y sin el aislamiento (sandbox) que espera, así que se niega a arrancar.
La solución: un launcher propio
En karma.conf.js define un navegador basado en ChromeHeadless con las banderas necesarias:
module.exports = function (config) {
config.set({
// ...
browsers: ['ChromeHeadless'],
customLaunchers: {
ChromeHeadlessCI: {
base: 'ChromeHeadless',
flags: ['--no-sandbox', '--disable-dev-shm-usage', '--disable-gpu'],
},
},
captureTimeout: 120000,
browserNoActivityTimeout: 120000,
});
};
Y en el pipeline:
npx ng test --watch=false --browsers=ChromeHeadlessCI
Para qué sirve cada bandera:
--no-sandbox: permite que Chrome arranque como root dentro del contenedor.--disable-dev-shm-usage: evita fallos por la memoria compartida pequeña (/dev/shm) que traen muchos contenedores.--disable-gpu: no hay GPU en el servidor; evita advertencias y cuelgues.
Usa estas banderas solo en CI o contenedores de prueba, nunca para navegar sitios reales: el sandbox es una protección importante.
“Cannot start ChromeHeadless: No binary”
Si el contenedor ni siquiera tiene Chrome, Karma busca la variable CHROME_BIN. Dos formas de resolverlo:
# Opción 1: instalar Chromium en la imagen (Debian/Ubuntu)
RUN apt-get update && apt-get install -y chromium && rm -rf /var/lib/apt/lists/*
ENV CHROME_BIN=/usr/bin/chromium
// Opción 2: usar el Chrome que descarga Puppeteer
process.env.CHROME_BIN = require('puppeteer').executablePath();
Pruebas lentas o intermitentes
- Sube
captureTimeoutybrowserNoActivityTimeouten servidores lentos. - Corre con
--source-map=falsesi el proyecto es muy grande. - Si todo el equipo usa el mismo launcher, déjalo como navegador por defecto en CI con una variable de entorno:
browsers: [process.env.CI ? 'ChromeHeadlessCI' : 'Chrome'],
Con eso tus pruebas corren igual en tu máquina, en Docker y en el pipeline. Y si el proyecto es nuevo, vale la pena evaluar Vitest o Jest, que no necesitan un navegador real para la mayoría de las pruebas unitarias.