Автоматизация тестирования на Java: от основ до CI/CD

Практический курс по созданию автотестов на языке Java, охватывающий UI и API тестирование. Вы научитесь работать с популярными инструментами, такими как Selenium, RestAssured и JUnit, а также строить масштабируемые фреймворки.

1. Введение в Java для QA и настройка окружения разработки

Введение в Java для QA и настройка окружения разработки

Добро пожаловать в курс «Автоматизация тестирования на Java: от основ до CI/CD». Это первая статья, с которой начнется ваше погружение в мир автоматизации. Сегодня мы не просто установим программы, а заложим фундамент, на котором будет строиться вся ваша будущая карьера автоматизатора.

Почему Java? Этот язык остается «золотым стандартом» в мире корпоративной разработки и тестирования. Огромное сообщество, мощные инструменты (такие как Selenium, RestAssured, TestNG) и строгая типизация делают его идеальным выбором для создания надежных и поддерживаемых автотестов.

Что такое Java: разбор основных понятий

Прежде чем мы начнем установку, важно разобраться в аббревиатурах, которые будут встречаться вам постоянно. Многие новички путают JDK, JRE и JVM. Давайте разложим всё по полочкам.

JVM (Java Virtual Machine)

Это «сердце» Java. Виртуальная машина — это программа, которая умеет выполнять байт-код Java на конкретном устройстве. Именно благодаря JVM работает принцип Write Once, Run Anywhere (написал один раз — запускай везде). Вы пишете код на Windows, компилируете его, и этот же код без изменений запускается на Linux или macOS, потому что под каждую ОС есть своя версия JVM, которая служит «переводчиком».

JRE (Java Runtime Environment)

Это среда выполнения. Она включает в себя JVM и набор стандартных библиотек (классов), необходимых для запуска уже готовых программ. Если вы просто пользователь, который хочет запустить Minecraft или банковское приложение, вам достаточно JRE.

JDK (Java Development Kit)

Это комплект разработчика. Он включает в себя JRE (чтобы запускать программы) и набор инструментов для разработки: компилятор (javac), архиватор (jar), генератор документации (javadoc) и другие утилиты.

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

!Схематичное изображение структуры Java: JDK включает в себя JRE, который, в свою очередь, содержит JVM.

Шаг 1: Установка Java Development Kit (JDK)

На момент написания курса существует множество версий Java. В корпоративной среде стандартами де-факто являются LTS (Long Term Support) версии — 8, 11, 17 и 21. Мы будем использовать JDK 17 или JDK 21, так как они современные, стабильные и поддерживаются большинством фреймворков для тестирования.

Выбор дистрибутива

Java теперь распространяется разными вендорами. Самые популярные варианты: * Oracle JDK: официальная версия от создателей. * Eclipse Adoptium (Temurin): популярный открытый дистрибутив. * Amazon Corretto: версия от Amazon.

Для целей обучения рекомендую использовать Eclipse Adoptium (Temurin), так как он полностью бесплатен и прост в установке.

