我最近加入了使用Cucumber和Selenium的自动化测试Java项目。它用于测试web应用程序。项目结构分为三个层次:
每个glue文件都有带有@Before标记和@additional标记的方法,以便在每个测试场景之前在相应的特性文件中执行该方法。适当的特性文件还使用@additional标记来知道应该调用哪个@Before方法。在每个带有@Before标记的方法中都有一串行,它们初始化一些Page文件对象,例如:
黄瓜档案:
@DesignPage
Scenario: some example scenario
Given HI im cucumber step method胶水文件:
@Before @DesignPage
public someBeforeMethod(){
...
designPage = new DesignPage();
managmentPage = new ManagmentPage();
...另外,glue文件有黄瓜步骤的方法定义,这些方法从页面文件中调用一些方法,例如:
@Given("HI im cucumber step method")
public void HiImCucumberMethod(){
designPage.executeSomeDesignPageMethod();
} 到现在为止一切都很好。
现在让我们说我有另一个(@MainPage)特性文件,但是我想从(DesignPage)特性执行完全相同的方法:
@MainPage
Scenario: some example scenario2
Given HI im cucumber step method黄瓜从这里看到,HI im cucumber step method已经在DesignPage胶文件中声明了,所以我想重用这个方法。不幸的是,我将提高NullPointerException -原因是明确的。该方法中使用的designPage对象从未初始化过,因为我从未从DesignPage胶文件中执行@Before方法。原因是,在这种情况下,我只执行来自不同胶水文件的@Before方法-- MainPage胶水文件。
这个架构让我有点恼火,因为唯一的解决方案是将HI im cucumber step method方法从DesignPage胶水文件复制到MainPage胶水文件,在MainPage @Before类中初始化设计页面对象,另外我还要重命名HI im cucumber step method,因为Cucumber现在看到了两个引用相同的方法,它不知道应该使用哪种方法。
我在这方面花了一些时间,我不知道如何改变体系结构,以便能够从另一个特性中重用一个功能方法。任何建议都将受到欢迎。
发布于 2019-11-20 06:46:53
我认为:Given HI im cucumber step method的当前步骤定义只初始化页面对象的实例,在每个测试场景之前执行该步骤是必需的。如果这是真的,那么也许您应该考虑将其移到Before钩子中。根据文档,它实际上是为了在场景之前进行一些技术设置而设计的。
在预挂钩中发生的任何事情对于只阅读这些特性的人来说都是不可见的。您应该考虑使用背景作为一个更明确的选择,特别是如果设置应该是可读的非技术人员。只对低级逻辑使用预挂钩,例如启动浏览器或从数据库中删除数据。
发布于 2019-11-20 07:20:53
尝试在方法定义中初始化对象,而不是在“前”方法中初始化对象。就像这样
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();
}
}https://stackoverflow.com/questions/58944562
复制相似问题