我的挑战是我有两种不同类型的测试,它们使用 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/