想要在多个场景的Cucumber特征文件中仅执行一次Background

时间:2016-01-12 19:41:15

标签: ruby selenium-webdriver cucumber capybara site-prism

我想在多个场景的每个黄瓜特征文件中只执行一次背景。我怎么能在步骤文件中这样做?

功能:用户可以验证...........

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

场景:验证......... 1     当A1     和B1     那么C1

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

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

6 个答案:

答案 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。

做出判断可能需要更多的清晰度