Playwright:如何基于配置项目设置对应测试数据?
按StoreID分配对应JSON测试数据的实现方案
不需要在测试代码里写一堆条件判断,推荐把测试数据和StoreID做映射,通过Fixture封装数据逻辑,让测试代码保持简洁通用。
步骤1:定义测试数据映射
可以直接在Fixture文件里定义数据映射,或者单独抽成JSON/TS文件维护(数据量大时更推荐)。
方式1:Fixture内直接定义映射
// 定义各门店的测试数据结构 type StoreTestData = { username: string; password: string; baseUrl: string; // 可添加其他门店专属字段,比如特定元素定位符、测试用例参数等 }; // 建立StoreID到测试数据的映射 const storeTestData: Record<number, StoreTestData> = { 1: { username: "ny_store_admin", password: "ny_secure_123", baseUrl: "https://ny.your-app.com" }, 888: { username: "nc_store_admin", password: "nc_secure_456", baseUrl: "https://nc.your-app.com" } };
方式2:单独用JSON文件维护(推荐)
创建test-data/store-data.json:
{ "1": { "username": "ny_store_admin", "password": "ny_secure_123", "baseUrl": "https://ny.your-app.com" }, "888": { "username": "nc_store_admin", "password": "nc_secure_456", "baseUrl": "https://nc.your-app.com" } }
然后在Fixture中导入并转换类型:
import rawStoreData from '../test-data/store-data.json'; type StoreTestData = { username: string; password: string; baseUrl: string; }; // 将JSON的字符串key转为number类型 const storeTestData = Object.fromEntries( Object.entries(rawStoreData).map(([key, value]) => [parseInt(key), value]) ) as Record<number, StoreTestData>;
步骤2:修改Fixture封装数据逻辑
在Fixture中新增一个storeData Fixture,自动根据当前项目的storeID返回对应测试数据,同时修改登录流程使用这些数据:
import {test as base} from '@playwright/test'; import {LogIn} from '../pom/secureLogInFlow'; export type TestOptions = { storeID: number; }; type StoreTestData = { username: string; password: string; baseUrl: string; }; const storeTestData: Record<number, StoreTestData> = { 1: { username: "ny_store_admin", password: "ny_secure_123", baseUrl: "https://ny.your-app.com" }, 888: { username: "nc_store_admin", password: "nc_secure_456", baseUrl: "https://nc.your-app.com" } }; type MyFixtures = { logIn: LogIn; storeData: StoreTestData; }; export const test = base.extend<TestOptions & MyFixtures>({ storeID: [1, {option: true}], // 自动匹配当前storeID的测试数据 storeData: async ({storeID}, use) => { const data = storeTestData[storeID]; if (!data) { throw new Error(`未找到storeID ${storeID}对应的测试数据`); } await use(data); }, // 登录流程使用匹配后的测试数据 logIn: async ({page, storeData}, use) => { const logIn = new LogIn(page); await page.goto(storeData.baseUrl); // 跳转到对应门店的域名 await logIn.loginWorkFlow(storeData.username, storeData.password); // 使用对应门店的登录凭证 await use(logIn); }, }); export {expect} from '@playwright/test';
步骤3:测试中直接使用数据
测试代码无需任何条件判断,直接注入storeData即可获取当前门店的专属数据:
import {test} from '../fixtures'; test('验证门店仪表盘加载', async ({page, storeData, logIn}) => { // 已完成登录,直接使用门店专属数据做测试 await page.waitForURL(`${storeData.baseUrl}/dashboard`); await expect(page.locator('#store-name')).toHaveText(storeData.baseUrl.split('.')[0].toUpperCase()); });
优势说明
- 无需在测试中写
if(storeID === 1)这类分支,测试逻辑通用,新增门店只需在数据映射里加条目 - 数据和逻辑解耦,修改测试数据无需改动业务测试代码
- 错误提前抛出:如果某个storeID没有对应数据,Fixture初始化时就会报错,避免测试执行到一半失败
内容的提问来源于stack exchange,提问作者Steven Rutherford
相关产品推荐
相关产品推荐