Процесс установки

  • Перейдите на официальный сайт Adoptium.
  • Выберите версию 17 (LTS) или 21 (LTS).
  • Скачайте инсталлятор для вашей операционной системы (Windows .msi, macOS .pkg или Linux архив).
  • Запустите установку.
  • Важно для пользователей Windows: В процессе установки обязательно убедитесь, что выбрана опция Set JAVA_HOME variable (Установить переменную JAVA_HOME). Это критически важно для работы инструментов сборки и запуска тестов из командной строки.

    Проверка установки

    После установки откройте терминал (Command Prompt в Windows или Terminal в macOS/Linux) и введите команду:

    Если вы видите вывод, похожий на openjdk version "17.0.x"..., значит, Java успешно установлена.

    Шаг 2: Установка среды разработки (IDE)

    Писать код в «Блокноте» можно, но неэффективно. Нам нужна «умная» среда разработки (IDE — Integrated Development Environment), которая будет подсказывать ошибки, помогать с автодополнением и упрощать запуск тестов.

    Безусловным лидером в мире Java является IntelliJ IDEA от компании JetBrains.

    Какую версию выбрать?

    Существует две версии: * Ultimate: платная, с поддержкой веб-разработки и баз данных. * Community: бесплатная, с открытым исходным кодом.

    Для автоматизации тестирования (Selenium, API тесты) возможностей Community Edition более чем достаточно.

    Установка IntelliJ IDEA

  • Перейдите на сайт JetBrains.
  • Выберите вкладку вашей ОС.
  • Скачайте Community Edition.
  • Установите программу, используя настройки по умолчанию.
  • Шаг 3: Настройка первого проекта

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

    Создание проекта

  • Запустите IntelliJ IDEA.
  • Нажмите кнопку New Project.
  • В открывшемся окне:
  • * Name: назовите проект, например, QA_Automation_Course. * Location: выберите папку для хранения кода. * Language: выберите Java. * Build system: выберите Maven. * JDK: выберите ту версию, которую мы установили на Шаге 1 (она должна подтянуться автоматически).

    > Maven — это инструмент автоматической сборки проектов. Он помогает управлять библиотеками (зависимостями). Например, когда нам понадобится Selenium, мы не будем скачивать файлы вручную, а просто попросим Maven сделать это за нас.

    Структура проекта

    После создания проекта вы увидите структуру папок слева. Давайте разберем основные элементы:

    * src/main/java — здесь хранится основной код программы (в реальной разработке — код приложения). * src/test/java — здесь хранятся тесты. Именно в этой папке мы будем проводить 90% времени. * pom.xml — файл конфигурации Maven. «Паспорт» вашего проекта, где описаны его название, версия и используемые библиотеки.

    !Стандартная структура Maven-проекта в IntelliJ IDEA.

    Шаг 4: Пишем код «Hello QA»

    Давайте проверим, что наша среда готова к работе, написав простую консольную программу.

  • В дереве проекта кликните правой кнопкой мыши на папку src/main/java.
  • Выберите New -> Java Class.
  • Назовите класс FirstCheck.
  • В открывшемся файле введите следующий код:
  • Разбор кода

    Даже в этих нескольких строках скрыто много смысла: * public class FirstCheck: Мы объявляем класс. В Java всё является объектом или частью класса. Имя файла должно совпадать с именем класса. * public static void main(String[] args): Это точка входа в программу. Когда вы запускаете приложение, JVM ищет именно этот метод main, чтобы начать выполнение. * System.out.println(...): Команда вывода текста в консоль.

    Запуск

    Слева от строки с main вы увидите маленький зеленый треугольник. Нажмите на него и выберите Run 'FirstCheck.main()'.

    В нижней части окна откроется панель Run, где вы должны увидеть заветную фразу: Hello, QA World!

    Если вы это видите — поздравляю! Ваше окружение полностью настроено и готово к серьезным задачам.

    Решение возможных проблем

    Иногда всё идет не по плану. Вот частые проблемы новичков:

  • «Java not found» в консоли.
  • Скорее всего, не настроена переменная окружения JAVA_HOME или путь к bin не добавлен в PATH. Попробуйте переустановить JDK, внимательно следя за галочками в инсталляторе.

  • IntelliJ IDEA не видит JDK.
  • Зайдите в File -> Project Structure -> Project и в поле SDK выберите установленную версию Java. Если её там нет, нажмите Add SDK -> JDK и укажите путь к папке установки.

    Заключение

    Сегодня мы проделали важную работу: подготовили почву для автоматизации. Мы разобрались, чем JDK отличается от JRE, установили профессиональную среду разработки и запустили первый Java-код.

    В следующей статье мы перейдем к изучению синтаксиса языка Java: узнаем, что такое переменные, типы данных и как компьютер хранит информацию. Готовьтесь, будет интересно!

    2. Модульное тестирование: работа с фреймворками JUnit 5 и TestNG

    Модульное тестирование: работа с фреймворками JUnit 5 и TestNG

    Приветствую вас во второй части нашего курса «Автоматизация тестирования на Java». В прошлой статье мы успешно настроили JDK, установили IntelliJ IDEA и даже запустили нашу первую программу, которая выводила текст в консоль. Но давайте будем честны: ручной запуск метода main и визуальная проверка вывода в консоли — это не автоматизация. Это просто запуск кода.

    Чтобы автоматизация стала реальностью, нам нужны специальные инструменты, которые умеют запускать код, проверять результаты и формировать отчеты. Эти инструменты называются фреймворками для тестирования (Testing Frameworks).

    Сегодня мы разберем двух гигантов этого мира: JUnit 5 и TestNG.

    Зачем нужен тестовый фреймворк?

    Представьте, что вы написали автотест для калькулятора. Он складывает 2 и 2. Как проверить, что результат равен 4?

    Без фреймворка вам пришлось бы писать:

    А теперь представьте, что у вас 500 тестов. Читать консоль с тысячами строк текста невозможно. Тестовый фреймворк берет эту рутину на себя. Он:

  • Управляет запуском: вы можете запустить один тест, все тесты или группу тестов.
  • Проверяет результаты: использует специальные методы (утверждения/assertions), чтобы сравнивать ожидаемое и фактическое.
  • Управляет жизненным циклом: выполняет действия до теста (например, открыть браузер) и после (закрыть браузер).
  • Генерирует отчеты: показывает красивую зеленую или красную полосу прогресса.
  • JUnit 5: Современный стандарт

    JUnit — это самый популярный фреймворк в мире Java. Пятая версия (JUnit 5) — это полная переработка инструмента, сделавшая его модульным и очень гибким.

    Подключение JUnit 5

    Вспомним наш файл pom.xml из прошлого урока. Чтобы начать пользоваться JUnit, нам нужно добавить его в раздел <dependencies>. Maven сам скачает нужные библиотеки.

    Обратите внимание на <scope>test</scope>. Это говорит Maven'у, что библиотека нужна только для тестов (папка src/test/java), а в основной код программы она не попадет.

    Основные аннотации JUnit 5

    Аннотации — это специальные метки, которые начинаются с символа @ и ставятся перед методами. Они говорят компилятору и фреймворку, как обрабатывать этот код.

    Вот самые важные из них:

    * @Test: Обозначает, что метод является тестом. * @BeforeEach: Метод будет выполняться перед каждым тестом в классе. * @AfterEach: Метод будет выполняться после каждого теста. * @BeforeAll: Метод выполнится один раз перед всеми тестами (должен быть статическим). * @AfterAll: Метод выполнится один раз после всех тестов (должен быть статическим). * @DisplayName: Позволяет дать тесту понятное имя на русском языке.

    !Жизненный цикл выполнения тестов: от инициализации до завершения.

    Пишем первый тест на JUnit 5

    Создайте новый класс в папке src/test/java. Назовем его CalculatorTest.

    Assertions (Утверждения)

    Самая главная часть теста — это проверка. В JUnit 5 за это отвечает класс Assertions.

    * assertEquals(expected, actual): проверяет, что значения равны. * assertTrue(condition): проверяет, что условие истинно. * assertNotNull(object): проверяет, что объект существует (не null). * assertThrows(...): проверяет, что код выбрасывает ожидаемую ошибку.

    TestNG: Мощь для QA инженеров

    TestNG (Test Next Generation) — это фреймворк, который исторически больше любят тестировщики, чем разработчики. Он вдохновлен JUnit, но предоставляет больше возможностей «из коробки» для сложных сценариев тестирования (параметризация, зависимости между тестами, многопоточность).

    Подключение TestNG

    В pom.xml это выглядит так:

    Отличия в аннотациях

    Синтаксис очень похож, но есть нюансы в названиях:

    | Действие | JUnit 5 | TestNG | | :--- | :--- | :--- | | Сам тест | @Test | @Test | | Перед каждым | @BeforeEach | @BeforeMethod | | После каждого | @AfterEach | @AfterMethod | | Перед всем классом | @BeforeAll | @BeforeClass | | После всего класса | @AfterAll | @AfterClass |

    Пример теста на TestNG

    Главная фишка TestNG: файл testng.xml

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

    Пример простой конфигурации:

    Параметризованные тесты

    И в JUnit 5, и в TestNG есть киллер-фича для автоматизаторов — параметризация. Это возможность запустить один и тот же тест с разными наборами данных.

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

    Пример в JUnit 5:

    Этот тест запустится 5 раз, подставляя по очереди каждое число из ValueSource.

    Что выбрать: JUnit 5 или TestNG?

    Этот вопрос часто вызывает холивары (споры).

    * Выбирайте JUnit 5, если вы работаете в команде, где разработчики уже пишут Unit-тесты на нем. Это обеспечит единый стек технологий. JUnit 5 сейчас активно развивается и перенял многие фишки TestNG. * Выбирайте TestNG, если вам нужна сложная конфигурация запуска, зависимости между тестами (тест Б запускается только если прошел тест А) или мощная встроенная параллелизация.

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

    Заключение

    Сегодня мы сделали огромный шаг вперед. Мы перестали просто писать код и начали писать тесты. Мы разобрали:

  • Зачем нужны фреймворки.
  • Как управлять жизненным циклом теста (setup -> test -> teardown).
  • Как делать проверки с помощью Assertions.
  • В чем разница между JUnit 5 и TestNG.
  • В следующем уроке мы применим эти знания на практике и подключим библиотеку Selenium, чтобы наш код смог управлять настоящим браузером. Готовьтесь, магия начинается!

    3. UI-автоматизация: Selenium WebDriver, поиск элементов и паттерн Page Object

    UI-автоматизация: Selenium WebDriver, поиск элементов и паттерн Page Object

    Добро пожаловать в третью часть курса «Автоматизация тестирования на Java». В предыдущих статьях мы подготовили фундамент: настроили Java, среду разработки и научились писать модульные тесты с помощью JUnit 5. Теперь пришло время магии. Мы выходим за пределы консоли и начинаем управлять настоящим браузером.

    Сегодня мы познакомимся с Selenium WebDriver — инструментом, который является де-факто стандартом в мире UI-автоматизации. Мы разберемся, как находить элементы на веб-странице, как с ними взаимодействовать и, самое главное, как писать тесты так, чтобы их поддержка не превратилась в ад. Для этого мы изучим паттерн проектирования Page Object.

    Что такое Selenium WebDriver?

    Selenium — это не просто одна библиотека, а целый проект, включающий в себя несколько инструментов. Нас интересует Selenium WebDriver. Это библиотека, которая позволяет вашему коду на Java отправлять команды браузеру, имитируя действия реального пользователя.

    Архитектура WebDriver

    Многие новички думают, что Java-код общается с браузером напрямую. Это не так. Между ними есть посредник — Драйвер браузера (Browser Driver).

    !Архитектура взаимодействия: ваш код отправляет команды драйверу, а драйвер управляет реальным браузером.

  • Ваш код: Использует библиотеку Selenium для отправки команд (например, «кликни сюда», «открой эту страницу»).
  • Browser Driver: Это исполняемый файл (например, chromedriver.exe), который знает, как управлять конкретным браузером. Он работает как сервер, принимая ваши команды.
  • Браузер: Выполняет команды и возвращает результат драйверу, который передает его обратно в ваш код.
  • Подключение Selenium

    Чтобы начать работу, добавим зависимость в наш pom.xml. Мы будем использовать последнюю стабильную версию Selenium 4.

    > Хорошая новость: Начиная с версии Selenium 4.6.0, вам больше не нужно вручную скачивать файлы драйверов (chromedriver, geckodriver). Встроенный инструмент Selenium Manager сделает это автоматически.

    Первый запуск браузера

    Давайте напишем простейший тест, который открывает Google. Создайте класс FirstSeleniumTest в папке src/test/java.

    Запустите этот тест. Вы увидите, как на несколько секунд откроется браузер и закроется. Это и есть автоматизация!

    Поиск элементов (Локаторы)

    Чтобы кликнуть по кнопке или ввести текст, Selenium должен знать, где находится этот элемент. Для этого используются локаторы. В Java метод поиска выглядит так: driver.findElement(By.тип_локатора("значение")).

    Рассмотрим основные стратегии поиска (приоритет сверху вниз):

    1. ID (By.id)

    Самый быстрый и надежный способ. Если у элемента есть уникальный атрибут id, используйте его.

    2. CSS Selector (By.cssSelector)

    Мощный и быстрый способ поиска. Позволяет искать по классам, атрибутам и иерархии. Это выбор профессионалов для 90% случаев, когда нет ID.

    * По ID: #username * По классу: .login-btn * По атрибуту: input[name='email'] * Вложенность: div.header > a.logo

    3. XPath (By.xpath)

    Самый гибкий, но самый медленный и сложный способ. XPath позволяет искать элементы по тексту и двигаться по дереву DOM не только вниз, но и вверх. Используйте его, когда CSS Selectors не справляются (например, «найти кнопку, внутри которой написан текст 'Сохранить'»).

    Сравнение локаторов

    | Локатор | Скорость | Надежность | Читаемость | Когда использовать | | :--- | :--- | :--- | :--- | :--- | | ID | Очень высокая | Высокая | Отличная | Всегда, если есть ID | | CSS | Высокая | Средняя | Хорошая | Если нет ID | | XPath | Низкая | Низкая (хрупок к изменениям верстки) | Средняя/Плохая | Для сложного поиска по тексту или родителям |

    Взаимодействие с элементами

    После того как мы нашли элемент, мы получаем объект типа WebElement. С ним можно совершать действия:

    * element.click() — кликнуть по элементу. * element.sendKeys("текст") — ввести текст (для полей ввода). * element.getText() — получить видимый текст элемента. * element.getAttribute("href") — получить значение атрибута. * element.isDisplayed() — проверить, виден ли элемент.

    Пример теста авторизации:

    Проблема: Spaghetti Code

    Посмотрите на код выше. Он работает, но у него есть серьезные проблемы:

  • Дублирование: Если у вас 50 тестов, и в каждом нужно логиниться, вы будете копировать эти строки 50 раз.
  • Сложность поддержки: Если разработчики изменят id поля пароля с password на user_pass, вам придется править все 50 тестов.
  • Нечитаемость: В коде смешана логика теста (что мы проверяем) и детали реализации (как найти кнопку).
  • Решение этой проблемы — паттерн Page Object.

    Паттерн Page Object Model (POM)

    Page Object — это паттерн проектирования, при котором каждая веб-страница (или значимая часть страницы) описывается как отдельный Java-класс.

    * Элементы страницы становятся полями класса. * Действия на странице становятся методами класса.

    !Page Object разделяет структуру страницы и логику теста.

    Реализация Page Object

    Давайте перепишем наш тест с использованием POM. Сначала создадим класс, описывающий страницу логина.

    Обновленный тест

    Теперь наш тест станет чистым и понятным:

    Преимущества POM

  • Переиспользование кода: Метод login можно вызывать в любом тесте.
  • Легкая поддержка: Если изменится локатор кнопки входа, мы поменяем его только в одном месте — в классе LoginPage.
  • Читаемость: Тест читается как сценарий на английском языке.
  • Заключение

    Сегодня мы совершили огромный прорыв. Мы научились: * Запускать браузер с помощью Selenium WebDriver. * Находить элементы, используя ID, CSS и XPath. * Применять паттерн Page Object, чтобы наш код был профессиональным и поддерживаемым.

    В следующей статье мы углубимся в тему ожиданий (Waits). Вы узнаете, почему Thread.sleep() — это зло, и как научить Selenium «умно» ждать появления элементов на странице. До встречи!

    4. Автоматизация тестирования API с использованием библиотеки RestAssured

    Автоматизация тестирования API с использованием библиотеки RestAssured

    Приветствую вас в четвертой части нашего курса! Мы уже прошли большой путь: настроили Java, научились писать Unit-тесты и даже заставили браузер выполнять наши команды с помощью Selenium.

    Сегодня мы спустимся «под капот» веб-приложений. Если UI-тесты (Selenium) проверяют то, что видит пользователь (кнопки, формы, картинки), то API-тесты проверяют логику, скрытую от глаз.

    Почему это важно? Представьте айсберг. UI — это лишь верхушка над водой. API и базы данных — это огромная подводная часть. Ошибки там стоят дороже, а найти их через UI сложнее и дольше. Сегодня мы научимся тестировать API быстро и надежно, используя библиотеку RestAssured.

    !Пирамида тестирования показывает, что API-тестов должно быть больше, чем UI-тестов, так как они быстрее и стабильнее.

    Что такое RestAssured?

    RestAssured — это Java-библиотека для тестирования RESTful веб-сервисов. Она стала стандартом индустрии благодаря своей простоте и мощному синтаксису, который напоминает человеческий язык.

    Вместо написания сотен строк кода для создания HTTP-соединения, вы пишете понятные конструкции в стиле BDD (Behavior Driven Development):

    > Given (Дано: параметры запроса) -> When (Когда: выполняем действие) -> Then (Тогда: проверяем результат).

    Шаг 1: Подключение зависимостей

    Как и в прошлых уроках, начнем с pom.xml. Нам понадобится сама библиотека RestAssured и библиотека Jackson (для работы с JSON, о ней поговорим чуть позже).

    Шаг 2: Первый GET-запрос

    Для тренировки мы будем использовать открытый API ReqRes. Это специальный сервис для тестирования, который имитирует работу реального бэкенда.

    Давайте напишем тест, который получает информацию о пользователе с ID 2 и проверяет, что сервер ответил статусом 200 (OK).

    Создайте класс ApiTest в папке src/test/java:

    Запустите тест. Если он прошел (зеленая галочка), значит, вы только что отправили реальный HTTP-запрос и проверили ответ сервера!

    Разбор синтаксиса

  • .given()Предусловия. Здесь мы настраиваем запрос: указываем базовый URL, заголовки (headers), параметры авторизации или тело запроса.
  • .when()Действие. Здесь мы выбираем HTTP-метод (get, post, put, delete) и указываем путь к ресурсу.
  • .then()Проверки. Здесь мы описываем, что ожидаем получить: статус-код, конкретные поля в JSON или время ответа.
  • Шаг 3: Проверка тела ответа (JSON)

    Проверить статус-код — это хорошо, но мало. Нам нужно убедиться, что сервер вернул правильные данные.

    Ответ от сервера https://reqres.in/api/users/2 выглядит примерно так:

    Давайте проверим, что имя пользователя (first_name) равно "Janet", а id равен 2. Для этого RestAssured использует мощный механизм JSONPath и матчеры (Matchers) из библиотеки Hamcrest.

    Обратите внимание на путь "data.first_name". Мы обращаемся к объекту data, а внутри него ищем поле first_name. Это и есть JSONPath.

    Шаг 4: Работа с POJO (Сериализация и Десериализация)

    Писать проверки через body("field", equalTo("value")) удобно для простых тестов. Но что, если в ответе 50 полей? Или нам нужно отправить сложный JSON на сервер (POST-запрос)? Писать JSON вручную в виде строки — плохая практика (можно легко ошибиться в кавычках или скобках).

    В Java принято работать с объектами. Здесь на сцену выходят POJO (Plain Old Java Object) классы.

    * Сериализация: Превращение Java-объекта в JSON (чтобы отправить на сервер). * Десериализация: Превращение JSON-ответа от сервера в Java-объект (чтобы удобно проверить поля).

    !Библиотека Jackson выступает переводчиком между миром Java-объектов и текстовым форматом JSON.

    Создание POJO класса

    Давайте создадим класс, который описывает пользователя для регистрации.

    Отправка POST-запроса с объектом

    Теперь мы можем отправить объект UserRequest, и RestAssured автоматически превратит его в JSON.

    Это делает код чистым, типизированным и защищенным от синтаксических ошибок в JSON.

    Шаг 5: Спецификации (Specifications)

    Вы могли заметить, что в каждом тесте мы повторяем .baseUri("https://reqres.in/api"). Если URL изменится, нам придется править все тесты. Это нарушение принципа DRY (Don't Repeat Yourself).

    В RestAssured есть Specifications — это настройки запроса и ответа, которые можно вынести в отдельное место.

    Теперь применим это в тесте:

    Это аналог паттерна Page Object, но для API. Вы храните конфигурацию и пути в одном месте, а тесты остаются краткими.

    Логирование

    Иногда тест падает, и непонятно почему. RestAssured умеет выводить в консоль детали запроса и ответа. Для этого используйте метод .log().all().

    * given().log().all() — покажет, что вы отправили. * then().log().all() — покажет, что сервер ответил.

    Пример:

    Заключение

    Сегодня мы освоили мощнейший инструмент автоматизатора — RestAssured. Мы научились:

  • Отправлять GET и POST запросы.
  • Проверять статус-коды и содержимое JSON-ответов.
  • Использовать POJO для сериализации данных (Java -> JSON).
  • Оптимизировать код с помощью спецификаций.
  • API-тесты выполняются за миллисекунды, в то время как UI-тесты могут идти минуты. Грамотное сочетание этих двух подходов сделает ваше тестирование эффективным и полным.

    В следующей, заключительной статье курса, мы поговорим о том, как запускать все наши тесты (и UI, и API) автоматически при каждом изменении кода. Мы познакомимся с понятиями CI/CD и настроим запуск тестов в GitHub Actions.

    5. Построение тестового фреймворка, отчетность Allure и интеграция с CI/CD

    Построение тестового фреймворка, отчетность Allure и интеграция с CI/CD

    Поздравляю! Вы добрались до финальной и самой важной части нашего курса «Автоматизация тестирования на Java». Мы уже научились писать код, управлять браузером через Selenium и отправлять запросы через RestAssured. Но пока наши тесты живут только на вашем локальном компьютере и запускаются вручную.

    В этой статье мы превратим набор разрозненных тестов в профессиональный Тестовый Фреймворк. Мы научимся генерировать красивые отчеты с графиками, чтобы показывать их менеджменту, и настроим автоматический запуск тестов в облаке через CI/CD.

    От скриптов к Фреймворку

    Чем отличается «скрипт» от «фреймворка»? Скрипт — это просто код, который выполняет действие. Фреймворк — это инфраструктура, которая обеспечивает удобство написания, запуска и поддержки тестов.

    Хороший фреймворк решает следующие задачи:

  • Инициализация и завершение: Открытие и закрытие браузера в одном месте.
  • Конфигурация: Хранение URL, логинов и паролей в отдельных файлах, а не в коде.
  • Логирование и отчетность: Автоматическое сохранение результатов и скриншотов при падении.
  • Создание BaseTest

    Чтобы не писать new ChromeDriver() в каждом тесте, мы выносим эту логику в родительский класс BaseTest. Все тестовые классы будут наследоваться от него.

    Теперь ваш тест выглядит чисто и аккуратно:

    Отчетность с Allure Report

    Стандартный вывод JUnit в консоли (Tests run: 5, Failures: 0) информативен для вас, но бесполезен для менеджера или заказчика. Им нужны графики, шаги воспроизведения и скриншоты. Для этого мы используем Allure Framework.

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

    !Процесс превращения результатов выполнения тестов в наглядный HTML-отчет с помощью Allure.

    Подключение Allure к JUnit 5

    Добавьте следующие зависимости в ваш pom.xml:

    Также необходимо настроить плагин Maven Surefire (который запускает тесты), чтобы он «дружил» с Allure:

    Разметка тестов аннотациями

    Чтобы отчет был понятным, мы используем специальные аннотации Allure:

    * @Epic, @Feature, @Story — для группировки тестов по функционалу. * @Description — подробное описание теста. * @Step — самое важное! Помечает методы (например, в Page Object) как шаги теста.

    Пример использования в Page Object:

    Генерация отчета

    После запуска тестов (mvn clean test) в папке target/allure-results появятся файлы с данными. Чтобы превратить их в красивый сайт, выполните команду в терминале:

    Браузер откроется автоматически, и вы увидите детальный отчет.

    Интеграция с CI/CD (GitHub Actions)

    Фраза «на моей машине всё работает» — это табу для профессионала. Тесты должны запускаться в независимой среде. Здесь на сцену выходит CI/CD (Continuous Integration / Continuous Delivery).

    Мы настроим процесс так, чтобы при каждом сохранении кода (push) в репозиторий GitHub, тесты запускались автоматически.

    Что такое GitHub Actions?

    Это встроенный в GitHub инструмент автоматизации. Он позволяет описывать сценарии (workflows) в формате YAML. Сценарий говорит GitHub'у: «Возьми виртуальную машину на Linux, установи туда Java, скачай мой код и запусти тесты».

    Настройка Workflow

  • В корне вашего проекта создайте структуру папок: .github/workflows.
  • Внутри создайте файл maven.yml.
  • Вставьте следующий код:
  • Теперь, как только вы отправите код на GitHub, во вкладке Actions вашего репозитория начнется магия. Вы увидите логи сборки в реальном времени.

    Заключение курса

    Мы прошли долгий путь. Вы начали с установки Java, разобрались с ООП, освоили JUnit, Selenium и RestAssured. Сегодня вы объединили всё это в единую систему, которая работает автоматически.

    Что дальше? * Изучайте Docker, чтобы запускать тесты в изолированных контейнерах. * Посмотрите в сторону Selenoid для параллельного запуска браузеров. * Углубляйтесь в язык Java и паттерны проектирования.

    Автоматизация — это не просто написание кода, это создание инструментов, которые помогают команде выпускать качественный продукт быстрее. Удачи в вашей новой карьере QA Automation Engineer!