想在多个场景的 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,它不会执行逻辑。