如何使用 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 测试也是如此。
这是我尝试过但没有成功的方法:
我为 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 的行为,使其 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 的顺序。
我的挑战是我有两种不同类型的测试,运行 将 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 测试也是如此。
这是我尝试过但没有成功的方法:
我为 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 的行为,使其 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 的顺序。