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

时间:2019-03-11 22:21:05

标签: 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测试)中,我不需要启动那些浏览器。因此,对于@Before方法,我真的需要一个不同的行为,称为 setUp

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

这是我尝试没有成功的事情:

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

    • 我尝试为.api和.ui等测试类型创建新的程序包。当我通过IntelliJ运行时,此方法有效,但当执行“ MVN测试”时,该方法不起作用。似乎没有找到或执行任何测试。此设置的外观如下:https://screencast.com/t/uSlB4sYTFm

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

是否有一种方法可以自动更改setUp的行为,以使其执行/不执行基于测试类型(API / UI)的适当逻辑?

2 个答案:

答案 0 :(得分:2)

您可以使用标记的挂钩执行此操作: “可以根据方案的标签有条件地选择要执行的挂钩。要仅针对某些方案运行特定的挂钩,可以将挂钩与标签表达式关联。”来自docs

答案 1 :(得分:2)

=UNIQUE(FILTER({A1:A;B1:B;C1:C},{A1:A;B1:B;C1:C}<>""))

以防万一,您需要先运行Non-UI @Before方法,然后我们才能设置这些@Before的顺序。