赛普拉斯:失败后是不是可以完成测试

Posted

技术标签:

【中文标题】赛普拉斯:失败后是不是可以完成测试【英文标题】:Cypress: Is it possible to complete a test after failure赛普拉斯:失败后是否可以完成测试 【发布时间】:2021-11-14 06:13:15 【问题描述】:

概述

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

测试用例

登录并转到站点地图 获取 URL 并检查每个 URL 的 HTTP 状态

代码

    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 返回状态 200 以外的任何内容,测试就会失败。

我想要什么:

我希望赛普拉斯在返回失败的 URL 之前遍历完整的 URL 列表。

为什么?

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

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

【问题讨论】:

【参考方案1】:

您不应在每个 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)
)

【讨论】:

非常感谢,塞克。这是一个真正令人印象深刻的解决方案。我不知道您可以将结果保存在回调函数中,并且只在最后检查它们。这段代码完美无缺。它在一次测试中运行所有内容并记录所有失败的链接。简直完美。

以上是关于赛普拉斯:失败后是不是可以完成测试的主要内容,如果未能解决你的问题,请参考以下文章

赛普拉斯:测试元素是不是不存在

赛普拉斯可以运行在赛普拉斯文件夹之外导入的测试文件吗?

赛普拉斯:检查元素是不是存在无异常

赛普拉斯测试因断言等于 DOM 标题而失败

赛普拉斯 Github 操作失败

赛普拉斯 - 4000 毫秒后重试超时:预计会找到元素 - 仅在 Jenkins 中