java - 如何使用 Maven 和 Cucumber 为 JUnit @Before 钩子(Hook)定义不同的行为

标签 java maven cucumber cucumber-jvm

我的挑战是我有两种不同类型的测试,它们使用 Cucumber BDD 与 Java、Maven 和 JUnit 一起运行。

在几个与 UI 相关的功能中,我需要在每个场景之前执行一些操作,例如启动 VM,如下所示:

public class StepDefinitions {
    @Before
    protected void setUp(Scenario scenario) throws MalformedURLException {
        //Create browser resources here for all of my UI related scenarios
} 

但是,在非 UI 测试中,例如 API 测试,我不需要启动那些浏览器。因此,对于名为 setUp 的 @Before 方法,我确实需要一种不同的行为。

我面临的挑战是,@Before Hook 似乎适用于每个测试方法,即使这些方法位于不同的类中。结果,无论我尝试什么,总是会创建浏览器资源,即使对于不需要浏览器的 API 测试也是如此。

这是我尝试过但没有成功的方法:

  • 我为 API 测试创建了一个完全独立的功能文件和 StepDefinitions 文件。定义文件没有引用 @Before 方法。但是,来自 UI 测试步骤定义的 @Before 仍然会为 API 功能执行。这是我如何分离文件的示例(之前,我将它们放在完全相同的包中,即使图像显示在不同的包中):https://screencast.com/t/ht5Jz4cLC

    • 我尝试为 .api 和 .ui 等测试类型创建新包。这在我运行 IntelliJ 时有效,但在我执行“mvn test”时无效。似乎没有找到或执行任何测试。这是此设置的外观:https://screencast.com/t/uSlB4sYTFm

    • 我尝试在我的一种测试方法中设置一个静态属性,该属性将决定我是否有 API 测试,然后根据此更新 setUp() 中的实现。这当然行不通,因为 setUp() 在知道它是 UI 测试还是 API 测试的实际测试之前执行。

有没有一种方法可以自动更改 setUp 的行为,以便它根据测试类型 (API/UI) 执行/不执行适当的逻辑?

最佳答案

您可以使用标记的钩子(Hook)来做到这一点: “可以根据场景的标签有条件地选择钩子(Hook)执行。要仅针对某些场景运行特定的钩子(Hook),您可以将钩子(Hook)与标签表达式相关联。”来自 docs .

关于java - 如何使用 Maven 和 Cucumber 为 JUnit @Before 钩子(Hook)定义不同的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55111283/

相关文章:

java - JAVA 中的元素顺序(导入 javax.xml.*)

java - 如何在 Ivy 中强制使用 HTTPS?

ruby-on-rails - 60秒内无法获得稳定的firefox连接(127.0.0.1 :7055)

Yaml 中的 Ruby 正则表达式

ruby-on-rails - 如何用 cucumber 测试sidekiq

Java:写出所有包含K个1的N位序列

java - 使用主要监听器和构建数组来播放视频 (VLCJ) 的程序

java - Tesseract - 找不到指定的模块

maven - 运行 atlas-cli pi 命令时出现 "MojoExecutionException: Unable to execute mojo"

java - 使用 wget 和 Nexus Rest API 进行奇怪的文件命名