Что такое E2E-тестирование?

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

  • В модульном или интеграционном тесте среда тестирования играет роль программного обеспечения КОД, который ЗАПУСКАЕТ тестируемый код. Платформа тестирования вызывает функции в тестируемом коде и ожидает ответа от кода. Платформа тестирования хорошо осведомлена о внутренней части вашего кода, например о вашем языке разработки.
  • В тесте E2E среда тестирования играет роль ПОЛЬЗОВАТЕЛЯ, который ВЗАИМОДЕЙСТВУЕТ с приложением, как это сделал бы пользователь: нажмите на экран, введите текст и ожидайте чтобы увидеть изменения экрана в ответ.

Как мы проводим E2E-тестирование системы?

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

Был ли интерфейс разработан на React, Angular или Vue? какая разница. Бэкэнд основан на Nodejs, Java или PHP? Пока он работает, все в порядке. Все, что требуется, - это волшебная система, которая найдет это поле ввода и кнопку и будет знать, как с ними взаимодействовать.

Познакомьтесь с селеном

Здесь на сцену выходит Selenium. Selenium (на самом деле: Selenium WebDriver ) - это инструмент для автоматизации тестирования веб-приложений и, в частности, для проверки того, что они работают должным образом.

Первоначально Selenium появился в 2004 году. Его первоначальная версия называлась Selenium RC (Remote Control) или Selenium 1.0. Он работал, внедряя javascript в браузер и выполняя его функции.

Позже Selenium был преобразован в Selenium Webdriver, который использует API-интерфейсы браузера для выполнения необходимых команд. Вот архитектура Selenium Webdriver:

Как это работает?

  • Привязки языка Selenium (на нашем любимом языке) отправляют JSON (HTTP) на сервер Selenium.
  • Сервер получает запрос и переводит его в специальные API браузера.
  • Сервер отправляет запрос браузеру.
  • Браузер выполняет запросы и отправляет ответ обратно на сервер Selenium.
  • Сервер Selenium возвращает ответ на HTTP-запрос.

Давайте сделаем это немного более реальным:

COMMAND POST   "/session"
DATA  {"desiredCapabilities":{"javascriptEnabled":true,"locationContextEnabled":true...}
INFO SET SESSION ID 67379a3fab9310256090bd4fbe8839df
RESULT  {"acceptInsecureCerts":false...}

Привязки к языку: создайте мне новый сеанс со следующими характеристиками: включить js, включить местоположение и т. Д.

Сервер Selenium: я вас слышу. Вот идентификатор сеанса, который я создал для вас!

COMMAND POST   "/session/67379a3fab9310256090bd4fbe8839df/url"
DATA  {"url":"https://somewere.example.com/"}

LB: Отлично. Можете ли вы теперь перейти по тому URL-адресу, который я вам отправляю?

СС: ага! (нет тела результата, просто возвращается код состояния).

COMMAND POST   "/session/67379a3fab9310256090bd4fbe8839df/elements"DATA  {"using":"css selector","value":"#welcome"}RESULT  [{"ELEMENT":"0.7584651621036613-3"}]

LB: Можете ли вы найти мне элемент на странице с помощью селектора css #welcome

СШ: Нашел - вот его ID. Продолжайте и используйте его, если хотите что-нибудь сделать с этим элементом.

COMMAND POST   "/session/67379a3fab9310256090bd4fbe8839df/element/0.7584651621036613-3/click" 
DATA  {}

LB: Щелкните по нему!

СС: то же самое!

И так далее и так далее ...

Что это за API?

API-интерфейсы, которые теперь являются частью спецификации, регулируемой W3C (веб-комитетом). Они называются API Webdriver и определяются здесь. Эти API еще не являются официальным стандартом, но в какой-то момент это может произойти. Еще одна полезная ссылка указывает на статус реализации API в основном браузере. Это отличный источник для проверки, когда ваши тесты не работают должным образом.

Но что такое привязки языка Selenium?

Поскольку API-интерфейсы являются стандартными, мы можем использовать любой язык для их запуска. Так что если вы хотите писать свои тесты на Java - вперед. С ++ или С #? Конечно. Привязка языка запускает ваши тесты и переводит их в запросы JSON. Первоначально Selenium разрабатывался на Java, но позже языковые привязки были добавлены и на других языках. Вы можете увидеть различные привязки к официальным языкам в официальном репозитории Selenium.

Селен без селена

Итак, для тестирования в браузере нам нужно настроить сервер привязки языка, который будет вызывать API-интерфейсы, и сервер Selenium, который будет получать запросы API Webdriver и отправлять запросы в правильный браузер.

Это правда, НО есть также ярлык: основные браузеры (читай: Firefox, Chrome и в последнее время Safari) могут получать вызовы HTTP API напрямую, без необходимости установки Selenium Server. Это означает, что для тестирования Chrome вы можете просто установить Chromedriver локально и отправлять запросы на порт по умолчанию 9515. Chrome будет выполнять команды и отвечать без необходимости проходить через Selenium Server.

Так что, если вы используете неофициальные языковые привязки, такие как webdriverio, и прямое подключение к браузеру, скажем, Chrome, вы запускаете «Selenium» как тесты (на самом деле - webdriver) без реального использования или установки самого Selenium.

Селеновая сетка

Еще один термин, с которым вы можете столкнуться, - это Selenium Grid. Это необходимо, если вы используете несколько браузеров или несколько операционных систем. Selenium Grid отслеживает все ваши сеансы и направляет правильный запрос сеанса в соответствующий браузер. Если вы тестируете один браузер, в этом нет необходимости - см. Selenium-less.

Нужен кто-нибудь, чтобы помочь вам в мире тестирования E2E? Прочтите всю серию. Если вы счастливы и радостны - можете аплодировать!