赛普拉斯:是否有可能在失败后完成测试

Cypress: Is it possible to complete a test after failure

概览

我想在更新后每周自动测试我们网站的所有 200 个页面,看看更新是否破坏了其中任何一个

测试用例

密码

    it('check HTTP status', () => { 
        cy.visit(Cypress.config('siteMapUrl'))
        
        cy.get('.portlet-separator').should('contain', 'Available Links')
        
        cy.get('.inputwrapper>a')
            .each(($el, index, $list) => {
                if($list){
                    cy.get($el)
                        .invoke('attr', 'href')
                        .then(href => {
                            cy.request(Cypress.config('url')+href)
                            .should('have.property', 'status', 200)
                        })
                }
        })

发生了什么:

一旦 URL returns 状态 200 之外的任何其他状态,测试都会失败。

我想要什么:

我希望 Cypress 在返回失败的 URL 之前遍历 URL 的完整列表。

为什么?

如果列表中有多个 URL 损坏,在我们的开发人员修复第一个之前,我不会通过此测试找到第二个损坏的 URL。然而,我需要在一周

开始时制作一个包含所有损坏的 URL 的列表

我已经看过 this answer 但我想知道在我尝试实施之前是否有不同的解决方案

您不应该在每个 URL 之后使用 .should() - 即使设置 failOnStatus: false.

也会立即失败

而是保存结果并在最后检查。

const failed = []

cy.get(".inputwrapper>a").each(($el, index, $list) => { 
  cy.get($el)
    .invoke("attr", "href")
    .then((href) => {
      cy.request({
        url: Cypress.config("url") + href,
        failOnStatusCode: false,      
      })
      .its('status')
      .then(status => {
        if (status !== 200) {
          failed.push(href)
        }
      })
    })
  }
})
.then(() => {
  // check inside then to ensure loop has finished
  cy.log(`Failed links: `${failed.join(', ')`)
  expect(failed.length).to.eq(0)
})