【发布时间】:2019-03-11 22:21:04
【问题描述】:
我的挑战是我有两种不同类型的测试,它们使用 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
}
但是,在 API 测试等非 UI 测试中,我不需要启动这些浏览器。因此,对于名为 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 的行为,以便它根据测试类型(API/UI)执行/不执行适当的逻辑?
【问题讨论】:
-
我建议使用qaf,而不是由框架负责驱动程序管理。您可以使用内置的web-service automation support 进行 API/UI 编排。如果您有现有项目,您可以轻松migrate 到 qaf。
-
你可以尝试使用标签进行 UI 测试,并在 Before 挂钩中使用相同的标签。使用标签选项具有相同值的运行器运行它们。对于 API 测试,您可以使用“not @ui”作为跑步者的标记值。
标签: java maven cucumber cucumber-jvm