如何使用PowerMock在Selenium框架中对页面对象进行单元测试

Sel*_*ena 5 java selenium unit-testing powermock selenium-webdriver

我正在开发一个基于Selenium 2并基于Page Object设计模式构建的自动化框架.我想开始考虑为我的代码编写测试套件.由于各种原因,其中一些与效率有关,而其他一些与我缺乏所有权和对该框架应该测试的Web应用程序测试环境的控制有关,我想避免必须启动浏览器并使用SUT来验证我的框架代码.所以,我认为Mock对象将是不错的选择.

问题是我无法真正地围绕模拟对象的想法,我真的无法在互联网上找到一个体面的具体例子,说明这将如何实际工作.我确实找到了一个看起来很有希望的链接,但这些例子真的太抽象了,实际上对我没用.

http://www.methodsandtools.com/archive/testingcodetdd.php

所以,我想我会发布我的简单的LoginPage页面对象,并要求使用PowerMock为这个页面对象提供一个或两个单元测试的简单示例.这是我的LoginPage对象的源代码:

public final class LoginPage extends Page<LoginPage> {

    @FindBy(how = How.ID, using = "username")
    private WebElement usernameBox;

    @FindBy(how = How.ID, using = "password")
    private WebElement passwordBox;

    public LoginPage(final WebDriver driver) {
        this(driver, driver.getCurrentUrl(), DEFAULT_TIMEOUT_IN_SECONDS);
    }

    public LoginPage(final WebDriver driver, final String url) {
        super(driver, url, DEFAULT_TIMEOUT_IN_SECONDS);
    }

    public LoginPage(final WebDriver driver, final String url, final int   
        timeoutInSeconds) {
        super(driver, url, timeoutInSeconds);
    }

    public final void enterUsername(final String username) {
        usernameBox.clear();
        usernameBox.sendKeys(username);
    }

    public final void enterPassword(final String password) {
        passwordBox.clear();
        passwordBox.sendKeys(password);
    }

    public final void clickLoginButton() {
        loginButton.click();
    }

    public final HomePage loginWithGoodCredentials(final User user) {
        return login(user, HomePage.class);
}

    public final LoginPage loginWithBadCredentials(final User user) {
        return login(user, LoginPage.class);
    }

    private <T extends Page<T>> T login(final User user, final Class<T> 
        expectedPage) {

        user.getUsername(), user.getPassword(), user.getType(), expectedPage);
        enterUsername(user.getUsername());
        enterPassword(user.getPassword());
        loginButton.click();

        return Page.constructPage(getDriver(), getTimeoutInSeconds(), 
            expectedPage);
    }

}
Run Code Online (Sandbox Code Playgroud)

据我所知,根据我上面发布的链接,模拟WebDriver和WebElement很简单,因为它们是接口.但是我引用的文档并没有让Mock对象和Mocking框架的新手很清楚,我用它来为我的页面对象编写单元测试.我们以公共登录方法为例.那些单元测试看起来是什么样的?我只需要验证登录时返回预期类型的​​页面对象.或者,例如,将文本输入用户名和密码框的方法......我可能希望有一个测试,用于验证在输入用户名和密码之前是否删除了任何现有文本.由于我没有加载真实应用程序登录页面的真实浏览器,我不确定PowerMock如何实例化和初始化我的所有web元素,以便对页面对象的公开公开服务进行测试.

Roc*_*ace -1

Selenium 测试不适合放置 Mock 对象。当对具有依赖关系的类进行单元测试时,使用模拟对象。您可以模拟依赖项,以便可以专注于测试单个类。

Selenium 用于基于浏览器的网页/应用程序测试。从本质上来说,网页表明正在运行某种服务器和正在运行的浏览器(在 Selenium 中是自动化的)。根据定义,这是集成测试,因为您正在测试最终的“集成”产品。如果存在问题,可能是在 ClassA 中,也可能是在 Web 服务器配置中。集成测试是找出问题所在的地方(这通常是为了减少 QA 团队进行回归测试的负担,因为单元测试测试类的功能,而集成测试则测试整个系统的功能(或者可能是较小的集成部件)。

话虽如此,听起来你把两者混为一谈了。从您发布的代码来看,我想说您正在进行集成测试,您现在应该忘记 Mock 对象。

  • 这不是“测试的测试”。这是对我在自动化框架中开发的类的测试。该对象支持测试,但它本身不是测试。 (9认同)
  • 我试图将页面对象本身与它们所代表的网页隔离开来进行测试。我在问题中发布的链接有一个页面对象单元测试的基本示例,该示例使用不同的框架 Mockito,而不是我发布问题时想要使用的框架。我决定使用 JMockit 而不是 Powermock,因为它更简单并且有更好的文档。我最终会删除这个问题或编辑它来询问 JMockit 并在我理解 JMockit 后发布我自己的答案。我不是第一个询问如何对页面对象进行单元测试的人。 (6认同)
  • 我支持赛琳娜最后的评论。如果能得到这个问题更好的答案就太好了。 (3认同)