我非常喜欢使用 puppeteer-cluster 获得的并发性。然而,我目前的目的是提高我的 jest-puppeteer 单元测试的性能。我有一个 url 数组,我遍历这些 url,并希望能够从任务中获得通过或失败,或者在任务中进行测试。不幸的是,当我使用 cluster.queue 并在任务中进行期望调用时,似乎 test.each 调用只是继续并最终表明测试已经通过,而不管断言结果是什么。
这是可以理解的,因为文档声明队列不会等待,但我希望也许有人可能对实现我想要做的事情有一个创造性的想法。通过使用 cluster.execute,我能够等待响应并依次处理结果,但我希望有某种回调或让 puppeteer-jest 处理来自任务内部的响应的方法。
不幸的是,jest 不允许 describe 异步运行,所以当我在 describe 块中添加 await.task 时,我得到一个错误,因为我可以在任务前加上 await 关键字。因此,我将 cluster.task 调用放在 beforeAll 处理程序中。在 test.each 循环中添加测试似乎是个坏主意,因为我相信它会在每次迭代时声明它。我现在要对此进行测试,但倾向于这也不是解决方案。如果有人有任何建议,我很想听听。谢谢!
describe("Execute TestHarness run of xmls", () => {
beforeAll(async () => {
cluster = await Cluster.launch(config.puppeteerConfig.clusterOptions);
// In case of problems, log them
cluster.on('taskerror', (err, data) => {
console.log(` Error crawling ${data}: ${err.message}`);
});
if(dbInstance === undefined){
await dbLoader.getClient('mongo', null)
.then((result) => {
dbInstance = result;
})
.catch((error) => {
throw error;
});
}
// //Setup the cluster task handler
return await cluster.task(async ({ page, data: passedData }) => {
passedObj = {
isBaseline : false,
complete : false
};
pausedRequests = [];
await page.setRequestInterception(true);
await executeTestAtUrl(page, passedData.url+`&cdn=${config.testConfig.masterCdn}`, arrayOfTests, passedData.url, pausedRequests, passedObj, global.requestArray);
//Finally perform our check for complete and comparison of requests
return await checkOnCompleteAndComparison(arrayOfTests, global.requestArray, pausedRequests, passedObj, dbInstance)
.then(async (result) => {
return result;
//return await expect(result).toEqual(passedData.expected);
})
.catch( (error) => {
throw error;
});
});
});
afterAll(async () => {
await cluster.idle();
await cluster.close();
});
let arrayOfTests = global.arrayOfTests;
test.each(arrayOfTests[config.testConfig.baselineKey].tests)(
"Test %p at url %p returns %p",
async (testName, testUrl, expectedResult) => {
try {
//Push our individual tests into our cluster.
//cluster.queue({testName:testName, url:testUrl, expected:expectedResult});
const result = await cluster.execute({testName:testName, url:testUrl, expected:expectedResult});
await expect(result).toEqual(expectedResult);
} catch (error) {
console.error(`ERROR in test: ${error}`);
throw error;
}
}
);
});