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

标签 java unit-testing selenium selenium-webdriver powermock

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

问题是我无法真正理解模拟对象的想法,而且我真的无法在 Internet 上找到一个像样的具体示例来说明它的实际工作原理。我确实找到了一个看起来很有希望的链接,但这些示例真的太抽象了,对我来说实际上没有用。

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);
    }

}

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

最佳答案

也许 http://popperfw.org对你来说很有趣。与 selenium 的默认实现相比,它是页面对象模式的灵活得多的实现,它直接支持“单元”测试您创建的 PageObjects => 它测试您的 PageObjects 是否与您的测试页面匹配

http://popperfw.org/unitTest.html

关于java - 如何使用 PowerMock 在 Selenium 框架中对页面对象进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16693356/

相关文章:

java - Flink CEP 不在事件时间工作,但在处理时间工作

c++ - 从命令行运行 native VS2012/C++ 64 位单元测试

unit-testing - 单元测试如何使参数验证变得多余?

spring - TestNG + Spring + Power mock 单元测试

symfony - 优化行为测试套件

java - SLF4J Logger 有时会清除控制台输出(不需要)

java - 安卓穿戴: API to fetch medical parameters from app?

java - 无法使用 selenium webdriver 滚动滚动条?

java - 从 Java 8 中基于多个属性的对象列表中删除重复项

java - org.openqa.selenium.InvalidElementStateException :Cannot perform native interaction: Could not load native events component