2015-08-14 5 views
3

Я использую Selenium Webdriver a lot, и есть много методов «полезности», которые я написал, чтобы облегчить мне использование. Я помещаю эти классы в класс WebDriverUtil, и теперь этот файл имеет длину более 1 200 строк. Каждый метод в WebDriverUtil пытается отделить меня от использования WebDriver, потому что это то, что я использую много, чтобы не было DRY, чтобы продолжать писать.<SomeThirdPartyClass> Util == Объект God?

Например, это метод, который я бы поставил в WebDriverUtil.

public void waitUntilVisible(final WebElement webElement) { 
    new WebDriverWait(webDriver, 10).until(new Predicate<WebDriver>() { 
     @Override 
     public boolean apply(WebDriver webDriver) { 
      return webElement.isDisplayed(); 
     } 
    }); 
} 

Если у меня есть 1200 строк кода, полный методов, как это, у меня есть 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

Почему бы не сделать метод 'static'? Это зависит от любого состояния класса Util? –

+0

@ElliottFrisch Сделать статичным в утилите или в декораторе? – michaelsnowden

ответ

1

Если у меня есть 1200 строк кода, полный методов, как это, у меня есть объект Бога?

Число строк только в коде не является адекватным индикатором того, является ли класс богоподобным или нет. Класс может быть раздутым с помощью кодов из-за плохого стиля кодирования, чрезмерной инженерии, различных вариантов сверхспециализированных методов, подробного языка, встроенных комментариев и т. Д.

Класс богов - это тот, который раздувается с обязанностями. Вот два лакмусовые тесты, чтобы определить, если ваш класс Util превратился в класс бога:

  1. Эффектов на вашем классе Util при изменении ваших тестов. Если изменения в подмножестве ваших тестов заставляют вас часто менять и повторно компилировать свой класс util, это, вероятно, свидетельствует о том, что ваш класс util обслуживает слишком много мастеров. Идеальный сценарий заключается в том, что изменения в подмножестве ваших тестов будут влиять только на те методы использования (если необходимо), которые имеют непосредственное отношение к тестам.

  2. Влияние на ваш тестовый класс при изменении класса использования. Если изменение части вашего класса утилиты вызывает непредвиденные сбои среди многих несвязанных тестов, то ваш класс util мог бы распространять свои щупальца на всех ваших тестах.

Если да, то как я могу это исправить? Должен ли я отделить свое поведение от классов декоратора, как это?

Лучше всего начать рефакторинг небольшими инкрементальными шагами. Используя ваш пример кода, я начать с простого извлечения всех Wait..Until..Predicate кодов в отдельный класс с именем WaitUntilEvent() или что-то, с методами, как isVisible(), isEnabled(), isSelected() и т.д. Пример использования выглядит следующим образом:

WaitUntilEvent waitUntil = new WaitUntilEvent(webElement, webDriver); 
waitUntil.isVisible(); 
webElement.click(); 
// etc.. 

Если я когда мне нужно изменить требования к тестированию около Wait..Until..Predicate (например, интервалы таймаута), я знаю, что для редактирования есть только один класс. Затем это может быть реорганизовано далее в until(PredicateIsTrue).then(PerformAction), until(FunctionIsTrue).then(PerformAction) и т. Д. Мне нравится этот подход лучше, чем всеохватывающий богоподобный class WebElementDecorator, который, вероятно, в конечном итоге будет содержать множество методов украшения, захватывающих множество разных поведений.