![](/img/trans.png)
[英]Need to execute a step (each feature may have diff step) only once before a Cucumber feature file
[英]Want to execute Background only once in Cucumber feature files for multiple scenarios
我想在多个场景的每个 cucumber 功能文件中只执行一次后台。 我怎样才能在步骤文件中做到这一点?
特点:用户可以验证............
背景:给定输入特定逻辑的测试数据
场景:验证............ 1 当 A1 和 B1 然后 C1
场景:验证............ 2 当 A2 和 B2 然后 C2
场景:验证............ 2 当 A3 和 B3 然后 C3
后台被设计为在每种情况之前每次都运行。 破解背景也不是很好而且标准。
测试应该隔离 。 这就是Cucumber的设计方式,并且有充分的理由。 除非您绝对需要,否则我强烈建议不要这样做。
如果您需要在整个测试套件之前执行某些操作,请考虑使用@BeforeAll挂钩。
就是说,我以前遇到过。 我们曾经进行过一些测试,这些测试将启动一个耗时的过程(例如,配置VM,一次将花费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/
如果您只希望后台运行一次。 您可以使用实例变量ex添加条件,i == 0,然后执行逻辑并在方法末尾递增i。
在下一个场景中,i值为1,不等于0,它将不会执行逻辑。
我们有类似的问题,无法为多种情况的背景找到任何解决方案。 后台设计为在所有方案都将运行“背景”之后针对所有方案运行。 如果您在这种情况下有示例,它将在每个示例之后运行。
我们必须选择解决此问题。
1)使用junit的@BeforeClass注释2)创建安装方案,它将始终首先执行。
例如:在API测试中,您只需登录一次,然后每次都使用该会话访问其他API
功能:给定客户的设置数据以系统管理员身份登录
场景:验证......... 1当A1和B1然后C1
场景:验证......... 2当A2和B2然后C2
场景:验证......... 2当A3和B3然后C3
在第一个方案之后,它将执行所有方案,并且您不需要使用背景。
我想说,每次必须将后台作为业务需求的一部分时,否则会创建不需要的测试数据并在测试环境上加载,并可能导致测试执行时间变慢。
如果您找到其他解决方案,请告诉我。
也可以通过创建标记的@Before方法并将Scenario对象作为参数来实现在每组场景或场景大纲之前运行一些步骤( 后台 )。 在before方法中,仅当方案名称与上一个方案不同时才执行逻辑。
以下是您的操作方法:
Feature:Setup Data Given Customer logs in as System Admin
@BeforeMethodName
Scenario Outline: Verify ......... 1
When <Variable1> And <Variable2>
Then <Variable3>
Examples:
| Variable1 | Variable2 | Variable3 |
| A1 | B1 | C1 |
| A2 | B2 | C2 |
| A3 | B3 | C3 |
| A4 | B4 | C4 |
@BeforeMethodName
Scenario Outline: Verify ......... 2
When <Variable1> And <Variable2>
Then <Variable3>
Examples:
| Variable1 | Variable2 | Variable3 |
| X1 | Y1 | Z1 |
| X2 | Y2 | Z2 |
| X3 | Y3 | Z3 |
| X4 | Y4 | Z4 |
并定义如下的@BeforeMethodName:
private static String scenarioName = null;
public className BeforeMethodName(Scenario scene) {
if(!scene.getName().equals(scenarioName)) {
// Implement your logic
scenarioName = scene.getName()
}
return this;
}
这样,将在每个方案之前调用BeforeMethodName,但每个方案大纲仅执行一次逻辑。
旧问题,但添加以防其他人发现此问题。
如前所述,黄瓜只应用于构建代码。
您可以使用标记的挂钩创建用于子测试集的项目。 此外,您可以将代码隔离到Helpers中,然后在ruby步骤中有条件地调用这些helper。
可能需要更清晰地做出判断
我们可以在单个功能文件中同时包含场景和场景大纲。 此方案仅运行一次,方案大纲将根据示例表中给出的数据运行
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.