メインコンテンツへスキップ

グローバルセットアップとティアダウン

はじめに

グローバルセットアップとティアダウンを設定するには、グローバルセットアップファイルを使用する方法と、globalSetup で設定する方法、または プロジェクトの依存関係 を使用する方法の 2 つがあります。プロジェクトの依存関係を使用すると、他のすべてのプロジェクトよりも前に実行されるプロジェクトを定義できます。プロジェクトの依存関係を使用すると、HTML レポートにグローバルセットアップが表示され、トレースビューワーがセットアップのトレースを記録し、Fixtures を使用できるため、これがグローバルセットアップを設定する推奨される方法です。

オプション 1: プロジェクトの依存関係

プロジェクトの依存関係 は、別のプロジェクトのテストを実行する前に実行する必要があるプロジェクトのリストです。これらは、グローバルセットアップアクションを設定して、あるプロジェクトが最初に実行されるようにするために役立ちます。依存関係を使用すると、グローバルセットアップでトレースやその他の成果物を生成できます。

セットアップ

まず、'setup db' という名前の新しいプロジェクトを追加します。次に、global.setup.ts というファイルに一致するように、testProject.testMatch プロパティを付与します。

playwright.config.ts
import { defineConfig } from '@playwright/test';

export default defineConfig({
testDir: './tests',
// ...
projects: [
{
name: 'setup db',
testMatch: /global\.setup\.ts/,
},
// {
// other project
// }
]
});

次に、セットアッププロジェクトに依存するプロジェクトに testProject.dependencies プロパティを追加し、前のステップで定義した依存関係プロジェクトの名前を配列に渡します。

playwright.config.ts
import { defineConfig, devices } from '@playwright/test';

export default defineConfig({
testDir: './tests',
// ...
projects: [
{
name: 'setup db',
testMatch: /global\.setup\.ts/,
},
{
name: 'chromium with db',
use: { ...devices['Desktop Chrome'] },
dependencies: ['setup db'],
},
]
});

この例では、'chromium with db' プロジェクトは 'setup db' プロジェクトに依存しています。次に、プロジェクトのルートレベルに保存されたセットアップテストを作成します(セットアップコードとティアダウンコードは、test() 関数を呼び出すことによって通常のテストとして定義する必要があることに注意してください)。

tests/global.setup.ts
import { test as setup } from '@playwright/test';

setup('create new database', async ({ }) => {
console.log('creating new database...');
// Initialize the database
});
tests/menu.spec.ts
import { test, expect } from '@playwright/test';

test('menu', async ({ page }) => {
// Your test that depends on the database
});

ティアダウン

セットアッププロジェクトに testProject.teardown プロパティを追加することで、セットアップをティアダウンできます。これは、すべての依存プロジェクトが実行された後に実行されます。

まず、前のステップでティアダウンプロジェクトに付けた名前である 'cleanup db' という名前で、セットアッププロジェクトに testProject.teardown プロパティを追加します。

playwright.config.ts
import { defineConfig } from '@playwright/test';

export default defineConfig({
testDir: './tests',
// ...
projects: [
{
name: 'setup db',
testMatch: /global\.setup\.ts/,
teardown: 'cleanup db',
},
{
name: 'cleanup db',
testMatch: /global\.teardown\.ts/,
},
{
name: 'chromium',
use: { ...devices['Desktop Chrome'] },
dependencies: ['setup db'],
},
]
});

次に、プロジェクトの tests ディレクトリに global.teardown.ts ファイルを作成します。これは、すべてのテストが実行された後にデータベースからデータを削除するために使用されます。

tests/global.teardown.ts
import { test as teardown } from '@playwright/test';

teardown('delete database', async ({ }) => {
console.log('deleting test database...');
// Delete the database
});

その他の例

より詳細な例については、以下を確認してください。

オプション 2: globalSetup と globalTeardown の設定

すべてのテストを実行する前に一度だけ何かをセットアップするには、設定ファイルglobalSetup オプションを使用できます。グローバルセットアップファイルは、config オブジェクトを受け取る単一の関数をエクスポートする必要があります。この関数は、すべてのテストの前に一度だけ実行されます。

