Переопределение Cypress 'до и после методов - PullRequest
0 голосов
/ 06 февраля 2020

Мы используем Cypress.io для создания нашего пакета автоматизации. У нас есть требование заполнять нашу базу данных перед каждым тестом, а затем очищать данные. Это можно сделать, как показано ниже.

describe('Our test suite', function() {
  before(function () {
    //loadDbSeed is a custom command that will load the seed file based on the spec file
    seed = cy.loadDbSeed()
    cy.task('seed:db', seed)
  })

  it('should be true', function() {
    //Some test with some action followed by an assertion
    cy.visit('/some-page')
    cy.get('[data-cy="identifier"]')
      .click()
    expect(true).to.equal(true)
  })

  after(function () {
    // clearDb is a custom command that will clear out the DB.
    // We are still debating if we must clear the DB after the tests.
    // But we might still need to do some common actions for the entire suite after
    cy.clearDb()
  })
})

Проблема, которую мы видим, состоит в том, что для всех наших тестовых наборов потребуются одинаковые операции before и after. Итак, мы хотели бы переопределить эти методы, чтобы наши тесты были примерно такими:

describe('Our test suite', function() {
  before(function () {
    // DB seeding is done automatically
    // Write only custom before steps required for this test
  })

  it('should be true', function() {
    //Some test with some action followed by an assertion
    cy.visit('/some-page')
    cy.get('[data-cy="identifier"]')
      .click()
    expect(true).to.equal(true)
  })

  after(function () {
    // DB clearing is done automatically
    // Write only custom after steps required for this test
  })
})

Как нам этого добиться? Я копался в коде Cypress и не нашел ничего очевидного.

1 Ответ

0 голосов
/ 06 февраля 2020

Если вы посмотрите на документы Cypress, использование after не рекомендуется - Cypress Docs . Я бы предостерег от настройки данных в глобальном масштабе, будет ли она вам нужна для каждого теста? Если в какой-то момент вам нужно будет вводить данные для каждого теста, будет ли это противоречить этим глобальным данным? Вы можете сделать что-то подобное для каждого теста:

describe('Our test suite', function() {
  beforeEach(function () {
     cy.then(async () => {
       await MyDatabaseService.resetdata()
       await MyDatabaseService.createSomeData()
     });
   });

  it('should be true', function() {
    //Some test with some action followed by an assertion
  })
})

Мне также пришлось вложить несколько тестов, как указано ниже, когда для конкретных c тестов нужны конкретные данные c (извините, если некоторые из форматирование здесь немного, надеюсь, это будет иметь смысл!):

describe('Our test suite', function() {
  beforeEach(function () {
     cy.then(async () => {
       await MyDatabaseService.resetdata()
       await MyDatabaseService.createSomeData()
     });
   });

  it('should be true', function() {
    //Some test with some action followed by an assertion
  });

   describe('These tests need more data, this is a nested describe', function () {
     before(function () {
       cy.then(async () => {
         await MyDatabaseService.addSomeMoreData()
       });
     it('this test uses the extra data', function () {
     // Do some funky tests here
    });
   });
 });

})

Для второго теста, приведенного выше, тест запустит все три действия базы данных.

Upshot есть, если Вы очищаете данные до , когда вы запускаете свои тесты, тогда это проясняет ситуацию.

Надеюсь, это поможет. Я новичок в Cypress, и может быть трудно отказаться от тех (плохих?) Привычек, которые мы использовали в Selenium в течение некоторого времени!

...