【问题标题】:How to unit-test Page Objects in a Selenium framework with PowerMock如何使用 PowerMock 在 Selenium 框架中对页面对象进行单元测试
【发布时间】:2013-05-17 14:22:03
【问题描述】:

我正在开发一个基于 Selenium 2 并基于页面对象设计模式的自动化框架。我正想开始考虑为我的代码编写测试套件。由于各种原因,其中一些与效率有关,而另一些与我对安装该框架应该测试的 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);
    }

}

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

【问题讨论】:

  • 您想测试代码的哪些方面?它为您对 Web 驱动程序代码进行单元测试(在库中进行了单元测试)带来了什么价值?你能发布一个实际使用这个对象的 UI/验收测试吗?听起来您只需要在实际测试中验证用户名和密码字段是否已清除。您也可以考虑将此问题迁移到sqa.stackexchange,它更注重理论质量保证。
  • 我正在考虑删除这个问题。我决定不使用 PowerMock,而是使用具有非常非常好的文档的 JMockit。另一种选择是编辑问题以询问 JMockit 并发布我自己的答案。目前,我的项目优先级发生了一些变化,单元测试被推迟了几个星期,所以我暂时不能对这个问题采取行动,因为我现在必须专注于其他事情。

标签: java unit-testing selenium selenium-webdriver powermock


【解决方案1】:

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

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

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

【讨论】:

  • 我正在尝试独立于它们所代表的网页来测试页面对象本身。我在我的问题中发布的链接有一个使用不同框架 Mockito 对页面对象进行单元测试的基本示例,而不是我在发布问题时想要使用的框架。我决定使用 JMockit 而不是 Powermock,因为它更简单并且有更好的文档。我最终将删除此问题或对其进行编辑以询问 JMockit 并在我了解 JMockit 后发布我自己的答案。我不是第一个询问如何对页面对象进行单元测试的人。
  • 天哪,测试测试?这就是我划清界限的地方,呵呵。至于你的问题,我已经非常广泛地使用了 Mockito。您可以使用 Mockito 模拟任何非最终方法/类。不幸的是,在您的页面设计中,您使用了大量的最终语句。我建议删除这些语句,以便 Mockito 可以完成它的工作(如果你没有适当的接口来实现它的模拟,它会将你的页面子类化)
  • 这不是“测试中的测试”。这是我在自动化框架中开发的一个类的测试。该对象支持测试,但它本身不是测试。
  • 我支持 Selena 的最后评论。最好能得到这个问题的更好答案。
【解决方案2】:

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

http://popperfw.org/unitTest.html

【讨论】:

  • 这个项目已经3年没有积极开发了,但是它背后的想法看起来不错。你知道替代品吗?
猜你喜欢
  • 1970-01-01
  • 2012-08-25
  • 2019-12-05
  • 1970-01-01
  • 2012-10-19
  • 1970-01-01
  • 2010-11-18
  • 2011-08-17
  • 2015-06-01
相关资源
最近更新 更多