我对一个适用于 canvas 元素的 javascript 库进行了 e2e 测试。它是这样组织的:有一个带有链接列表、画布和图像元素的 html 页面。当我单击一个链接时,该库会在画布上绘制一个特定的测试用例并加载具有预期视图的图像。此外,我还有一个 node.js 脚本,可以使用 webdriverio、relikejs(用于比较图像的库)和磁带(测试框架)自动执行这些操作。
现在这个古怪的部分(下面的示例按预期工作,测试失败,如果图像与画布不同等),我获取所有链接,将图像和画布与likejs进行比较,并存储数据(这是结果数组中的similarjs比较),然后我运行另一个循环,在其中调用磁带并测试内容:
const links = await browser.$$('#ul li a');
const testsData = [];
for (const link of links) {
const data = await compare(link);
const testName = await link.getText();
testsData.push([testName, data]);
}
for (const [testName, data] of testsData) {
tape(testName, t => {
t.equal(data.rawMisMatchPercentage < 1, true);
t.end();
});
}
await browser.deleteSession();
但是,如果我尝试使用单个循环,就像这里:
const links = await browser.$$('#ul li a');
let counter = 1;
for (const link of links) {
console.log('LOOP START ' + counter);
const data = await compare(link);
const testName = await link.getText();
tape(testName, t => {
console.log('TEST START ' + counter);
t.equal(data.rawMisMatchPercentage < 1, true);
t.end();
console.log('TEST END ' + counter);
});
console.log('LOOP END ' + counter++);
}
await browser.deleteSession();
脚本以这种方式执行:
- LOOP START 1 //页面上的动作开始,然后进行比较并返回结果
- LOOP END 1 //磁带被调用,将回调放在某处并返回
- LOOP START 2 //页面上的操作开始(请求已发送到 webriver),这为 node.js 脚本创造了空闲时间,因此磁带第一次调用的回调有机会运行
- 测试开始 1
- 测试结束 1
- 循环结束 2
- LOOP START 3 //由于某种原因,页面上的操作不再允许之前的测试运行,就像在 LOOP START 2 上一样
- 循环结束 3
- 循环开始 4
- 循环结束 4
- 等等
并且除测试 1 之外的所有测试都失败并显示以下消息:not ok TEST_NUM test exited without ending
。显然,node.js 脚本在没有运行磁带回调的情况下退出(第一个除外)。
我明白,磁带不会立即运行测试,它接受一个回调,稍后运行,但让我感到困惑的是:脚本退出了,什么时候还有回调要运行?
非常感谢任何提示
目前,我怀疑这是磁带库的错误或其他问题。这就是正在发生的事情(我能够研究):tape 接受回调,运行第一个,报告结果,但随后不运行剩余的回调,但即使没有尝试调用它们,也会将它们报告为“失败” .