1. Основы Java для автоматизаторов тестирования
Основы Java для автоматизаторов тестирования
Язык программирования Java остается одним из главных стандартов в индустрии автоматизации тестирования. Выбор этого инструмента не случаен: строгая типизация, огромная экосистема библиотек и независимость от платформы делают его идеальным для создания надежных тестовых фреймворков. В связке с инструментами вроде Selenium или Selenide, Java позволяет имитировать действия реального пользователя в браузере с высокой точностью.
Главная особенность языка заключается в его архитектуре. Код компилируется не в машинный код конкретной операционной системы, а в промежуточный байт-код, который затем выполняется виртуальной машиной Java (Java Virtual Machine, или JVM).
> «Напиши один раз, запускай везде» (Write Once, Run Anywhere) — фундаментальный принцип Java, который означает, что автотесты, написанные на Windows, будут без изменений работать на серверах Linux в системах непрерывной интеграции.
Для успешного старта в автоматизации не нужно знать весь язык досконально. Достаточно освоить базовый синтаксис, принципы работы с данными, управление потоком выполнения и основы объектно-ориентированного программирования.
Данные и переменные в автотестах
Любой скрипт работает с данными: вводит текст в поля, проверяет числа, считывает состояния кнопок. Для хранения этих данных используются переменные — именованные области памяти. В Java каждая переменная должна иметь строго определенный тип.
Все типы данных делятся на две большие группы: примитивные типы и ссылочные типы.
Примитивные типы хранят само значение непосредственно в памяти. Они работают быстро и занимают мало места. В контексте тестирования чаще всего используются следующие:
| Тип данных | Описание | Пример использования в тестах |
| :--- | :--- | :--- |
| int | Целые числа | Подсчет количества товаров в корзине (например, 5) |
| double | Числа с плавающей точкой | Проверка итоговой суммы заказа (например, 1250.50) |
| boolean | Логическое значение (true или false) | Проверка видимости элемента на странице |
| char | Одиночный символ | Проверка наличия знака валюты в строке |
Ссылочные типы, в отличие от примитивных, хранят не само значение, а адрес (ссылку) на объект в памяти. Самый важный ссылочный тип для автоматизатора — это String (строка).
Текстовые данные составляют 90% всей информации, с которой работает тестировщик. Проверка заголовков, чтение сообщений об ошибках, ввод логина и пароля — все это операции со строками.
При проверке цен на сайте тестировщик часто получает текст (строку), например "99.99 долл.". Чтобы сравнить это значение с ожидаемым числом, строку необходимо очистить от лишних символов и преобразовать в тип double. Это базовая рутина автоматизатора.
Управление потоком выполнения
Тестовый сценарий редко бывает линейным. Часто скрипту нужно принимать решения в зависимости от состояния страницы или повторять одно и то же действие несколько раз.
Условные операторы
Оператор if/else позволяет направить выполнение программы по одному из путей. В автоматизации это полезно, когда поведение сайта вариативно. Например, при входе в систему может появиться всплывающее окно с рекламой, а может и не появиться.
Циклы
Циклы используются для многократного выполнения блока кода. Самый распространенный цикл — for. Он идеально подходит для ситуаций, когда мы заранее знаем, сколько раз нужно выполнить действие.
Например, на странице интернет-магазина отображается список из 10 товаров, и нам нужно проверить, что у каждого из них есть цена. Переменная-счетчик будет увеличиваться от 0 до тех пор, пока выполняется условие .
!Интерактивная визуализация работы цикла for при поиске элементов
Если количество элементов заранее неизвестно, используется цикл while. Он выполняет код до тех пор, пока истинно заданное условие. Например, скрипт может прокручивать страницу вниз, пока не появится кнопка «Загрузить еще».
Объектно-ориентированный подход (ООП)
Java — это объектно-ориентированный язык. Вся архитектура современных тестовых фреймворков строится на концепциях ООП. Главные понятия здесь — класс и объект.
Класс можно представить как чертеж или шаблон. Он описывает, какими свойствами (полями) и действиями (методами) будет обладать сущность. Объект — это конкретный экземпляр, созданный по этому чертежу.
В автоматизации тестирования веб-приложений стандартом де-факто является паттерн Page Object. Суть его в том, что каждая веб-страница описывается отдельным классом.
Представьте страницу авторизации. В коде мы создаем класс LoginPage.
Его полями будут веб-элементы:
Его методами будут действия пользователя:
enterUsername()enterPassword()clickLoginButton()Такой подход обеспечивает инкапсуляцию — скрытие внутренней реализации. Тестовый сценарий просто вызывает метод login("admin", "12345"), не зная, как именно происходит поиск элементов на странице. Если разработчики изменят дизайн страницы авторизации, тестировщику придется обновить локаторы только в одном классе LoginPage, а не в сотнях тестов.
Коллекции: работа с группами элементов
Обычные массивы в Java имеют фиксированный размер. Если вы создали массив на 5 элементов, добавить в него шестой уже не получится. В веб-тестировании количество элементов на странице часто меняется динамически (например, результаты поиска).
Для работы с динамическими наборами данных используется Collections Framework, в частности интерфейс List и его реализация ArrayList.
Коллекции позволяют добавлять, удалять и искать элементы «на лету». Когда автотест запрашивает у браузера все ссылки на странице, инструмент (например, Selenide) возвращает именно коллекцию элементов.
Имея коллекцию, автоматизатор может легко проверить, содержит ли она конкретный текст, отсортирована ли она по алфавиту или соответствует ли ее размер ожидаемому количеству результатов.
Обработка исключительных ситуаций
Автотесты работают в нестабильной среде. Сеть может «моргнуть», сервер может отвечать дольше обычного, а нужная кнопка может не успеть загрузиться. В таких случаях Java выбрасывает исключение (Exception) — сигнал о том, что что-то пошло не так.
Если исключение не обработать, тест немедленно упадет. Чтобы скрипт был стабильным, используется конструкция try/catch.
В блоке try размещается код, который потенциально может вызвать ошибку. В блоке catch описывается, что нужно сделать, если ошибка все-таки произошла.
В реальных проектах автоматизаторы редко пишут try/catch для каждого клика. Современные библиотеки вроде Selenide имеют встроенные механизмы неявных ожиданий, которые автоматически повторяют попытку найти элемент в течение заданного времени (например, 4 секунды). Однако понимание механизма исключений критически важно для чтения логов и анализа причин падения тестов.
Освоив переменные, циклы, классы и коллекции, вы получаете прочный фундамент. Этих знаний достаточно, чтобы перейти к изучению специализированных библиотек для тестирования, где код Java будет напрямую управлять поведением браузера.