Parallelism
Scout supports parallel execution using Playwright workers. Parallel runs are usually faster, but they require good isolation and predictable setup.
Parallelism happens at the file level: Playwright runs test files in parallel workers. Tests in the same file still run in order.
- All workers share the same Kibana + Elasticsearch deployment.
- Each worker gets an isolated Kibana space via the
scoutSpacefixture (used withspaceTest). - The space is cleaned up when the worker finishes.
- Parallel: UI suites that can share pre-ingested data and isolate state per space.
- Sequential: suites that require a “clean” cluster state or need global mutations that aren’t space-scoped.
-
Create a parallel config
Add a config that points at a
parallel_tests/directory and setsworkers:import { createPlaywrightConfig } from '@kbn/scout'; export default createPlaywrightConfig({ testDir: './parallel_tests', workers: 2, runGlobalSetup: true, }); -
Pre-ingest shared data (recommended)
Use a global setup hook to load shared data once before workers start.
-
Use
spaceTest(creates one Space per worker) ortest(all workers use the default Space)Use
spaceTestto accessscoutSpace(Scout will use a dedicated Space for each single parallel worker) or simply usetest(Scout will reuse the default space for all workers):import { spaceTest, tags } from '@kbn/scout'; spaceTest.describe('My parallel suite', { tag: tags.deploymentAgnostic }, () => { spaceTest.beforeAll(async ({ scoutSpace }) => { // space-scoped setup (saved objects, ui settings, ...) }); spaceTest('does something', async ({ pageObjects, browserAuth }) => { await browserAuth.loginAsViewer(); // ... }); });
API tests can run in parallel workers (set workers > 1 in your API Playwright config), but Scout does not provide Space-per-worker isolation for API tests. All parallel workers will reuse the same (default) Space.
If you run API tests in parallel, isolate state yourself:
- Use unique resource names per worker (for example include
workerInfo.parallelIndexin index/role/object names) - Avoid global mutations (cluster-wide settings, shared indices) unless the suite is fully isolated
- Clean up in
afterAll/afterEach
- Load shared ES data once (global setup) and avoid mutating it in tests.
- Clean up space-scoped changes (saved objects / UI settings) in
afterAll. - If a suite can’t be isolated, keep it sequential.