Playwright是否支持嵌套项目结构?如何实现配置文件复用?
关于Playwright项目结构与配置继承的问题解答
一、嵌套项目结构的实现方式
Playwright的projects配置是扁平数组结构,不支持在projects数组内部再嵌套另一个projects数组的写法,你提供的代码里的嵌套语法是无效的。
不过可以通过**依赖关系(dependencies)**实现逻辑上的层级分组,把所有项目都放在根projects数组中,通过dependencies指定前置依赖,就能达到你想要的执行顺序:
- 先执行
Global Setup - 再分别执行
Setup Project A和Setup Project B(都依赖Global Setup) - 接着执行各自的Feature测试(依赖对应项目的Setup)
- 最后执行项目的Teardown和全局Teardown
修正后的配置示例:
projects: [ { name: 'Global Setup', testDir: 'global-setup', teardown: 'Global Teardown' }, // Project A 相关项目 { name: 'Setup Project A', testDir: 'setup-proj-a', dependencies: ['Global Setup'], teardown: 'Teardown Project A' }, { name: 'Feature 1', testDir: 'proj-a/feature-1', dependencies: ['Setup Project A'], use: { ...devices['Desktop Chrome'], storageState: STORAGE_STATE } }, { name: 'Feature 2', testDir: 'proj-a/feature-2', dependencies: ['Setup Project A'], use: { ...devices['Desktop Chrome'] }, fullyParallel: true }, { name: 'Teardown Project A', testDir: 'teardown-proj-a' }, // Project B 相关项目 { name: 'Setup Project B', testDir: 'setup-proj-b', dependencies: ['Global Setup'], teardown: 'Teardown Project B' }, { name: 'Feature 2', testDir: 'proj-b/feature-2', dependencies: ['Setup Project B'], use: { ...devices['Desktop Chrome'], storageState: STORAGE_STATE } }, { name: 'Teardown Project B', testDir: 'teardown-proj-b' }, { name: 'Global Teardown', testDir: 'global-teardown' } ]
二、配置继承的实现方法
完全可以通过根目录的基础配置文件实现继承,避免重复维护相同配置:
- 根目录创建基础配置文件:比如
base.playwright.config.ts,存放所有通用配置项
// base.playwright.config.ts import { defineConfig, devices } from '@playwright/test'; export default defineConfig({ // 通用配置:比如timeout、retries、reporter等 timeout: 30000, retries: 1, reporter: [['html', { open: 'never' }]], use: { baseURL: 'https://your-base-url.com', trace: 'on-first-retry', }, // 其他通用配置... });
- 子项目配置文件继承并扩展:在各个项目文件夹的
playwright.config.ts中导入基础配置,合并特有配置
// proj-a/feature-1/playwright.config.ts import baseConfig from '../../base.playwright.config'; import { defineConfig, devices } from '@playwright/test'; export default defineConfig(baseConfig, { // 覆盖或添加当前项目的特有配置 testDir: './', projects: [ { name: 'Feature 1', use: { ...devices['Desktop Chrome'], storageState: '../../storageState.json', }, }, ], // 其他特有配置... });
这样就能复用70%的通用配置,只需要维护每个项目的特有部分。
内容的提问来源于stack exchange,提问作者Radu Theodor
相关产品推荐
相关产品推荐

