赛普拉斯:如何将单个测试标记为失败,但继续运行其他测试?

时间:2019-07-19 11:26:02

标签: javascript cypress

当前,当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将在任何失败的测试中完全停止。

2 个答案:

答案 0 :(得分:0)

如果您throw error在测试中,它将以与代码有问题时相同的方式暂停脚本。这按预期运行。您可能需要重新查看测试逻辑,并考虑添加一些不会将退出代码设置为1的存根/间谍。

缺少此功能(请参见此问题:https://github.com/cypress-io/cypress/issues/518)。如果通读它,您会发现一些代码片段,其中提到抛出错误以停止测试运​​行程序。您这样做的目的相反。

如果必须抛出错误并且没有测试运行程序保释,则需要抓住它。

答案 1 :(得分:0)

我要确保完成后续测试并将失败的测试标记为失败的方法是-将每种情况放在不同的文件中,并且如果需要将它们分组-我将它们分组在单独的子文件夹中。

它提高了报告和cypress测试运行时的可读性,因为在此之前,我有时遇到cypress无法在测试之间清除其状态的问题,并且内存泄漏。