การอ้างอิงการกําหนดค่า

บทความนี้จัดทําเอกสารการกําหนดค่า 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 เดียว การรันการทดสอบในแบบขนานจะสร้างข้อขัดแย้งของข้อมูล เช่น การทดสอบสองรายการที่ลบเรกคอร์ดเดียวกัน ตั้งค่าทั้งสองตัวเลือกเพื่อทําให้การดําเนินการเป็นอนุกรม:

fullyParallel: false,
workers: 1,

โน้ต

ถ้าคุณมีหลายสภาพแวดล้อม คุณสามารถเพิ่ม workers และแยกแต่ละโครงการไปยังสภาพแวดล้อมที่แตกต่างกันโดยใช้ไฟล์ที่แยกต่างหาก .env หรือตัวแปรระดับสภาพแวดล้อมได้

retries

การลองใหม่สามารถมาสก์ความฟลักใน CI ใช้ retries: 1 CI ในการจัดการปัญหาเครือข่ายชั่วคราว ตั้งค่า 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',
  },
],

เรียกใช้โครงการเดียว:

npx playwright test --project=canvas
npx playwright test --project=mda

globalSetup

สคริปต์การตั้งค่าส่วนกลางจะรันหนึ่งครั้งก่อนที่จะทดสอบทั้งหมด ซึ่งจะตรวจสอบสถานะการรับรองความถูกต้องและเรียกใช้การรับรองความถูกต้องแบบไม่มีส่วนหัวหากสถานะที่เก็บข้อมูลหมดอายุหรือหายไป:

// global-setup.ts
import { validateAndRefreshAuthState } from './utils/validate-auth-state';

export default async function globalSetup() {
  await validateAndRefreshAuthState();
}

การตรวจสอบความถูกต้องจะตรวจสอบ:

  • มีไฟล์สถานะที่เก็บข้อมูลอยู่
  • โทเค็นการเข้าถึง MSAL ไม่หมดอายุ (การทดสอบพื้นที่ทํางาน/Gen UX)
  • คุกกี้เซสชัน CRM มีอยู่และใช้งานได้ (การทดสอบ 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

ไฟล์ .env ที่ packages/e2e-tests/.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 สคริปต์

สคริปต์ npm ต่อไปนี้จะพร้อมใช้งานใน packages/e2e-tests/package.json สําหรับการรับรองความถูกต้องและการดําเนินการทดสอบ:

บทละคร คำสั่ง รายละเอียด
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 เรียกใช้ด้วยตัวตรวจสอบดีบัก

ขั้นตอนถัดไป

ดูเพิ่มเติมที่