想要在多个场景的 Cucumber 功能文件中只执行一次后台

Sae*_*eeK 5 ruby cucumber capybara site-prism selenium-webdriver

我想在多个场景的每个黄瓜功能文件中仅执行一次后台。我怎样才能在步骤文件中做到这一点?

特点:用户可以验证............

背景:给定输入特定逻辑的测试数据

场景:验证......1 当A1和B1然后C1时

场景:验证......2 当A2和B2然后C2时

场景:验证......2 当A3和B3然后C3时

Sai*_*rua 7

后台设计为每次在每个场景之前运行。破解背景并不好,也不标准。


小智 5

测试应该是隔离的。这就是 Cucumber 的设计方式,并且有一个很好的理由。除非绝对必要,否则我强烈反对这样做。

如果您需要在整个测试套件之前执行某些操作,请考虑使用 @BeforeAll 挂钩。

也就是说,我以前遇到过这个。我们进行了一些测试,这些测试将启动一个需要很长时间的过程(例如配置虚拟机,一次需要 10 分钟......),但如果已经完成,则可以在其他测试中跳过。

因此,您可能想要按照以下方式设计步骤:

“鉴于..X已经完成”

并在该步骤中检测X是否完成,如果没有,则执行X,如果已完成,则跳过。例如,假设创建用户是一个绝对需要很长时间的过程。那么我们可以做..

Given that user "Joe Bloggs" has been created

步骤定义将首先尝试确定 Joe 是否存在,如果不存在,则创建用户。您遇到了初始启动问题,但其他测试将能够安全地假设 Joe 存在。

为什么你不应该这样做

如果您这样做,您的测试很可能会相互冲突。

假设您有很多使用 Joe Bloggs 用户的测试。也许有人会把他从系统中删除。有些可能会暂时停用用户、添加角色、更改名称……各种各样的事情。所有测试都假设有关他们正在测试的系统的某些事情,并且您故意损害有关环境的测试假设。

如果您正在运行并行测试,情况尤其糟糕。也许您的系统有一项限制,即一次只能有一个人以 Joe 身份登录。或者每个测试都会改变有关 Joe 的大量内容,并且没有测试可以假设有关 Joe 用户状态的任何信息。那么你就会陷入一个巨大的混乱。

最好的解决方案通常是为您运行的每个测试创建全新的数据。打开这些 API 并为每次测试运行创建一次性数据。这是一篇关于它的好博客文章:https ://opencredo.com/test-automation-concepts-data-aliases/