153 lines
3.9 KiB
TypeScript
153 lines
3.9 KiB
TypeScript
import { defineConfig, devices } from '@playwright/test';
|
||
import { nxE2EPreset } from '@nx/playwright/preset';
|
||
|
||
import { workspaceRoot } from '@nx/devkit';
|
||
|
||
// For CI, you may want to set BASE_URL to the deployed application.
|
||
const baseURL = process.env['BASE_URL'] || 'http://localhost:7200';
|
||
const webServerCommand =
|
||
process.env['PLAYWRIGHT_WEB_SERVER_COMMAND'] || 'npx nx serve web';
|
||
const webServerUrl = process.env['PLAYWRIGHT_WEB_SERVER_URL'] || baseURL;
|
||
|
||
/**
|
||
* Read environment variables from file.
|
||
* https://github.com/motdotla/dotenv
|
||
*/
|
||
// require('dotenv').config();
|
||
|
||
/**
|
||
* See https://playwright.dev/docs/test-configuration.
|
||
*/
|
||
export default defineConfig({
|
||
...nxE2EPreset(__filename, { testDir: './src' }),
|
||
|
||
/* 测试超时设置 */
|
||
timeout: 60000,
|
||
expect: {
|
||
timeout: 10000,
|
||
toHaveScreenshot: {
|
||
maxDiffPixelRatio: 0.05,
|
||
},
|
||
},
|
||
|
||
/* 测试报告设置 */
|
||
reporter: [
|
||
['html', { outputFolder: 'playwright-report' }],
|
||
['json', { outputFile: 'test-results/results.json' }],
|
||
['list'],
|
||
],
|
||
|
||
/* 截图和视频设置 */
|
||
outputDir: 'test-results',
|
||
|
||
/* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */
|
||
use: {
|
||
baseURL,
|
||
/* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */
|
||
trace: 'on-first-retry',
|
||
/* 失败时截图 */
|
||
screenshot: 'only-on-failure',
|
||
/* 视频录制 */
|
||
video: 'retain-on-failure',
|
||
},
|
||
|
||
/* Run your local dev server before starting the tests */
|
||
webServer: {
|
||
command: webServerCommand,
|
||
url: webServerUrl,
|
||
reuseExistingServer: !process.env.CI,
|
||
cwd: workspaceRoot,
|
||
timeout: 120000,
|
||
},
|
||
|
||
projects: [
|
||
// 冒烟测试 - 仅 Chromium,快速运行
|
||
{
|
||
name: 'smoke',
|
||
testMatch: '**/smoke/**/*.spec.ts',
|
||
use: { ...devices['Desktop Chrome'] },
|
||
},
|
||
|
||
// 视觉回归测试 - 仅 Chromium
|
||
{
|
||
name: 'visual',
|
||
testMatch: '**/visual/**/*.spec.ts',
|
||
use: { ...devices['Desktop Chrome'] },
|
||
},
|
||
|
||
// 功能测试 - 多浏览器
|
||
{
|
||
name: 'chromium',
|
||
testMatch: '**/features/**/*.spec.ts',
|
||
use: { ...devices['Desktop Chrome'] },
|
||
},
|
||
|
||
{
|
||
name: 'firefox',
|
||
testMatch: '**/features/**/*.spec.ts',
|
||
use: { ...devices['Desktop Firefox'] },
|
||
},
|
||
|
||
{
|
||
name: 'webkit',
|
||
testMatch: '**/features/**/*.spec.ts',
|
||
use: { ...devices['Desktop Safari'] },
|
||
},
|
||
|
||
// 手册截图生成测试 - 仅 Chromium,排除 GIF 录制测试
|
||
{
|
||
name: 'manual',
|
||
testMatch: '**/manual-gen/**/*.spec.ts',
|
||
testIgnore: '**/manual-gen/gif-*.spec.ts', // 排除 GIF 录制测试
|
||
use: { ...devices['Desktop Chrome'] },
|
||
},
|
||
|
||
// 手册 GIF 视频录制 - 需要视频录制功能
|
||
{
|
||
name: 'manual-video',
|
||
testMatch: '**/manual-gen/gif-*.spec.ts', // 只匹配 GIF 录制测试
|
||
use: {
|
||
...devices['Desktop Chrome'],
|
||
video: 'on',
|
||
viewport: { width: 1280, height: 720 },
|
||
},
|
||
},
|
||
|
||
// 响应式测试 - 多视口尺寸
|
||
{
|
||
name: 'responsive',
|
||
testMatch: '**/visual/responsive-visual.spec.ts',
|
||
use: { ...devices['Desktop Chrome'] },
|
||
},
|
||
|
||
// 移动端浏览器测试
|
||
{
|
||
name: 'mobile-chrome',
|
||
testMatch: '**/visual/responsive-visual.spec.ts',
|
||
use: { ...devices['Pixel 5'] },
|
||
},
|
||
{
|
||
name: 'mobile-safari',
|
||
testMatch: '**/visual/responsive-visual.spec.ts',
|
||
use: { ...devices['iPhone 12'] },
|
||
},
|
||
|
||
// 平板测试
|
||
{
|
||
name: 'tablet',
|
||
testMatch: '**/visual/responsive-visual.spec.ts',
|
||
use: { ...devices['iPad Pro 11'] },
|
||
},
|
||
|
||
// Uncomment for branded browsers
|
||
/* {
|
||
name: 'Microsoft Edge',
|
||
use: { ...devices['Desktop Edge'], channel: 'msedge' },
|
||
},
|
||
{
|
||
name: 'Google Chrome',
|
||
use: { ...devices['Desktop Chrome'], channel: 'chrome' },
|
||
}, */
|
||
],
|
||
});
|