有没有办法在满足特定条件时停止 Cucumber 中的场景执行?

问题描述 投票:0回答:3

目前,在我们的自动化框架中,我们需要具有一种功能,可以通过该功能控制 Cucumber 中场景步骤的执行。

问题详情:

假设我们有以下步骤作为场景的一部分:

  1. 检查订单是否存在
  2. 创建订单

我想要实现的是在步骤 1 中进行检查,如果系统中存在订单(通过数据库调用),则跳过整个场景并将其标记为通过/跳过。如果已经有的话,我们不想下订单 一些符合标准。

目前我正在通过放置一个

Assert.false()
来处理它,如果我从 DB 获取 Id ,则断言失败,表示 ID 已经存在。

但这将测试描述为失败,从报告的角度来看,这是不正确的。有没有一种方法可以将这种情况下的测试标记为通过/跳过,并在系统中存在订单时停止执行。

不幸的是,我找不到像 Assert.pass() 这样的东西,通过它我可以退出场景并将其标记为通过。

我在 Maven 项目中使用 Cucumber 和 Java。任何线索或现有文档都会有帮助。

cucumber cucumber-java cucumber-junit
3个回答
0
投票

因此,如果抛出 Cucumber Pending 异常,测试将中止。

在 ruby 中还有一个漂亮整洁的

skip_this_scenario
Worldable 方法。它会为您执行此操作并将其标记为已跳过。

对于 Java 抛出待处理异常只需使用

throw new PendingException();
我不确定那里是否存在跳过场景逻辑。但如果你仔细浏览代码库,你可能会找到它。我已经向 slack 的核心维护者询问,请随意加入 slack 小组 cucumberBDD - 如果您想了解更多信息。或者文档网站 (docs.cucumber.io)

Luke - Cucumber Ruby 维护者

编辑:https://github.com/cucumber/cucumber-jvm/tree/main/testng#skipexception - 如何在测试中跳过执行


0
投票

不确定您使用什么测试运行程序,但在 junit5 中,我只使用

Assumptions
类,如下所示

 import org.junit.jupiter.api.Assumptions;

 ....

@Given("an employee record is created with values")

    public void create_employee_record(){

       // i'll just pass false as the parameter but it could be any method that retuns false

        Assumptions.assumeTrue((false));
      ...
     //more code here
      
}

Assumptions.assumeTrue((false))
验证后,以上场景将不再执行,并继续执行下一个场景。在报告中,这将被标记为中止,而其他场景将被标记为通过


0
投票

您可以使用 Before 钩子并在里面使用

return 'skipped';
吗?

跳过前挂钩

此示例仅在月底运行:

import { Before } from '@cucumber/cucumber';

Before({ tags: '@ifEndOfMonth' }, async function () {
  const currentDate = new Date();
  if (currentDate.getDate() !== new Date(currentDate.getFullYear(), currentDate.getMonth() + 1, 0).getDate()) {
    console.log(`Skipping Scenario ${currentDate} not the end of month`);
    return 'skipped';
  } else {
    console.log(`Running scenario, it is the end of month ${currentDate}`);
  }
});
© www.soinside.com 2019 - 2024. All rights reserved.