<SomeThirdPartyClass>Util == объект Бога?

Я часто использую Selenium Webdriver, и я написал много "полезных" методов, чтобы мне было проще пользоваться. Я положил эти классы в WebDriverUtil класс, и теперь этот файл более 1200 строк. Каждый метод в WebDriverUtil пытается отделить меня от использования WebDriver потому что это то, чем я часто пользуюсь, и не будет сухим, чтобы продолжать писать.

Например, этот метод я бы положил в 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? Если так, как я мог это исправить?

Должен ли я разделить свое поведение на классы декораторов, как это?

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
}

1 ответ

Решение

Если у меня есть 1200 строк кода, заполненных такими методами, есть ли у меня объект God?

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

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

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

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

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

Лучше начинать рефакторинг небольшими, пошаговыми шагами. Используя ваш пример кода, я начну с простого извлечения всех 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 что, скорее всего, приведет к тому, что многие методы декорирования будут отражать различные варианты поведения.

Другие вопросы по тегам