selenium - 在黄瓜项目中使用另一种类方法的架构问题
问题描述
我最近加入了使用 Cucumber 和 Selenium 的自动化测试 Java 项目。它用于测试 Web 应用程序。项目结构分为3层:
- 功能文件 - 包含黄瓜测试场景和步骤
- 胶水文件 - 绑定黄瓜步骤并调用 Java 方法
- 页面文件 - 其中包含引用网页元素和访问这些元素的方法的字段。
每个胶水文件都有带有@Before
标签和 @additional
标签的方法,以使该方法在相应特征文件中的每个测试场景之前执行。适当的功能文件也使用@additional
标签来知道它@Before
应该调用哪个方法。每个带有@Before
标签的方法内部都有一堆行,用于初始化一些页面文件对象,例如:
黄瓜文件:
@DesignPage
Scenario: some example scenario
Given HI im cucumber step method
胶水文件:
@Before @DesignPage
public someBeforeMethod(){
...
designPage = new DesignPage();
managmentPage = new ManagmentPage();
...
稍后,胶水文件有黄瓜步骤的方法定义,它从页面文件中调用一些方法,例如:
@Given("HI im cucumber step method")
public void HiImCucumberMethod(){
designPage.executeSomeDesignPageMethod();
}
到目前为止,一切正常。
现在假设我有另一个 (@MainPage) 功能文件,但我想从 (DesignPage) 功能执行完全相同的方法:
@MainPage
Scenario: some example scenario2
Given HI im cucumber step method
Cucumber 从这里看到,HI im cucumber step method
已经在DesignPage
胶水文件中声明了,所以我想重用这个方法。不幸的是,我会收到 NullPointerException - 原因很清楚。designPage
此方法中使用的对象从未初始化,因为我从未从胶水文件中执行@Before
方法。DesignPage
原因是因为在这种情况下,我只执行了@Before
来自不同胶水文件的方法 -MainPage
胶水文件。
这种架构让我有点恼火,因为唯一的解决方案是将 DesignPage 胶水文件中的HI im cucumber step method
方法复制粘贴到 MainPage 胶水文件,在MainPage
@Before
类中初始化设计页面对象,然后我还必须重命名HI im cucumber step method
,因为 Cucumber 现在看到两个方法相同参考,它不知道应该使用哪一个。
我花了一些时间,但我不知道如何更改架构,以便能够以一种功能重用方法从另一个功能中重用。任何建议都将受到欢迎。
解决方案
尝试在方法定义中初始化对象,而不是在 before 方法中。像这样的东西
Class GlueFile
{
DesignPage designPage;
ManagmentPage managmentPage;
@Before @DesignPage
public someBeforeMethod(){
...
}
@Given("HI im cucumber step method")
public void HiImCucumberMethod(){
designPage = new DesignPage();
managmentPage = new ManagmentPage();
designPage.executeSomeDesignPageMethod();
}
}
推荐阅读
- python - AttributeError:“元组”对象没有属性“拆分”
- powershell - Powershell:如何从CSV读取行以及列是否包含字符串集变量到该字符串所在的列的每个标题
- unit-testing - 获取ios宿主应用中单元测试类的名称
- java - 可运行的回调不重复
- ios - 单元格内的 UITableview,第二个 UITableview 只有 1 行,应该超过 1 行
- azure - Azure 服务总线消息的生存时间与计划的排队时间之间的差异?
- css - 可以调整剪辑路径(ed)图像的大小以填充父宽度
- mysql - Mysql 8 INSERT 性能下降与 bin-log
- azure - 使用 aks 的通信前端和后端
- reactjs - 一个方法从另一个组件触发一个 console.log