我正在学习使用 Selenium、Cucumber 和 Java 进行自动化测试,并且我已经实现了页面对象模型设计模式。除此之外,我还实现了 LoadableComponents 模式,我发现它非常有用。
我遇到的问题是,当您有一个嵌套多个级别的组件时(即,您必须通过多个页面/其他组件才能到达该组件),您需要为每个级别创建一个对象这些页面来设置我的测试类的构造函数中的所有内容。
来自 selenium 文档的以下 Web 应用程序结构示例:
+ ProjectPage
+---+ SecuredPage
+---+ EditIssue
这是上述应用程序的测试课的前半部分:
public class FooTest {
private EditIssue editIssue;
@Before
public void prepareComponents() {
WebDriver driver = new FirefoxDriver();
ProjectPage project = new ProjectPage(driver, "selenium");
SecuredPage securedPage = new SecuredPage(driver, project, "example", "top secret");
editIssue = new EditIssue(driver, securedPage);
}
当组件嵌套多个级别时,这可能意味着需要创建多个页面对象,这似乎是一个相当不优雅的解决方案。有更好的方法吗?
我研究了依赖注入框架。 SpringBoot 是我有基础知识的东西,
@Autowired
功能似乎很适合这个目的,但是为了像这样的简单目的实现像 SpringBoot 这样的扩展框架似乎相当于用大刀切菜。
我还研究了 Guiceberry 和 PicoContainer。我不明白 Guiceberry 是如何工作的,PicoContainer 仍然需要你在构造函数中创建对象?我想我无法理解。
我在工作中有一个框架,我们每天运行超过 2000 个测试。我设置的方式是使用
@Before
来设置浏览器,仅此而已。测试特定的任何其他内容都在测试本身中。我想如果您的每一个测试都会创建一个问题,并且您从不打算添加问题测试之外的测试,那么您当前的方法更有意义。
就您的页面对象设置而言,我会做一些不同的事情。每个页面对象应该包含表示可以在该页面/LoadableComponent 上执行的操作的方法。我看不到您的网站,但根据您的描述,我会在 ProjectPage 上创建一个名为
editIssue()
的方法。在该方法中,我将创建必要的页面对象来完成该任务。这将清理测试本身中所有子页面对象的创建。
看起来更像
FooTest.java
public class FooTest {
@Before
public void prepareComponents() {
WebDriver driver = new FirefoxDriver();
}
public void fooTest() {
ProjectPage projectPage = new ProjectPage(...);
EditIssue editIssue = projectPage.editIssue(...);
editIssue.doSomething();
}
}
ProjectPage.java
public class ProjectPage {
public EditIssue editIssue(...) {
SecuredPage securedPage = new SecuredPage(...);
return new EditIssue(...);
}
}
编辑问题.java
public class EditIssue {
public void doSomething(){
// do something
}
}