0

我非常喜欢使用 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;      
        }
    }
);  
});
4

0 回答 0