如何使用赛普拉斯黄瓜预处理器实现单项测试重试? [英] How to achieve retries for individual tests using Cypress Cucumber Preprocessor?

查看:0
本文介绍了如何使用赛普拉斯黄瓜预处理器实现单项测试重试?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我目前面临的挑战是实现单个测试重试,以稳定一小组特定的测试,这些测试依赖于一些后台处理,因此往往是不稳定的。我使用的是带有TypeScrip和Cypress黄瓜预处理器4.3.1的Cypress 9.2.0。

为了提供更多详细信息,应用程序接收在后台处理的事件(通常为max。1-2秒),然后创建数据记录。然后,这些记录以表格的形式显示在用户界面中。

在一些黄瓜场景中,我对这些案例进行了端到端的精确测试。由于处理时间有时会稍长一些,因此我想预防性地包括仅适用于这些测试用例的重试,更具体地说,是检查表中最终显示的方案的步骤。

遗憾的是,由于像标准Cypress测试中的个别测试重试不能与黄瓜预处理器一起工作,而cypress.json中的全局测试重试也有错误,我想知道是否有其他方法可以实现这一点?

正常柏树测试重试单据:https://docs.cypress.io/guides/guides/test-retries

推荐答案

我已经找到了我的问题的解决方案,尽管该解决方案通常可能不完全理想。但首先,我还想提一提我以前尝试过的方法,但这些方法对我不起作用:

  1. Individual Test Retries很遗憾,在使用Cypress黄瓜预处理器时,特定测试步骤不可用。

  2. Global Test Retries正如问题中已经提到的,不幸的是,在与黄瓜预处理器有关的问题上也存在错误。

  3. 我尝试过的另一种方法是使用cy.should() with a callback,但也没有成功。

  4. 第四种方法基于conditional testing,最后一种方法将我带到了以下解决方案,还考虑了this post关于在元素不可用的情况下如何不破坏柏树测试的想法:

数据-lang="js"数据-隐藏="假"数据-控制台="真"数据-巴贝尔="假">
Then('the results related to some search keyword {string} are shown in the table', (search: string) => {
  checkTableWithRetries(search, 2);
});

function checkTableWithRetries(searchCriteria: string, retries: number) {
  cy.get('table').then(($table) => {
    if (checkIfTableRowExists($table) || retries === 0) {
      cy.get('table').find('tbody').contains('td', searchCriteria);
    } else {
      const time = retries === 1 ? 10000 : 5000;
      cy.wait(time);

      search(searchCriteria);
      checkTableWithRetries(searchCriteria, retries - 1);
    }
  });
}

function checkIfTableRowExists(element: JQuery<HTMLTableElement>) {
  return element.find('tbody').find('tr').length === 1;
}

function search(search: string) {
  cy.getByTestId('search-input').clear().type(`${search}`).should('have.value', `${search}`);
  cy.intercept('GET', `/api/endpoint**`).as('search');
  cy.getByTestId('search-button').click();
  cy.wait('@search');
}

该代码确保如果在表中创建并显示一个元素,我可以连续检查几次,并具有不同的延迟。如果在x次重复后该元素仍然不存在,则可以假定确实存在错误。

为澄清起见,使用的函数cy.getByTestId()不是标准的Cypress命令,而是根据官方最佳实践小节here中的建议添加的自定义命令。

Cypress.Commands.add('getByTestId', (selector, ...options) => {
  return cy.get(`[data-test=${selector}]`, ...options);
});

这篇关于如何使用赛普拉斯黄瓜预处理器实现单项测试重试?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