目前,在我们的自动化框架中,我们需要具有一种功能,可以通过该功能控制 Cucumber 中场景步骤的执行。
问题详情:
假设我们有以下步骤作为场景的一部分:
我想要实现的是在步骤 1 中进行检查,如果系统中存在订单(通过数据库调用),则跳过整个场景并将其标记为通过/跳过。如果已经有的话,我们不想下订单 一些符合标准。
目前我正在通过放置一个
Assert.false()
来处理它,如果我从 DB 获取 Id ,则断言失败,表示 ID 已经存在。
但这将测试描述为失败,从报告的角度来看,这是不正确的。有没有一种方法可以将这种情况下的测试标记为通过/跳过,并在系统中存在订单时停止执行。
不幸的是,我找不到像 Assert.pass() 这样的东西,通过它我可以退出场景并将其标记为通过。
我在 Maven 项目中使用 Cucumber 和 Java。任何线索或现有文档都会有帮助。
因此,如果抛出 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 - 如何在测试中跳过执行
不确定您使用什么测试运行程序,但在 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))
验证后,以上场景将不再执行,并继续执行下一个场景。在报告中,这将被标记为中止,而其他场景将被标记为通过
您可以使用 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}`);
}
});