繁体   English   中英

只想在 Cucumber 功能文件中针对多个场景执行一次后台

[英]Want to execute Background only once in Cucumber feature files for multiple scenarios

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

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

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

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

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

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

后台被设计为在每种情况之前每次都运行。 破解背景也不是很好而且标准。

测试应该隔离 这就是Cucumber的设计方式,并且有充分的理由。 除非您绝对需要,否则我强烈建议不要这样做。

如果您需要在整个测试套件之前执行某些操作,请考虑使用@BeforeAll挂钩。

就是说,我以前遇到过。 我们曾经进行过一些测试,这些测试将启动一个耗时的过程(例如,配置VM,一次将花费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,它将不会执行逻辑。

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

我们必须选择解决此问题。

1)使用junit的@BeforeClass注释2)创建安装方案,它将始终首先执行。

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

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

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

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

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

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

我想说,每次必须将后台作为业务需求的一部分时,否则会创建不需要的测试数据并在测试环境上加载,并可能导致测试执行时间变慢。

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

也可以通过创建标记的@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,但每个方案大纲仅执行一次逻辑。

旧问题,但添加以防其他人发现此问题。

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

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

可能需要更清晰地做出判断

我们可以在单个功能文件中同时包含场景和场景大纲。 此方案仅运行一次,方案大纲将根据示例表中给出的数据运行

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM