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

异步API获取参数实现测试参数化的问题求助

问题解决方案

核心问题分析

你遇到的两个关键问题:

  1. 参数获取函数里的XML解析是回调异步逻辑,导致函数在解析完成前就返回了空值
  2. 测试用例是同步定义的,框架会先扫描所有test()调用再执行前置钩子,所以循环时参数还未获取完成

第一步:修复参数获取函数的异步逻辑

把回调式的parseString改成Promise版本,确保XML解析完成后再返回数据:

import { parseString } from 'xml2js';
import axios from 'axios';

export class Params{
  async fetchTestCaseParameters(testCaseId) {
    try {
      const url = ``; // 填入你的实际API地址
      const headers = {
        Authorization: `Basic ${encodedToken}`,
      };
      const response = await axios.get(url, { headers });
      const xmlData = response.data.fields['Microsoft.VSTS.TCM.LocalDataSource'];
      
      // 将回调式parseString转为Promise,确保解析完成再返回
      const parsedData = await new Promise((resolve, reject) => {
        parseString(xmlData, (err, result) => {
          if (err) reject(err);
          else resolve(result);
        });
      });
      
      return parsedData.NewDataSet.Table1;
    } catch (error) {
      console.error('Error retrieving test case parameters:', error.message);
      throw error;
    }
  };
}

第二步:用顶层await提前获取参数,动态生成测试用例

测试框架支持顶层await,先拿到参数再循环生成测试用例:

import { test } from '@playwright/test';
import { Params } from './你的Params类文件路径';

// 顶层await:确保参数完全获取后再定义测试用例
const paramsInstance = new Params();
const testParams = await paramsInstance.fetchTestCaseParameters('');

// 根据参数数量循环生成测试
testParams.forEach((param, index) => {
  test(`Create company - 用例${index + 1}`, async ({ page }) => {
    await test.step('执行测试步骤', async () => {
      // 直接使用当前循环的参数,比如 param.字段名
      // 这里写你的测试逻辑
    });
  });
});

为什么之前的方法无效?

  • beforeAll/beforeEach是测试执行阶段才会运行的钩子,而测试用例的定义是在框架初始化时同步完成的,所以循环时par还未被赋值
  • 原fetchTestCaseParameters中,parseString是异步回调,函数会提前返回未赋值的parsedData,导致拿到的参数为空

内容的提问来源于stack exchange,提问作者mikkvaal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 01:19:51