如何在赛普拉斯的所有测试套件之前执行代码?
Posted
技术标签:
【中文标题】如何在赛普拉斯的所有测试套件之前执行代码?【英文标题】:How can I execute code before all tests suite with Cypress? 【发布时间】:2018-06-15 01:38:44 【问题描述】:基本上,我想在所有文件中的所有测试执行之前登录一次。
我应该使用 before 钩子在每个测试文件中调用我的登录命令,还是有什么方法可以在所有测试之前执行一次?
【问题讨论】:
我已经阅读了 supportFile,但我不确定它是否可以处理像网络请求这样的异步代码。处理我的意思是,确保在启动测试之前解决此文件中执行的所有异步任务。supportFile
与其他任何规格文件没有什么不同,只是它在其他规格文件之前加载。如果你想处理一些异步请求,你应该使用cy.request()
。
【参考方案1】:
简答:您可以在supportFile
(the file that is loaded automatically before your other spec files) 内的before
挂钩中编写登录命令。这个before
挂钩将在其他测试文件中的任何代码之前运行。
建议:话虽如此,这种方法对于您将来可能需要的个别测试文件的变化几乎没有灵活性:
如果您想为一项测试以不同方式播种数据库怎么办? 如果您想以具有不同权限的不同用户身份登录怎么办? 如果您需要在onBeforeLoad
中进行一次操作怎么办?
我建议在每个单独的规范文件中将登录命令放在 before
挂钩中。
我还进一步建议将您的登录命令放在beforeEach
挂钩到avoid sharing any state in between tests。
【讨论】:
那么 before 钩子在其他框架中就相当于beforeAll
?很高兴知道,因为在运行时说 'beforeEach(... cy.visit(myUrl)` 真的很乏味,而您只是在测试页面上是否存在一堆静态功能。
是的,before
钩子相当于beforeAll
。
为什么要在每次测试前强制登录?我大体上同意避免在测试之间共享状态的决定,但我非常愿意让诸如登录该规则的例外之类的事情。登录通常需要一秒钟或更长时间。为什么要将开销添加到每个测试中?我认为更好的替代方法是使用preserve once 来加快速度。
@erandros 我能理解你的担忧。我个人认为最好了解登录和状态/会话共享,也许为每组相关测试重新登录。要考虑的另一个想法是使用 cy.request() POST 登录以登录用户,而不是使用 UI 登录,因为它更快(您还可以在此 POST 登录期间获取或处理 cookie)。一般来说,虽然我认为詹妮弗警告测试之间共享状态是正确的。理想情况下,运行测试的顺序不应影响测试结果。【参考方案2】:
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
【讨论】:
这正是我想要的。我想在块中的所有测试之前运行代码。【参考方案3】:我会在每次测试之前登录,因为之前的测试中发生的事情可能会影响当前测试的结果。使用新登录,您每次都以干净的状态开始。如果您想测试一个“链”不相关的动作(动作 A THEN 动作 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 块。此块应登录并导航到相关页面。
【讨论】:
"...之前的测试中发生的事情可能会影响当前测试的结果..."——如果您正在编写好的测试,则不会。测试不应依赖于来自单独测试的任何状态更改,也不应进行永久性更改或延续到其他测试。模拟你需要的东西! 我认为@GrayedFox 没有理解您试图解释的重点。基本上,他表达了你试图表达的同样的想法。 +1 以补偿某人给你的不公平的反对票。以上是关于如何在赛普拉斯的所有测试套件之前执行代码?的主要内容,如果未能解决你的问题,请参考以下文章