You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 07:45:10