我正在开发一个基于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);
}
}
据我所知,根据我上面发布的链接,模拟WebDriver和WebElement很容易,因为它们是接口。但是我引用的文档并没有让Mock对象和Mocking框架的新手很清楚,我用它来为我的页面对象编写单元测试。我们以公共登录方法为例。那些单元测试看起来是什么样的?我只需要验证登录时返回预期类型的页面对象。或者,例如,将文本输入用户名和密码框的方法......我可能希望有一个测试,用于验证在输入用户名和密码之前是否删除了任何现有文本。由于我没有加载真实应用程序登录页面的真实浏览器,我不确定PowerMock如何实例化和初始化我的所有web元素,以便对页面对象的公开公开服务进行测试。
答案 0 :(得分:0)
Selenium Tests不适合Mock对象。当具有依赖性的UnitTesting类时,使用Mock对象。您可以模拟依赖项,以便专注于测试单个类。
Selenium用于基于浏览器的网页/应用程序测试。从本质上讲,网页表明存在某种服务器运行和运行的浏览器(在Selenium的情况下自动化)。根据定义,这是一个集成测试,因为您正在测试最终的“集成”产品。如果出现问题,可能是在ClassA内,也可能是Web服务器配置。集成测试是找出这些东西中断的地方(这通常用于减少QA团队对回归测试的负担,因为单元测试测试类的功能和集成测试测试整个系统的功能(或者可能在较小的集成部分中。)
尽管如此,听起来你正在混淆两者。从你发布的代码中,我说你正在进行集成测试,你现在应该忘记Mock对象。
答案 1 :(得分:0)
也许http://popperfw.org对你很有意思。它是一个比selenium的默认实现更灵活的页面对象模式实现,它直接支持“单元”测试你创建的PageObjects =&gt;它测试您的PageObjects是否与您的testet页面匹配