同様に、すべてのテストの後に一度だけ何かを実行するには、globalTeardown を使用します。または、globalSetup にグローバルティアダウンとして使用される関数を返させます。ポート番号や認証トークンなどのデータを、環境変数を使用してグローバルセットアップからテストに渡すことができます。

globalSetupglobalTeardown の注意点に注意してください

  • これらのメソッドは、グローバルセットアップ中の失敗のトレースのキャプチャ で説明されているように、明示的に有効にしない限り、トレースや成果物を生成しません。
  • 設定ファイルで指定された headlesstestIdAttribute などのオプションは適用されません。
  • globalSetup でスローされたキャッチされない例外は、Playwright がテストを実行するのを防ぎ、レポーターにテスト結果が表示されなくなります。

セットアップの失敗の場合でも、トレース、成果物を生成し、設定オプションを尊重し、レポーターでテスト結果を取得するには、プロジェクトの依存関係 を使用することを検討してください。

playwright.config.ts
import { defineConfig } from '@playwright/test';

export default defineConfig({
globalSetup: require.resolve('./global-setup'),
globalTeardown: require.resolve('./global-teardown'),
});

これは、一度認証し、テストで認証状態を再利用するグローバルセットアップの例です。設定ファイルの baseURL および storageState オプションを使用します。

global-setup.ts
import { chromium, type FullConfig } from '@playwright/test';

async function globalSetup(config: FullConfig) {
const { baseURL, storageState } = config.projects[0].use;
const browser = await chromium.launch();
const page = await browser.newPage();
await page.goto(baseURL!);
await page.getByLabel('User Name').fill('user');
await page.getByLabel('Password').fill('password');
await page.getByText('Sign in').click();
await page.context().storageState({ path: storageState as string });
await browser.close();
}

export default globalSetup;

設定ファイルで globalSetupbaseURL、および storageState を指定します。

playwright.config.ts
import { defineConfig } from '@playwright/test';
export default defineConfig({
globalSetup: require.resolve('./global-setup'),
use: {
baseURL: 'http://localhost:3000/',
storageState: 'state.json',
},
});

グローバルセットアップによって設定された storageState を指定するため、テストはすでに認証された状態で開始されます。

import { test } from '@playwright/test';

test('test', async ({ page }) => {
await page.goto('/');
// You are signed in!
});

グローバルセットアップファイルからテストで任意のデータを使用できるようにするには、process.env を介して環境変数として設定します。

global-setup.ts
import type { FullConfig } from '@playwright/test';

async function globalSetup(config: FullConfig) {
process.env.FOO = 'some data';
// Or a more complicated data structure as JSON:
process.env.BAR = JSON.stringify({ some: 'data' });
}

export default globalSetup;

テストは、グローバルセットアップで設定された process.env プロパティにアクセスできます。

import { test } from '@playwright/test';

test('test', async ({ page }) => {
// environment variables which are set in globalSetup are only available inside test().
const { FOO, BAR } = process.env;

// FOO and BAR properties are populated.
expect(FOO).toEqual('some data');

const complexData = JSON.parse(BAR);
expect(BAR).toEqual({ some: 'data' });
});

グローバルセットアップ中の失敗のトレースのキャプチャ

場合によっては、グローバルセットアップ中に発生した失敗のトレースをキャプチャすることが役立つ場合があります。これを行うには、セットアップで トレースを開始 し、エラーがスローされる前にエラーが発生した場合は、トレースを停止 する必要があります。これは、セットアップを try...catch ブロックでラップすることで実現できます。トレースをキャプチャするためにグローバルセットアップの例を拡張した例を次に示します。

global-setup.ts
import { chromium, type FullConfig } from '@playwright/test';

async function globalSetup(config: FullConfig) {
const { baseURL, storageState } = config.projects[0].use;
const browser = await chromium.launch();
const context = await browser.newContext();
const page = await context.newPage();
try {
await context.tracing.start({ screenshots: true, snapshots: true });
await page.goto(baseURL!);
await page.getByLabel('User Name').fill('user');
await page.getByLabel('Password').fill('password');
await page.getByText('Sign in').click();
await context.storageState({ path: storageState as string });
await context.tracing.stop({
path: './test-results/setup-trace.zip',
});
await browser.close();
} catch (error) {
await context.tracing.stop({
path: './test-results/failed-setup-trace.zip',
});
await browser.close();
throw error;
}
}

export default globalSetup;