如何使用 Maven 和 Cucumber 为 JUnit @Before 钩子定义不同的行为

How to define different behavior for JUnit @Before hook with Maven and Cucumber

我的挑战是我有两种不同类型的测试,运行 将 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 挂钩似乎适用于每个测试方法,即使这些方法在不同的 类 中也是如此。结果,无论我尝试什么,总是会创建浏览器资源,即使对于不需要浏览器的 API 测试也是如此。

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

有没有办法自动更改 setUp 的行为,使其 executes/doesn 不根据测试类型 (API/UI) 执行适当的逻辑?

您可以使用标记的挂钩来执行此操作: "Hooks can be conditionally selected for execution based on the tags of the scenario. To run a particular hook only for certain scenarios, you can associate a Hook with a tag expression." 来自 docs.

Feature File :- Hainvg 2 Scenarios, one for UI and other one for API

@UI
Scenario: This is First UI Scenario running on chrome browser
 Given this is the first step
 When this is the second step
 Then this is the third step

@Non-UI 
Scenario: This is First Non-UI Scenario running on chrome browser
 Given this is the first step
 When this is the second step
 Then this is the third step

 ------------------------------------------ Hook Implementation ------------------------------------------
@Before("@UI")
    public void beforeUISetup(){
       Do here :- In several features, related to the UI, I need to perform some actions before every single scenario such as spinning up VMs
    } 

@Before("@Non-UI")
    public void beforeNon-UIScenario(){
     Do here :- in non-UI tests, such as API tests, I don't need those browsers to be spun up
    } 

万一你需要先运行非UI @Before 方法然后我们也可以设置这些@Before 的顺序。