对于多个场景,我只想在每个黄瓜功能文件中执行一次后台。我怎样才能在步骤文件中做到这一点?
特点:用户可以验证............
背景:给定输入特定逻辑的测试数据
场景:验证............ 1 当 A1 和 B1 然后 C1
场景:验证............ 2 当 A2 和 B2 然后 C2
场景:验证............ 2 当 A3 和 B3 然后 C3
对于多个场景,我只想在每个黄瓜功能文件中执行一次后台。我怎样才能在步骤文件中做到这一点?
特点:用户可以验证............
背景:给定输入特定逻辑的测试数据
场景:验证............ 1 当 A1 和 B1 然后 C1
场景:验证............ 2 当 A2 和 B2 然后 C2
场景:验证............ 2 当 A3 和 B3 然后 C3
测试应该是隔离的。这就是 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/
后台设计为在每个场景之前每次运行。破解背景既不好也不标准。
如果您希望您的背景只运行一次。您可以使用实例变量 ex, i==0 添加条件,然后执行逻辑并在方法结束时增加 i。
对于下一个场景,i 值为 1,不等于 0,它不会执行逻辑。
在每组场景或场景大纲之前运行一些步骤(背景)也可以通过创建标记的@Before方法并将场景对象作为参数传递来实现。在 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,但每个场景大纲仅执行一次逻辑。
我们遇到了类似的问题,找不到针对多个场景的背景的任何解决方案。背景设计为在每个场景运行背景之后为所有场景运行。如果在这种情况下您有场景中的示例,它将在每个示例之后运行。
我们不得不选择解决这个问题。
1) 使用了 junit 的 @BeforeClass 注解 2) 创建设置场景,它总是首先执行。
例如:在 API 测试中,您登录一次,每次都使用该会话访问其他 API
功能:设置数据给定客户以系统管理员身份登录
场景:验证............ 1 当 A1 和 B1 然后 C1
场景:验证............ 2 当 A2 和 B2 然后 C2
场景:验证............ 2 当 A3 和 B3 然后 C3
在第一个场景之后,它将执行所有场景并且您不需要使用背景。
我会说每次都必须使用背景作为业务需求的一部分,否则它将创建不需要的测试数据并加载到测试环境中,并可能导致测试执行时间变慢。
如果您找到其他解决方案,请告诉我。
老问题,但添加其他人发现这个。
如前所述,黄瓜应该只用于构建你的代码。
您可以使用标记的挂钩来创建用于测试子集的项目。此外,您可以将代码隔离到 Helpers 中,然后在您的 ruby 步骤中有条件地调用这些帮助程序。
可能需要更清楚一点才能做出判断