我如何正确地 运行 从内置 url 的动态数组中进行单独的 Playwright 测试?

How do I properly run individual Playwright tests from a dynamic array of built urls?

我有一个 Puppeteer CICD 项目,我在其中使用 NodeEnvironment 进入我们的测试工具网站,从我们的 QA 团队使用的下拉元素中下拉当前的自定义 xml 测试列表,然后动态构建一个来自此的 1200 多个 URL 的数组。然后我使用 this.global 用作参考数组,然后我将使用聚类来并行 运行 这些。

我在思考如何正确填充此列表然后 运行 并行测试时遇到了问题。参数化测试选项似乎接近我想要的,但我需要一种方法来填充 urls 的动态数组,然后再跳转到 for 循环,而且该数组似乎尚未填充,它是尝试 运行 通过 for 循环并执行测试,即使在使用 promise 时也是如此。

我知道我可能会破解一些东西来让事情正常运行,但我更想知道这样做的正确预期方式,让我能够利用编剧提供的并行化。

我目前正在研究 worker fixtures 或 sharding 看它是否为我提供了实现此目的的方法,但问题是如果每个 worker 都去网站填充数组然后他们都会有 1200 个测试用例,这也无济于事。我对这里的任何想法持开放态度,但要说明的重要一点是,我希望每个 url 都有自己的测试,因为每个测试都有一系列获取请求,我需要捕获这些请求并对查询进行比较参数。

下面是我目前拥有的一个大大简化的示例:

dynamic.spec.js

//The object that contains the 1200+ urls that needs to be built at the start
let globalUrlObj;

test.beforeAll( async () => {
  globalUrlObj = await setupUrlList(); //<-- This method goes to website and builds list
});

// Because globalUrlObj was not waited on above in beforeAll, it is undefined at this point and the execution comes back stating that there are no tests to run

if (globalUrlObj && globalUrlObj[config.baseKey] !== undefined) {
  for (const testUrlObj of globalUrlObj[config.baseKey]){
    test(`Testing with url ${testUrlObj.url}`, async () => {
       // Perform my analysis
       // ...
    });
  }
}

第一件事。据我所知,您之前不需要。如果首先存在,那么它将如何在并行执行中工作,每个存在的工人将首先运行(你不需要那个,你只需要它一次)。所以把代码放在外面就行了。

选择一个常规的 for 循环来执行并添加 i(迭代器),这将使您的测试独一无二。如果这对您没有帮助,请写下您遇到的错误类型。