Cypress fixtures 最佳实践

Cypress fixtures best practice

在赛普拉斯文档中,他们建议以这种方式使用固定装置

cy.fixture('logo.png').then((logo) => { // load data from logo.png }) 但我发现它很乱,而且有局限性,因为我无法在 运行 测试之外获取此信息 所以我正在使用

import cred from "../fixtures/login_creds.json"

使用导入有缺点吗? 当然我在 cy 方法中使用它

cy.get(inputEmail).type(cred.email)

您可以使用 beforeEach() 来存储您对夹具的访问,以便它可用于您的所有测试。但是你必须处理一件事而不是 => 你必须使用 function () { ... } 回调。

describe('Test Suite', () => {
  beforeEach(function () {
    // "this" points at the test context object
    cy.fixture('login_creds.json').then((loginCreds) => {
      // "this" is still the test context object
      this.loginCreds = loginCreds
    })
  })

  // the test callback is in "function () { ... }" form
  it('Some test', function () {
    // this.loginCreds exists
    cy.get(inputEmail).type(this.loginCreds.email)
  })

  it('Another test', function () {
    // this.loginCreds exists
    cy.get(inputEmail2).type(this.loginCreds.email)
  })
})

您可以从 fixtures docs 阅读更多相关信息。

导入夹具没问题。

它对 data-driven 测试很有用。

import sites from '../fixtures/sites.json'

sites.forEach(site => {

  it(`test ${site}`, () => {
    cy.visit(site)
    ...
  })
})

此处描述了几乎所有使用固定装置的方法 Load Fixtures from Cypress Custom Commands,包括使用 import(最后一个示例)

/// <reference types="cypress" />

import { users } from '../fixtures/data.json'

// note that Cypress._ is available outside of any test.
// the index k will be from 0 to users.length - 1
const k = Cypress._.random(users.length - 1)
expect(k, 'random user index').to.be.within(0, users.length - 1)
const testUser = users[k]

他们中的很多人使用“公共变量”来存储夹具。

无需修改测试结构即可工作。

// use a common variable to store the random user
let testUser

before(() => {
  cy.fixture('data.json').then(({ users }) => {
    // the index k will be from 0 to users.length - 1
    const k = Cypress._.random(users.length - 1)
    expect(k, 'random user index').to.be.within(0, users.length - 1)
    testUser = users[k]

    // we need to send the entire database object
    cy.request('POST', '/reset', {
      users: [testUser],
    })
  })
})

it('sets the random user from the fixture list', () => {
  cy.visit('/')
  const name = testUser.name
  cy.contains('#user', `${name.first} ${name.last}`)
})

it('has the test user', () => {
  expect(testUser).to.be.an('object')
})