希望在多个场景的 cucumber 要素文件中仅执行一次后台

v9tzhpje  于 2022-09-21  发布在  Ruby
关注(0)|答案(7)|浏览(226)

对于多个场景,我只想在每个 cucumber 特征文件中执行一次后台。我如何在STEP文件中做到这一点?

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

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

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

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

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

kmbjn2e3

kmbjn2e31#

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

5sxhfpxr

5sxhfpxr2#

后台设计为每次在每个方案之前运行。黑背景也不好,也不标准。

xxslljrj

xxslljrj3#

如果您希望后台只运行一次。您可以使用示例变量ex,i==0添加条件,然后在方法的末尾执行逻辑并递增i。

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

new9mtju

new9mtju4#

我们有类似的问题,无法为多个场景的后台找到任何解决方案。后台被设计为在它将运行后台的每个方案之后为所有方案运行。如果您在Scenario中有示例,在本例中,它将在每个示例之后运行。

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

1)使用了junit的@BeForeClass Annotation 2)Create Setup Scenario,它总是首先执行。

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

功能:在客户以系统管理员身份登录的情况下设置数据

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

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

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

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

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

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

jc3wubiy

jc3wubiy5#

也可以在每个场景集或*场景大纲之前运行一些步骤(背景),方法是创建一个Tagging@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,但每个场景大纲只执行一次逻辑。

uidvcgyl

uidvcgyl6#

我们可以在单个功能文件中同时包含场景和场景大纲。在此情况下,场景将仅运行一次,并且场景大纲将基于示例表中给出的数据运行

dxxyhpgq

dxxyhpgq7#

  • 老问题,但增加了以防其他人发现这一点。*

如前所述, cucumber 应该只用于构建代码结构。

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

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

相关问题