3

对于多个场景,我只想在每个黄瓜功能文件中执行一次后台。我怎样才能在步骤文件中做到这一点?

特点:用户可以验证............

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

场景:验证............ 1 当 A1 和 B1 然后 C1

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

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

4

6 回答 6

5

测试应该是隔离的。这就是 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/

于 2017-01-12T16:54:19.613 回答
4

后台设计为在每个场景之前每次运行。破解背景既不好也不标准。

于 2016-02-18T00:32:10.470 回答
2

如果您希望您的背景只运行一次。您可以使用实例变量 ex, i==0 添加条件,然后执行逻辑并在方法结束时增加 i。

对于下一个场景,i 值为 1,不等于 0,它不会执行逻辑。

于 2019-05-21T02:39:27.533 回答
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,但每个场景大纲仅执行一次逻辑。

于 2018-12-07T07:07:25.250 回答
0

我们遇到了类似的问题,找不到针对多个场景的背景的任何解决方案。背景设计为在每个场景运行背景之后为所有场景运行。如果在这种情况下您有场景中的示例,它将在每个示例之后运行。

我们不得不选择解决这个问题。

1) 使用了 junit 的 @BeforeClass 注解 2) 创建设置场景,它总是首先执行。

例如:在 API 测试中,您登录一次,每次都使用该会话访问其他 API

功能:设置数据给定客户以系统管理员身份登录

场景:验证............ 1 当 A1 和 B1 然后 C1

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

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

在第一个场景之后,它将执行所有场景并且您不需要使用背景。

我会说每次都必须使用背景作为业务需求的一部分,否则它将创建不需要的测试数据并加载到测试环境中,并可能导致测试执行时间变慢。

如果您找到其他解决方案,请告诉我。

于 2016-01-12T21:07:04.803 回答
0

老问题,但添加其他人发现这个。

如前所述,黄瓜应该只用于构建你的代码。

您可以使用标记的挂钩来创建用于测试子集的项目。此外,您可以将代码隔离到 Helpers 中,然后在您的 ruby​​ 步骤中有条件地调用这些帮助程序。

可能需要更清楚一点才能做出判断

于 2019-02-22T12:51:38.763 回答