我正在使用基于Page Object设计模式的Selenium 2自动化框架。现在,我想开始考虑为我的代码编写测试套件。由于各种原因,其中一些与效率有关,另一些与我对安装了该框架所测试的Web应用程序的测试环境缺乏所有权和控制有关,我希望避免启动浏览器并使用系统下测试(SUT)来验证我的框架代码。因此,我认为模拟对象是一个不错的替代方案。
问题是,我真的无法理解模拟对象的概念,而且我确实找不到一个像样的具体示例,说明这实际上如何工作。我确实找到了一个似乎很有前途的链接,但是示例实际上太抽象了,对我来说并没有用处。
我知道模拟WebDriver和WebElement很容易,因为它们是接口,根据我上面发布的链接。但是,我参考的文档并没有很清楚地向完全新手介绍如何使用这些来编写页面对象的单元测试。以公共登录方法为例,这些方法的单元测试看起来像什么?我只需要验证使用登录返回预期类型的页面对象。或者例如,将文本输入到用户名和密码框中的方法...我可能希望有一个测试来验证在输入用户名和密码之前是否擦除了任何现有的文本。由于我没有加载真实应用程序登录页面的真实浏览器,我不确定PowerMock如何实例化和初始化所有我的Web元素以对页面对象的公开服务进行测试。
问题是,我真的无法理解模拟对象的概念,而且我确实找不到一个像样的具体示例,说明这实际上如何工作。我确实找到了一个似乎很有前途的链接,但是示例实际上太抽象了,对我来说并没有用处。
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很容易,因为它们是接口,根据我上面发布的链接。但是,我参考的文档并没有很清楚地向完全新手介绍如何使用这些来编写页面对象的单元测试。以公共登录方法为例,这些方法的单元测试看起来像什么?我只需要验证使用登录返回预期类型的页面对象。或者例如,将文本输入到用户名和密码框中的方法...我可能希望有一个测试来验证在输入用户名和密码之前是否擦除了任何现有的文本。由于我没有加载真实应用程序登录页面的真实浏览器,我不确定PowerMock如何实例化和初始化所有我的Web元素以对页面对象的公开服务进行测试。