Selenium 在cucumber项目中使用另一类方法的体系结构问题
我最近加入了使用Cucumber和Selenium的自动化测试Java项目。 它用于测试web应用程序。项目结构分为3层:Selenium 在cucumber项目中使用另一类方法的体系结构问题,selenium,cucumber,Selenium,Cucumber,我最近加入了使用Cucumber和Selenium的自动化测试Java项目。 它用于测试web应用程序。项目结构分为3层: 功能文件—包含黄瓜测试场景和步骤 粘合文件-绑定步骤和调用Java方法 页面文件-包含引用网页元素和访问这些元素的方法的字段 每个粘合文件都有一个方法,该方法带有@Before标记和@附加的标记,以使该方法在相应功能文件中的每个测试场景之前执行。相应的功能文件还使用@附加的标记来知道应该调用哪个@方法之前。在每个带有@Before标记的方法中,都有一组行,用于初始化某些
- 功能文件—包含黄瓜测试场景和步骤
- 粘合文件-绑定步骤和调用Java方法
- 页面文件-包含引用网页元素和访问这些元素的方法的字段
@Before
标记和@附加的
标记,以使该方法在相应功能文件中的每个测试场景之前执行。相应的功能文件还使用@附加的
标记来知道应该调用哪个@方法之前。在每个带有@Before
标记的方法中,都有一组行,用于初始化某些页面文件对象,例如:
黄瓜档案:
@DesignPage
Scenario: some example scenario
Given HI im cucumber step method
粘合文件:
@Before @DesignPage
public someBeforeMethod(){
...
designPage = new DesignPage();
managmentPage = new ManagmentPage();
...
lateron,glue files具有cucumber步骤的方法定义,它从页面文件调用一些方法,例如:
@Given("HI im cucumber step method")
public void HiImCucumberMethod(){
designPage.executeSomeDesignPageMethod();
}
到目前为止,一切都很顺利
现在假设我有另一个(@MainPage)功能文件,但我想从(DesignPage)功能执行完全相同的方法:
Cucumber从这里看到,HI im cucucumber step method
已在DesignPage
glue文件中声明,因此我想重用此方法。不幸的是,我将收到NullPointerException,原因很清楚<此方法中使用的code>designPage
对象从未初始化,因为我从未从designPage
glue文件中执行@之前的方法。原因是在这个场景中,我只从不同的粘合文件执行了@Before
方法-MainPage
glue文件
这种架构让我有点恼火,因为唯一的解决方案是将pasteHI-im cucumber step method
方法从DesignPage glue文件复制到MainPage glue文件,在MainPage
@类之前初始化design page对象,然后我还必须重命名HI-im cucumber step method
,因为Cucumber现在看到了两种引用相同的方法,它不知道应该使用哪一种
我花了一些时间在这上面,我不知道如何改变体系结构,以便能够从一个特性重用另一个特性。任何建议都将受到欢迎。我的看法是:给定的HI im CURCURE step方法的当前步骤定义只初始化页面对象的实例,并且需要在每个测试场景之前执行该步骤。如果是真的,那么也许你应该考虑在 HOK之前把它移到<代码>。根据文档,它实际上是设计用来在场景出现之前进行一些技术设置的
对于只阅读特征的人来说,Before钩子中发生的任何事情都是看不见的。您应该考虑使用背景作为更明确的替代方案,特别是如果安装程序应该由非技术人员阅读。对于低级逻辑,例如启动浏览器或从数据库中删除数据,只能使用Before钩子
了解更多信息:尝试在方法定义内而不是在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();
}
}
不幸的是,它不起作用。Nullpointerexception仍在生成中。因此,您有两个页面对象文件DesignPage和MainPage,以及一个带有步骤定义的粘合文件和两个不同的功能文件design和Main?您是否可以尝试初始化步骤定义中的对象,就像我在answer中编辑的那样,或者尝试将其设置为静态。如果我理解正确,您建议在@Before方法中初始化页面对象。如果您在metod之前查看我的示例,您将看到对象实际上是在那里初始化的。Step方法只使用已经初始化的对象,这就是为什么我有这个nullpointerexception问题。不,我建议在钩子中初始化页面对象,而不是像您这样的步骤。请看一看我链接的文档,如果还不清楚,我会详细说明。你是如何做到的:我只执行了来自不同粘合文件-主页粘合文件的@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();
}
}