close

globalSetup

  • Type: string | string[]
  • Default: undefined

The globalSetup option in Rstest allows you to run setup and teardown code that executes once before all tests and after all tests complete. This is useful for:

  • Starting and stopping databases
  • Initializing test services
  • Cleaning up resources after test runs
rstest.config.ts
import { defineConfig } from '@rstest/core';

export default defineConfig({
  globalSetup: ['./global-setup.ts'],
  // or multiple files
  globalSetup: ['./setup-db.ts', './setup-server.ts'],
  // your other config...
});

Global setup file formats

You can write global setup files in two formats:

// global-setup.ts

export async function setup() {
  console.log('Setting up test environment...');

  // Initialize database, start services, etc.
  // await startDatabase();
}

export async function teardown() {
  console.log('Tearing down test environment...');

  // Cleanup resources
  // await stopDatabase();
}

Default function returning teardown

// global-setup.ts
export default async function globalSetup() {
  console.log('Setting up test environment...');

  // Initialize resources
  const database = await connectDatabase();
  const server = await startTestServer();

  // Return teardown function
  return async () => {
    console.log('Cleaning up resources...');
    await server.stop();
    await database.disconnect();
  };
}
Note

Global setup runs in a separate context: module-scope variables defined in the setup file are not accessible from tests. However, for node test workers, process.env mutations made in globalSetup are snapshotted after setup completes and propagated to each worker — setting environment variables here is a supported way to share values with node tests. This propagation does not apply to browser-mode tests; only the static test.env config is forwarded to browser workers.

Multiple global setup files

When using multiple global setup files:

  • Setup functions execute sequentially in the order provided
  • Teardown functions execute in reverse order (LIFO - Last In, First Out)
  • If any setup fails, the entire test run fails

Differences from setupFiles

FeatureglobalSetupsetupFiles
ExecutionOnce before all testsBefore each test file
TeardownSupportedNot supported
Use CaseGlobal resources, databases, servicesPer-test utilities, mocks

Example: database setup

// db-setup.ts
let dbConnection: any;

export async function setup() {
  const { MongoClient } = await import('mongodb');
  const client = new MongoClient(process.env.TEST_MONGODB_URI!);
  await client.connect();

  dbConnection = client.db('test');

  // Seed test data
  await dbConnection.collection('users').insertMany([
    { name: 'John', email: 'john@example.com' },
    { name: 'Jane', email: 'jane@example.com' },
  ]);

  console.log('✓ Database connected and seeded');
}

export async function teardown() {
  if (dbConnection) {
    await dbConnection.dropDatabase();
    await dbConnection.client.close();
    console.log('✓ Database cleaned up');
  }
}
rstest.config.ts
import { defineConfig } from '@rstest/core';

export default defineConfig({
  globalSetup: ['./db-setup.ts'],
  include: ['**/*.test.ts'],
});