想在多个场景的 Cucumber 特性文件中只执行一次 Background
Want to execute Background only once in Cucumber feature files for multiple scenarios
我只想在多个场景的每个黄瓜功能文件中执行一次后台。我怎样才能在步骤文件中做到这一点?
特点:用户可以验证......
背景:
给定输入特定逻辑的测试数据
场景:验证......... 1
当A1
和B1
那么C1
场景:验证......... 2
当A2
和B2
那么C2
场景:验证......... 2
当A3
和B3
然后C3
我们遇到了类似的问题,找不到任何针对多场景背景的解决方案。背景设计为 运行 所有场景,每个场景都会 运行 背景。如果您在这种情况下有示例,它会在每个示例后 运行。
我们不得不选择解决这个问题。
1)使用了junit的@BeforeClass注解
2) 创建setup scenario,它总是在第一位执行。
例如:在 API 测试中,您登录一次,每次都使用该会话访问其他 API
特征:设置数据
鉴于客户以系统管理员身份登录
场景:验证......... 1 当 A1 和 B1 然后 C1
场景:验证......... 2 当 A2 和 B2 然后 C2
场景:验证......... 2 当 A3 和 B3 然后 C3
在第一个场景之后它将执行所有场景并且您不需要使用后台。
我会说,每次它必须是业务需求的一部分时都使用后台,否则它会创建不需要的测试数据和测试环境负载,并可能导致测试执行时间变慢。
如果您找到其他解决方案,请告诉我。
背景设计为运行每次在每个场景之前。破解背景也不好和标准。
测试应该隔离。这就是 Cucumber 的设计方式,这是有充分理由的。我会强烈反对它,除非你绝对必须这样做。
如果您需要在整个测试套件之前执行某些操作,请考虑使用 @BeforeAll 挂钩。
也就是说,我以前遇到过这种情况。我们有一些测试会启动一个需要很长时间的过程(例如配置 VM,一次需要 10 分钟......),但如果已经完成,可以在其他测试中跳过。
因此您可能希望按照以下方式设计步骤..
"Given that .. X has been done"
并在步骤中检测X是否完成,如果没有,则执行X,如果完成,则跳过。例如,假设创建用户是一个绝对需要很长时间的过程。然后我们可以做..
Given that user "Joe Bloggs" has been created
步骤定义将首先尝试确定 Joe 是否存在,如果不存在,则创建用户。您有一个初始启动问题,但随后其他测试将能够安全地假设 Joe 存在。
为什么你不应该这样做
如果您这样做,您的测试很可能会相互冲突。
假设您有很多使用 Joe Bloggs 用户的测试。也许有些人会把他从系统中删除。有些人可能会暂时停用用户、添加角色、更改他们的名字……各种各样的事情。所有测试都假设了他们正在测试的系统的某些事情,而您是在故意损害您对环境的测试假设。
如果您要进行 运行 并行测试,那就特别糟糕了。也许您的系统有一个限制,即一次只能有一个人以 Joe 的身份登录。或者每个测试都在改变有关 Joe 的负载,并且没有任何测试可以假设有关 Joe 用户状态的任何信息。那你就乱七八糟了。
最好的解决方案通常是为您的每个测试创建全新的数据运行。打开这些 API 并为每个测试创建一次性数据 运行。这是一个很好的博客post:https://opencredo.com/test-automation-concepts-data-aliases/
运行在每个场景集或场景大纲[之前的一些步骤(背景) =25=] 也可以通过创建一个 标记的 @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 将在每个场景之前调用,但每个场景大纲只会执行一次逻辑。
老问题,但添加柜面其他人发现这个。
如前所述,cucumber 只能用于构建代码。
您可以使用标记的挂钩来创建用于测试子集的项目。此外,您可以将代码隔离到助手中,然后在 ruby 步骤中有条件地调用这些助手。
可能需要更清楚一点才能做出判断
如果你想让你的背景只运行一次。您可以使用实例变量 ex 添加条件,i==0 然后执行逻辑并在方法结束时递增 i。
对于下一个场景,i值为1不等于0,它不会执行逻辑。
我只想在多个场景的每个黄瓜功能文件中执行一次后台。我怎样才能在步骤文件中做到这一点?
特点:用户可以验证......
背景: 给定输入特定逻辑的测试数据
场景:验证......... 1 当A1 和B1 那么C1
场景:验证......... 2 当A2 和B2 那么C2
场景:验证......... 2 当A3 和B3 然后C3
我们遇到了类似的问题,找不到任何针对多场景背景的解决方案。背景设计为 运行 所有场景,每个场景都会 运行 背景。如果您在这种情况下有示例,它会在每个示例后 运行。
我们不得不选择解决这个问题。
1)使用了junit的@BeforeClass注解 2) 创建setup scenario,它总是在第一位执行。
例如:在 API 测试中,您登录一次,每次都使用该会话访问其他 API
特征:设置数据 鉴于客户以系统管理员身份登录
场景:验证......... 1 当 A1 和 B1 然后 C1
场景:验证......... 2 当 A2 和 B2 然后 C2
场景:验证......... 2 当 A3 和 B3 然后 C3
在第一个场景之后它将执行所有场景并且您不需要使用后台。
我会说,每次它必须是业务需求的一部分时都使用后台,否则它会创建不需要的测试数据和测试环境负载,并可能导致测试执行时间变慢。
如果您找到其他解决方案,请告诉我。
背景设计为运行每次在每个场景之前。破解背景也不好和标准。
测试应该隔离。这就是 Cucumber 的设计方式,这是有充分理由的。我会强烈反对它,除非你绝对必须这样做。
如果您需要在整个测试套件之前执行某些操作,请考虑使用 @BeforeAll 挂钩。
也就是说,我以前遇到过这种情况。我们有一些测试会启动一个需要很长时间的过程(例如配置 VM,一次需要 10 分钟......),但如果已经完成,可以在其他测试中跳过。
因此您可能希望按照以下方式设计步骤..
"Given that .. X has been done"
并在步骤中检测X是否完成,如果没有,则执行X,如果完成,则跳过。例如,假设创建用户是一个绝对需要很长时间的过程。然后我们可以做..
Given that user "Joe Bloggs" has been created
步骤定义将首先尝试确定 Joe 是否存在,如果不存在,则创建用户。您有一个初始启动问题,但随后其他测试将能够安全地假设 Joe 存在。
为什么你不应该这样做
如果您这样做,您的测试很可能会相互冲突。
假设您有很多使用 Joe Bloggs 用户的测试。也许有些人会把他从系统中删除。有些人可能会暂时停用用户、添加角色、更改他们的名字……各种各样的事情。所有测试都假设了他们正在测试的系统的某些事情,而您是在故意损害您对环境的测试假设。
如果您要进行 运行 并行测试,那就特别糟糕了。也许您的系统有一个限制,即一次只能有一个人以 Joe 的身份登录。或者每个测试都在改变有关 Joe 的负载,并且没有任何测试可以假设有关 Joe 用户状态的任何信息。那你就乱七八糟了。
最好的解决方案通常是为您的每个测试创建全新的数据运行。打开这些 API 并为每个测试创建一次性数据 运行。这是一个很好的博客post:https://opencredo.com/test-automation-concepts-data-aliases/
运行在每个场景集或场景大纲[之前的一些步骤(背景) =25=] 也可以通过创建一个 标记的 @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 将在每个场景之前调用,但每个场景大纲只会执行一次逻辑。
老问题,但添加柜面其他人发现这个。
如前所述,cucumber 只能用于构建代码。
您可以使用标记的挂钩来创建用于测试子集的项目。此外,您可以将代码隔离到助手中,然后在 ruby 步骤中有条件地调用这些助手。
可能需要更清楚一点才能做出判断
如果你想让你的背景只运行一次。您可以使用实例变量 ex 添加条件,i==0 然后执行逻辑并在方法结束时递增 i。
对于下一个场景,i值为1不等于0,它不会执行逻辑。