Cypress - 异步Behave

Cypress 源自基于 JavaScript 的 Node.js。Cypress 命令本质上是同步的,因为它们依赖于节点服务器。异步流程意味着测试步骤不依赖于其先前步骤的执行。

不存在依赖性,每个步骤都作为独立身份执行。尽管测试步骤按顺序排列,但单个测试步骤不会考虑前一步骤的结果,而只是自行执行。

例子

以下是 Cypress 中异步Behave的示例 -

// test suite
describe('Tutorialspoint', function () {
   it('Scenario 1', function (){
      // test step to launch a URL
      cy.visit("https://accounts.google.com")
      // identify element
      cy.get('h1#headingText').find('span').should('have.text', 'Sign in')
      cy.get('h1#headingText').find('span').then(function(e){
         const t = e.text()
         // get in Console
         console.log(t)
      })
      // Console message
      console.log("Tutorialspoint-Cypress")
   })
})

执行结果

输出如下 -

Cypress 中的异步Behave

承诺

右键单击“Test Runner”,然后单击“Inspect”,我们可以在控制台中验证结果。这里,Tutorialspoint-Cypress(之前的步骤)在登录(稍后添加的步骤)之前已记录在控制台中。

Cypress 命令的设计方式是每个步骤都按顺序执行,并且不会同时触发。但是,它们是一前一后排列的。从而使流程同步。这是通过 Promise 实现的。

在上面的示例中,console.log是一个纯 JavaScript 语句。它不具备类似于 Cypress 命令的排队等待能力。Promise 允许我们以串行模式执行 Cypress 命令。

Promise 模式

Promise 具有三种模式来对命令执行的状态进行分类。它们如下 -

  • 已解决- 如果测试步骤成功运行,则会出现此结果。

  • Pending - 如果正在等待测试步骤运行结果,则这是结果。

  • 拒绝- 这是测试步骤运行不成功的结果。

仅当先前步骤已成功执行或收到已解决的 Promise 响应时,Cypress 命令才会执行。然后,使用该方法在Cypress中实现Promise。

例子

以下是 Cypress 中 Promise 的示例 -

describe('Tutorialspoint Test', function () {
   it('Promise', function (){
      return cy.visit('https://accounts.google.com')
      .then(() => {
         return cy.get('h1#heading');
      })
   })
})

Cypress 对 Promise 的实现是封装的并且不可见。因此,它有助于拥有更紧凑的代码。此外,我们在自动化测试时不必考虑 Promise 的状态。

没有承诺的实施

以下命令解释了如何在 Cypress 中实现无承诺的实现 -

describe('Tutorialspoint Test', function () {
   it('Without Promise', function (){
      cy.visit('https://accounts.google.com')
      cy.get('h1#heading')
   })
})