この記事では、サンプル テストで使用される Playwright 構成について説明し、独自の環境に合わせて調整する方法について説明します。
playwright.config.ts
構成ファイルは packages/e2e-tests/playwright.config.tsにあります。
import { defineConfig, devices } from '@playwright/test';
import path from 'path';
import { getStorageStatePath } from 'power-platform-playwright-toolkit';
import dotenv from 'dotenv';
dotenv.config();
const storageStatePath = getStorageStatePath(process.env.MS_AUTH_EMAIL!);
const mdaStorageStatePath = path.join(
path.dirname(storageStatePath),
`state-mda-${process.env.MS_AUTH_EMAIL}.json`
);
export default defineConfig({
testDir: './tests',
fullyParallel: false, // Power Platform tests share a single org; run serially
forbidOnly: !!process.env.CI,
retries: process.env.CI ? 1 : 0,
workers: 1, // Single worker prevents auth conflicts
reporter: [
['html', { outputFolder: 'playwright-report' }],
['junit', { outputFile: 'test-results/results.xml' }],
],
use: {
baseURL: process.env.CANVAS_APP_URL,
trace: 'on-first-retry',
screenshot: 'only-on-failure',
video: 'retain-on-failure',
},
projects: [
{
name: 'canvas',
use: {
...devices['Desktop Chrome'],
storageState: storageStatePath,
},
testMatch: '**/canvas/**/*.test.ts',
},
{
name: 'mda',
use: {
...devices['Desktop Chrome'],
storageState: mdaStorageStatePath,
},
testMatch: '**/mda/**/*.test.ts',
},
],
globalSetup: './globals/global-setup',
globalTeardown: './globals/global-teardown',
});
主要な構成オプション
次のセクションでは、構成ファイルの最も重要な設定と、それらを変更するタイミングについて説明します。
fullyParallel および workers
Power Platform テストは、単一の Dataverse 環境を共有します。 テストを並列で実行すると、同じレコードを削除する 2 つのテストなど、データの競合が発生します。 実行をシリアル化するには、両方のオプションを設定します。
fullyParallel: false,
workers: 1,
注
複数の環境がある場合は、個別の.env ファイルまたは環境変数を使用して、workersを増やし、各プロジェクトを異なる環境に分離できます。
retries
再試行では、CI でフラキネスをマスクできます。 CI の retries: 1 を使用して、一時的なネットワークの問題を処理します。 ローカル retries: 0 設定して、すぐにフィードバックを受け取ります。
retries: process.env.CI ? 1 : 0,
trace、screenshot、video
ディスク領域を節約できない場合にのみ診断をキャプチャします。
trace: 'on-first-retry',
screenshot: 'only-on-failure',
video: 'retain-on-failure',
CI では、テストの実行後に成果物がアップロードされます。 CI/CD 統合を参照してください。
projects
Playwright プロジェクトを使用して、キャンバスとモデル駆動型のテスト スイートを分離します。 各プロジェクトでは、異なるストレージ状態を使用できます。
projects: [
{
name: 'canvas',
use: { storageState: storageStatePath },
testMatch: '**/canvas/**/*.test.ts',
},
{
name: 'mda',
use: { storageState: mdaStorageStatePath },
testMatch: '**/mda/**/*.test.ts',
},
],
1 つのプロジェクトを実行します。
npx playwright test --project=canvas
npx playwright test --project=mda
globalSetup
グローバル セットアップ スクリプトは、すべてのテストの前に 1 回実行されます。 ストレージの状態が期限切れまたは不足している場合は、認証状態が検証され、ヘッドレス認証が実行されます。
// global-setup.ts
import { validateAndRefreshAuthState } from './utils/validate-auth-state';
export default async function globalSetup() {
await validateAndRefreshAuthState();
}
検証では、次のチェックが行われます。
- ストレージ状態ファイルが存在する
- MSAL アクセス トークンの有効期限が切れていない (キャンバス/Gen UX テスト)
- CRM セッション Cookie が存在し、有効 (MDA テスト)
tsconfig.json
tsconfig.json ファイルは、テスト パッケージの TypeScript コンパイル設定を制御します。
{
"compilerOptions": {
"target": "ES2020",
"module": "commonjs",
"strict": true,
"esModuleInterop": true,
"resolveJsonModule": true,
"outDir": "dist",
"rootDir": "."
},
"include": ["**/*.ts"],
"exclude": ["node_modules", "dist"]
}
.env ファイル
packages/e2e-tests/.envの.env ファイルは、ローカル実行の環境変数を設定します。 完全なリファレンスについては、「 環境変数」を参照してください。
MS_AUTH_EMAIL=testuser@contoso.com
MS_AUTH_CREDENTIAL_TYPE=password
MS_USER_PASSWORD=<your-password>
CANVAS_APP_URL=https://apps.powerapps.com/play/<app-id>?tenantId=<tenant-id>
MODEL_DRIVEN_APP_URL=https://<org>.crm.dynamics.com/main.aspx?appid=<app-id>
CUSTOM_PAGE_NAME=AccountsCustomPage
package.json スクリプト
認証とテストの実行には、 packages/e2e-tests/package.json で次の npm スクリプトを使用できます。
| スクリプト | 命令 | 説明 |
|---|---|---|
auth:headful |
ts-node auth/auth-maker-portal.ts |
Power Appsの対話型認証 (キャンバス テスト) |
auth:mda:headful |
ts-node auth/auth-mda.ts |
モデル駆動型アプリの対話型認証 |
auth |
ts-node auth/auth-maker-portal.ts --headless |
ヘッドレス認証 (CI) |
auth:mda |
ts-node auth/auth-mda.ts --headless |
ヘッドレス モデル駆動型アプリ認証 (CI) |
test |
playwright test |
すべてのテストを実行する |
test:ui |
playwright test --ui |
Playwright UI を使用して実行する |
test:debug |
playwright test --debug |
デバッグ インスペクターを使用して実行する |