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

Cypress retries making test always pass

我正在尝试根据 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”以及已经截屏的事实:

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

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

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

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

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

所以我认为因为你只是比较 2 个文字值,truefalse,赛普拉斯说,“嘿,这里没有什么可以重试的,这两个值永远不会改变,我要离开这里!

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

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

找到原因..解决当其中一个测试步骤(it() 步骤)失败时 Cypress 不会中止规范文件的问题,我有解决这个非常老的问题的方法 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() 级别重试,但这可能会很昂贵,因为上述问题刚刚得到解决,但该解决方案仅适用于 Business 计划中的用户,费用为 300 美元/月. https://github.com/cypress-io/cypress/issues/518#issuecomment-809514077