我如何在赛普拉斯的所有测试套件之前执行代码?

How can I execute code before all tests suite with Cypress?

基本上,我想在执行所有文件中的所有测试之前登录一次。

我应该使用 before 挂钩在每个测试文件中调用我的登录命令,还是有任何方法可以在所有测试之前执行一次?

简短回答: 您可以在 supportFile (the file that is loaded automatically before your other spec files) 中的 before 挂钩中编写登录命令。此 before 挂钩将 运行 在您其他测试文件中的任何代码之前。


建议: 话虽这么说,这种方法对您将来可能需要的个人测试文件的变化几乎没有灵活性,例如:

  • 如果您想为一次测试以不同的方式为数据库设置种子怎么办?
  • 如果您想以具有不同权限的不同用户身份登录怎么办?
  • 如果您需要在 onBeforeLoad 中执行一次怎么办?

我建议在每个单独的规范文件的 before 挂钩中只包含登录命令。

我还 进一步 建议将您的登录命令放在 beforeEach 挂钩中 avoid sharing any state in between tests

我会在每次测试之前登录,因为之前的测试中可能会发生影响当前测试结果的事情。通过全新登录,您每次都从一个干净的状态开始。如果您想测试 "chain" 不相关的操作(操作 A 然后操作 B),请将其编写为单独的测试,但在单独的测试中具有基本功能。

describe('/page'), () => {
  beforeEach(() => {
    cy.login()        // custom command that hanldes login w/o UI
    cy.visit('/page') // go to the page you are testing
  })

  // tests
})

您应该在每个测试文件中包含一个 beforeEach 块。此块应登录并导航到相关页面。

describe('Hooks', function() {
    before(function() {
        // runs once before all tests in the block
    })
})

https://docs.cypress.io/guides/core-concepts/writing-and-organizing-tests.html#Hooks

正如其他人已经建议的那样,我会将要执行的函数包装在 before 块中。 现在,查看 docs, I would make that happen in the cypress/support/index.js file.