我正在开发一个基于 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 框架非常清楚,我用它来为我的页面对象编写一个单元测试。让我们以公共登录方法为例。那些的单元测试到底是什么样的?我只需要验证登录是否返回预期类型的页面对象。或者例如,在用户名和密码框中输入文本的方法......我可能想要一个测试来验证在输入用户名和密码之前是否已删除任何现有文本。因为我不会有一个真正的浏览器加载真正的应用程序登录页面,所以我'