如何使用赛普拉斯黄瓜预处理器实现单项测试重试? [英] How to achieve retries for individual tests using Cypress Cucumber Preprocessor?
问题描述
我目前面临的挑战是实现单个测试重试,以稳定一小组特定的测试,这些测试依赖于一些后台处理,因此往往是不稳定的。我使用的是带有TypeScrip和Cypress黄瓜预处理器4.3.1的Cypress 9.2.0。
为了提供更多详细信息,应用程序接收在后台处理的事件(通常为max。1-2秒),然后创建数据记录。然后,这些记录以表格的形式显示在用户界面中。在一些黄瓜场景中,我对这些案例进行了端到端的精确测试。由于处理时间有时会稍长一些,因此我想预防性地包括仅适用于这些测试用例的重试,更具体地说,是检查表中最终显示的方案的步骤。
遗憾的是,由于像标准Cypress测试中的个别测试重试不能与黄瓜预处理器一起工作,而cypress.json
中的全局测试重试也有错误,我想知道是否有其他方法可以实现这一点?
正常柏树测试重试单据:https://docs.cypress.io/guides/guides/test-retries
推荐答案
我已经找到了我的问题的解决方案,尽管该解决方案通常可能不完全理想。但首先,我还想提一提我以前尝试过的方法,但这些方法对我不起作用:
Individual Test Retries很遗憾,在使用Cypress黄瓜预处理器时,特定测试步骤不可用。
Global Test Retries正如问题中已经提到的,不幸的是,在与黄瓜预处理器有关的问题上也存在错误。
我尝试过的另一种方法是使用cy.should() with a callback,但也没有成功。
第四种方法基于conditional testing,最后一种方法将我带到了以下解决方案,还考虑了this post关于在元素不可用的情况下如何不破坏柏树测试的想法:
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屋!