4

我们现在正在使用Selenium 2 (Webdriver) 和TestNG编写一个新的测试套件。我们的测试使用页面对象模式,我们对目前的情况非常满意。但是,我们在测试中遇到了设计问题,我们似乎无法找到一个好的解决方案。让我给你举个例子。这是我们的 LoginTestCase:

public class LoginTestCase extends MyTestCase {
    @BeforeTest
    public void login() {
        HomePage homepage = PageFactory.initElements(getDriver(), HomePage.class);
        LoginPage loginPage = homepage.login();
        DashboardPage dashboardPage = loginPage.loginUser("username", "password");
    }   
}

我们想扩展我们的测试,要求用户从这个测试中登录。理想情况下,我们可以这样写:

public class DashboardTestCase extends LoginTestCase {
    @Test
    public void testDashboard(DashboardPage dashboardPage) { 
        ...
    }
}

此时,用户位于 ,DashboardPage唯一需要的是在LoginTestCase.

我知道显而易见的解决方案是将该对象存储在一个变量中(在 中LoginTestCase),然后子测试用例将可以访问该变量。然而,这看起来非常难看,并且可能导致该变量的滥用。

是否有更好的解决方案或解决此设计问题的某种模式?

4

3 回答 3

3

我们使用依赖注入和 Guice 和 Guice-berry 来解决这个问题。页面对象被注入到测试方法中,WebDriver 被注入到页面对象中。

作为权衡,我们没有在页面对象之间使用所有这些漂亮的小链接。

但是当涉及到并行测试执行时,静态和单例是很痛苦的,所以应该避免它们。

于 2011-12-22T22:09:55.817 回答
1

我还没有找到更好的解决方案。我在一个静态类中有一个单一的 WebDriver,我的所有测试用例都可以从中访问 WebDriver。由于登录/会话,我的测试类都需要在同一个 WebDriver 上运行。

于 2011-12-05T10:25:02.020 回答
0

我认为您应该将页面对象的引用存储在 LoginTestCase 类的私有变量中,并提供一个受保护的 getter,以便子测试可以访问页面对象。这有助于实现两件事

  1. 将变量封装在你的 LoginTestCase 中,这样没有人可以把它搞砸..
  2. 提供受保护的 getter 确保只有子测试用例可以访问它,这就是您想要的。所以这应该不是问题。

这就是您的代码在更改后的样子。希望这是有道理的:

public class LoginTestCase extends MyTestCase {

    private dashboardPage;

    @BeforeTest
    public void login() {
        HomePage homepage = PageFactory.initElements(getDriver(), HomePage.class);
        LoginPage loginPage = homepage.login();
        dashboardPage = loginPage.loginUser("username", "password");
    }

    protected void getDashBoardPage() {
        return dashboardPage;  
    }

}

public class DashboardTestCase extends LoginTestCase {
    @Test
    public void testDashboard() { 
            DashboardPage dashboardPage = getDashBoardPage();
        ...
    }
}
于 2013-04-02T14:34:42.880 回答