当前,当it()
块中的单个测试失败时,赛普拉斯将完全停止。
我希望赛普拉斯能够继续运行后续测试,而不管先前的测试是否失败(但我仍想标记失败的测试,以便知道哪个测试失败了。)
我试图拦截beforeEach
中的失败事件:
beforeEach(() => {
Cypress.on('fail', (error, runnable) => {
cy.log('this single test failed, but continue other tests');
// don't stop!
// throw error; // marks test as failed but also makes Cypress stop
});
但是看来我不能在此处理程序内使用任何cy
命令,因为由于赛普拉斯怪异的内部承诺逻辑,当我执行此操作时,它返回错误:
CypressError:赛普拉斯检测到您从 命令,同时还要在该Promise中调用一个或多个cy命令。
返回承诺的命令是:
cy.wait()
您在promise中调用的cy命令是:
cy.log()
因为赛普拉斯命令已经像承诺一样,所以您不需要 包装它们或返回自己的诺言。
Cypress将使用最终的Cypress来解决您的命令 命令产量。
这是错误而不是警告的原因是因为赛普拉斯 内部顺序地将命令排队,而Promise则立即执行 当它们被调用时。试图调和这将防止 赛普拉斯永远无法解决。
https://on.cypress.io/returning-promise-and-commands-in-another-command
如果我将Cypress.on('fail')
块留空,即使所有测试失败也将被标记为通过。
如果我取消评论throw error
,则Cypress将在任何失败的测试中完全停止。
答案 0 :(得分:0)
如果您throw error
在测试中,它将以与代码有问题时相同的方式暂停脚本。这按预期运行。您可能需要重新查看测试逻辑,并考虑添加一些不会将退出代码设置为1的存根/间谍。
缺少此功能(请参见此问题:https://github.com/cypress-io/cypress/issues/518)。如果通读它,您会发现一些代码片段,其中提到抛出错误以停止测试运行程序。您这样做的目的相反。
如果必须抛出错误并且没有测试运行程序保释,则需要抓住它。
答案 1 :(得分:0)
我要确保完成后续测试并将失败的测试标记为失败的方法是-将每种情况放在不同的文件中,并且如果需要将它们分组-我将它们分组在单独的子文件夹中。
它提高了报告和cypress测试运行时的可读性,因为在此之前,我有时遇到cypress无法在测试之间清除其状态的问题,并且内存泄漏。