【问题标题】:Want to execute Background only once in Cucumber feature files for multiple scenarios只想在 Cucumber 功能文件中为多个场景执行一次后台
【发布时间】:2016-01-12 19:41:14
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 这个想法是让场景彼此隔离,这样一个场景中的某些东西就不会破坏另一个场景 - 如果只调用一次背景,那么在一个场景中所做的更改可能会影响其他场景,并且您的场景运行变得依赖于顺序 - 如果您只是想预填充一些不会被测试更改的表,那么您可能需要查看 DatabaseCleaner 的 :except 选项与 :truncation 一起使用

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


【解决方案1】:

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

【讨论】:

  • @BeforeAll 不是黄瓜注解
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

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

      1) 使用了 junit 的 @BeforeClass 注解 2) 创建设置场景,它将始终在首位执行。

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

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

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

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

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

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

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

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

      【讨论】:

      • 我在我的测试框架中使用 Ruby。而且我已经编写了与您类似的结构,在使用登录步骤之前只运行了一次钩子,但我仍然想为每个功能文件只运行一次后台。因为我不想在每个场景之前一次又一次地加载相同的数据,这会占用我很多时间。不同的功能文件我有不同的数据集要加载。所以我的后台应该只执行一次。
      • 您可以使用状态来破解背景,但这并不好,也不是工业标准。据我所知,没有办法使用黄瓜运行后台
      • 我可以使用变通方法修复它:而不是有多个场景,我可以将所有步骤保留在一个场景中,并在我的步骤代码中进行一些修改,这实际上可能会解决我的问题。
      • 场景中的所有修改都应该对企业主和其他利益相关者有意义。修复自动化点的场景不是个好主意。
      【解决方案5】:

      在每个场景集场景大纲之前运行一些步骤(背景)也可以通过创建一个标记来实现@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 将在每个场景之前被调用,但每个场景大纲只会执行一次逻辑。

      【讨论】:

        【解决方案6】:

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

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-08-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-10-16
          • 1970-01-01
          相关资源
          最近更新 更多