Рубрики
Без рубрики

Усиление тестов веб-интерфейса с помощью фреймворка webtau (на основе Selenium)

Одной из самых больших проблем с тестами веб-интерфейса является их хрупкость. Перемещение элемента страницы вокруг или повторно… С тегами selenium, testing, groovy, java.

Одной из самых больших проблем с тестами веб-интерфейса является их хрупкость. Перемещение элемента страницы или замена поля ввода выпадающим списком может вызвать волновой эффект, который нарушает десятки ваших тестов.

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

Я буду использовать web tau framework , в котором есть примитивы, предназначенные для помощи в тестировании хрупкости

Давайте протестируем функцию поиска в воображаемом приложении.

scenario('search by specific query') {
    browser.open('/search')

    $('#search-box').setValue('search this')
    $('#search-box').sendKeys("\n")

    $('#results .result').count.shouldBe > 1
}

Тест:

  • открыть страницу поиска
  • задайте значение для поля ввода, которое можно найти по идентификатору поля поиска
  • имитируйте клавишу ввода и проверьте, есть ли какие-то результаты

Я утверждаю, что должна быть только одна причина для изменения этого теста, и это в том случае, если фактическая функциональность вашего поискового интерфейса изменится ( Принцип единой ответственности кто-нибудь? ).

Однако есть четыре нефункциональные причины, которые могут заставить наш тест измениться:

  • изменение URL-адреса страницы поиска
  • способ, которым мы инициируем поиск, меняется: клавиша ввода против мыши щелчок
  • идентификаторы/классы/атрибуты, связанные с элементами, изменяются
  • время отклика сервера замедляется

Давайте рассмотрим их один за другим.

В web tau $(css) создается экземпляр Элемента страницы , который вы используете для имитации действий пользователя и значений запроса.

Созданные экземпляры являются ленивыми и могут быть определены еще до открытия браузера.

def searchBox = $('#search-box')
def numberOfResults = searchBox.count

scenario('search by specific query') {
    browser.open('/search')

    searchBox.setValue('search this')
    searchBox.sendKeys("\n")

    numberOfResults.shouldBe > 1
}

Это шаг в правильном направлении, но у нас все еще есть открытый URL страницы и жестко закодированный Нажмите клавишу Enter .

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

def searchBox = $('#search-box')
def numberOfResults = searchBox.count

scenario('search by specific query') {
    submit('search this')
    numberOfResults.shouldBe > 1
}

def submit(query) {
    browser.open("/search")

    searchBox.setValue(query)
    searchBox.sendKeys("\n")
}

Я думаю, что внесенные нами изменения облегчают рассуждения о тестировании. Но я все еще хочу сделать последний штрих: переместить определения из тестового файла, чтобы их можно было потенциально использовать в других тестовых сценариях.

Давайте перенесем определения элементов действия и страницы в отдельный класс. Возможно, вы уже слышали о концепции Page Object раньше.

В webta объекты страницы являются простыми экземплярами класса. Именно ленивый характер Элемента страницы делает возможной такую простоту.

package pages

import static com.twosigma.webtau.WebTauDsl.*

class SearchPage {
    def searchBox = $('#search-box')
    def numberOfResults = $('#results .result').count

    def submit(query) {
        browser.open("/search")

        searchBox.setValue(query)
        searchBox.sendKeys("\n")
    }
}

Это не имеет значения, когда мы создаем экземпляр класса, так как поле поиска и numberOfResults будут запущены лениво.

Давайте создадим Страницы класс со статическими экземплярами объектов страницы, чтобы было удобно получать к ним доступ из разных сценариев.

package pages

class Pages {
    static final def search = new SearchPage()
    static final def calculation = new CalculationPage()
    static final def form = new FormPage()
}

Наш объект страницы находится на расстоянии одного импорта.

import static pages.Pages.*

scenario("search by specific query") {
    search.submit("search this")
    search.numberOfResults.shouldBe > 1
}

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

Во время локальной разработки наш сервер работает невероятно быстро, а результаты поиска выдаются менее чем за 5 мс. Недели спустя мы запустим тесты в среде контроля качества и, скорее всего, будем иметь дело с неудачным утверждением.

Давайте проведем заключительное тестовое подкрепление.

import static pages.Pages.*

scenario("search by specific query") {
    search.submit("search this")
    search.numberOfResults.waitToBe > 1
}

Мы заменили должно Быть с ждите , Чтобы Быть . В результате вместо того, чтобы сразу выполнить утверждение с ошибкой, подождите, пока будет запрашиваться numberOfResults несколько раз, пока не истечет время ожидания (зависит от конфигурации).

Я использовал Groovy для тестирования за последнее десятилетие и я думаю, что он идеально подходит для этой работы. Но если вы не являетесь поклонником Groovy , вы можете использовать Java или другие языки JVM.

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

GitHub

Введение в тестирование REST API с помощью web tau

Оригинал: “https://dev.to/mykolagolubyev/web-ui-tests-reinforcement-with-webtau-framework-selenium-based-1g3k”