我使用Selenium Webdriver a lot,并且有很多"实用程序"我写的方法是为了让我更容易使用。我将这些类放在WebDriverUtil
类中,现在该文件超过1,200行。 WebDriverUtil
中的每个方法都试图将我与使用WebDriver
分开,因为我使用了很多不会DRY继续写作的东西。
例如,这是我将放入WebDriverUtil
的方法。
public void waitUntilVisible(final WebElement webElement) {
new WebDriverWait(webDriver, 10).until(new Predicate<WebDriver>() {
@Override
public boolean apply(WebDriver webDriver) {
return webElement.isDisplayed();
}
});
}
如果我有1,200行代码充满了这样的方法,我有God object吗?如果是这样,我该怎么办呢?
我应该将我的行为分成这样的装饰者类吗?
public class WebElementDecorator implements WebElement {
private WebElement webElement;
private final WebDriver webDriver;
public WebElementDecorator(WebElement webElement, WebDriver webDriver) {
this.webElement = webElement;
this.webDriver = webDriver;
}
public void waitUntilVisible() {
new WebDriverWait(webDriver, 10).until(new Predicate<WebDriver>() {
@Override
public boolean apply(WebDriver webDriver) {
return webElement.isDisplayed();
}
});
}
public void click() {
webElement.click();
}
//... other WebElement methods
}
答案 0 :(得分:1)
如果我有1,200行代码充满了这样的方法,我有一个神对象吗?
单独的代码行数并不足以说明一个类是否与神一样。由于编码风格错误,过度工程化,过度专业化方法的不同变体,冗长的语言,内联评论等,一个类可能会被代码膨胀。
神级是一个充满责任的神。以下是两个试金石测试,以确定您的util类是否已演变为神类:
更改测试时对util类的影响。如果对测试子集的更改导致您经常更改和重新编译您的util类,那么这可能表明您的util类正在为太多主服务器提供服务。理想的情况是,对测试子集的更改只会影响与测试直接相关的那些util方法(如果需要)。
更改util类时对测试类的影响。如果更改util类的一部分导致许多不相关的测试中出现意外故障,那么您的util类可能会在测试中传播其触角。
如果是这样,我该如何解决?我应该将我的行为分成这样的装饰者类吗?
最好以小的渐进步骤开始重构。使用您的代码示例,我将首先将所有Wait..Until..Predicate
代码提取到一个名为WaitUntilEvent()
的单独类中,或使用isVisible()
,isEnabled()
,{{1示例用法如下所示:
isSelected()
如果我需要在WaitUntilEvent waitUntil = new WaitUntilEvent(webElement, webDriver);
waitUntil.isVisible();
webElement.click();
// etc..
附近更改我的测试要求(例如超时间隔),我知道只有一个类可以编辑。然后可以将其进一步重构为Wait..Until..Predicate
,until(PredicateIsTrue).then(PerformAction)
等。我更喜欢这种方法,而不是一个包罗万象的神似until(FunctionIsTrue).then(PerformAction)
,它可能最终会有许多装饰方法捕获许多不同的的行为。