我想在多个场景的每个黄瓜特征文件中只执行一次背景。我怎么能在步骤文件中这样做?
功能:用户可以验证...........
背景: 给定输入特定逻辑的测试数据
场景:验证......... 1 当A1 和B1 那么C1
场景:验证......... 2 当A2 和B2 然后是C2
场景:验证......... 2 当A3 和B3 然后C3
答案 0 :(得分:3)
后台设计为每次在每个场景之前运行。它不是很好的标准以及黑客背景。
答案 1 :(得分:2)
应该隔离测试。这就是Cucumber的设计方式,这是一个很好的理由。除非你绝对不得不这样做,否则我强烈反对。
如果您需要在整个测试套件之前执行某些操作,请考虑@BeforeAll钩子。
那就是说,我之前遇到过这个问题。我们进行的测试会启动一个花费很长时间的过程(例如配置一个VM,一次需要10分钟......),但如果已经完成,可以在其他测试中跳过。
所以你可能想要按照......的方式设计步骤。
"鉴于...... X已完成"
并在步骤中检测X是否完成,如果没有,则执行X.如果有,则跳过它。例如,说创建用户是一个绝对年龄的过程。然后我们可以做..
Given that user "Joe Bloggs" has been created
步骤定义将首先尝试确定Joe是否存在,然后如果他们没有,则创建用户。您有一个初始启动问题,但其他测试将能够安全地假设Joe存在。
为什么你不应该这样做
如果这样做,您的测试很可能会相互冲突。
假设您有很多使用Joe Bloggs用户的测试。也许有些人会将他从系统中删除。有些人可能暂时停用用户,添加角色,更改他们的名字......各种各样的事情。所有测试都假定了他们正在测试的系统的某些事情,并且您故意损害您对环境的测试假设。
如果您正在运行并行测试,那就特别糟糕。也许你的系统有一个限制,只有一个人可以作为乔一次登录。或者每个测试都会改变关于Joe的大量内容,并且没有任何测试可以假设Joe用户的状态。然后你会陷入一团糟。
最佳解决方案通常是为您运行的每个测试创建全新数据。打开这些API并为每次测试运行创建可支配数据。这是一篇关于它的好文章:https://opencredo.com/test-automation-concepts-data-aliases/
答案 2 :(得分:1)
如果您只希望后台运行一次。您可以使用实例变量ex添加条件,i == 0,然后执行逻辑并在方法末尾递增i。
对于下一种情况,i值为1,不等于0,它将不执行逻辑。
答案 3 :(得分:0)
我们遇到了类似的问题,无法找到任何针对多种情况的背景解决方案。后台设计为在运行后的每个场景后运行所有场景。如果在这种情况下你在场景中有例子,它将在每个例子之后运行。
我们必须选择解决这个问题。
1)使用了junit的@BeforeClass Annotation 2)创建设置场景,它将始终在第一位执行。
例如:在API测试中,您需要登录一次,并且每次都使用该会话来访问其他API
功能:设置数据 鉴于客户以系统管理员身份登录
场景:验证......... 1当A1和B1然后C1
场景:验证......... 2当A2和B2然后C2
场景:验证......... 2当A3和B3然后C3
在第一个场景之后,它将执行所有场景并且您不需要使用背景。
我会说每次必须使用后台作为业务需求的一部分,否则会产生不需要的测试数据并加载测试环境,并可能导致测试执行时间变慢。
如果您找到其他解决方案,请与我们联系。
答案 4 :(得分:0)
在每个套方案或方案大纲之前运行一些步骤(背景),也可以通过创建一个带有标签的标签来实现@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,但每个方案大纲仅将逻辑执行一次。
答案 5 :(得分:0)
旧问题,但添加以防其他人发现。
如前所述,黄瓜只应用于构建代码。
您可以使用标记的挂钩创建用于子测试集的项目。此外,您可以将代码隔离到Helpers中,然后在ruby步骤中有条件地调用这些helper。
做出判断可能需要更多的清晰度