赛普拉斯重试使测试始终通过

时间:2021-07-01 09:53:53

标签: continuous-integration cypress

我正在尝试按照 https://docs.cypress.io/guides/guides/test-retries#How-It-Works

使用 Cypress(7.6.0)重试功能

但由于某种原因它似乎不起作用,因为测试肯定会失败:

describe('Deliberate fail', function() {
    it('Make an assertion that will fail', function() {
        expect(true).to.be.false;
    });
});

当从命令行运行并将配置重试设置为 1 时,

npx cypress run --config retries=1 --env server_url=http://localhost:3011 -s cypress/integration/tmp/deliberate_fail.js

它似乎通过了,唯一的提示是正在重试某些内容是文本“Attempt 1 of 2”以及已制作屏幕截图的事实:

enter image description here

运行中的统计数据看起来也不合逻辑: 1 次测试 0 通过 0 失败 1 已跳过(但在摘要中未显示为已跳过)

在 cypress.json 中放置“重试”选项时的行为完全相同,无论是作为单个数字还是 runMode 或 openMode 的选项。

在“开放”模式下,测试不会重试,只会失败。

我猜我做错了什么,但是什么?

2 个答案:

答案 0 :(得分:1)

找到原因..为了解决当其中一个测试步骤(it() 步骤)失败时赛普拉斯没有中止规范文件的问题,我已经实现了这个非常古老的问题 https://github.com/cypress-io/cypress/issues/518 的解决方法

//
// Prevent it just running on if a step fails
// https://github.com/cypress-io/cypress/issues/518
//

afterEach(function() {
    if (this.currentTest.state === 'failed') {
        Cypress.runner.stop()
    }
});

这意味着 describe() 将在失败时停止,但显然不能很好地进行重试。

我真正希望的用例是在 describe() 级别重试,但这可能会很昂贵,因为上述问题刚刚解决,但该解决方案仅适用于商业计划中的用户,每月 300 美元。 https://github.com/cypress-io/cypress/issues/518#issuecomment-809514077

答案 1 :(得分:0)

我认为你的问题是你没有测试任何东西。 Cypress 将重试涉及 DOM 的操作,因为 DOM 需要时间来呈现。重试比直接等待更有效,因为它可能发生得更快。

所以我认为因为您只是在比较 2 个字面值 truefalse,赛普拉斯说,“嘿,这里没有什么可重试的,这两个值永远不会改变,我我走了!”

我想说,如果你用一个 DOM 元素设置一个类似的测试,它可能会像你期望的那样运行,但实际上它也会在第一次尝试后停止,因为当它找到 DOM 元素时,它将停止重试。重试的目的是允许元素被实例化,而不是因为值可能不同而重试。

我承认我在这方面可能是错的,但我绝对说服了自己——你怎么看?