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

Мы разберём, почему Java уже более 25 лет остаётся главным языком для корпоративного тестирования, напишем первую простую программу и на простых примерах увидим, как работают переменные, условия и циклы. Также покажу, где брать инструменты и проходить практику, чтобы это все не осталось в планах и несбыточных мечтах.

Почему Java, а не Python? Спор в комментариях гарантирован:)

Каждый год в Telegram‑чатах QA‑инженеров, на которые я подписан, разгорается спор на тему: «Почему мы учим Java, если Python проще?». Давайте разберемся.

Да, на Python написать скрипт для проверки API можно в 5 строк. Но когда вы придёте в крупный банк, ритейлер или аутсорс‑компанию, вы увидите там экосистему, которая в большинстве случаев заточена под Java:

  • Selenium — стандарт де‑факто. Хотя биндинги есть под всё, основные фреймворки (JUnit, TestNG, Allure) исторически и архитектурно ближе к Java.

  • Интеграция с корпоративным зоопарком. CI/CD (Jenkins, TeamCity), системы управления тест‑кейсами (Test IT, Qase), логгеры — всё это дружит с Java без костылей.

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

В одном из проектов мы нанимали автоматизатора, который отлично знал Python, но не понимал, как устроены maven и многопоточность в Java. Первый спринт он потратил на то, чтобы заставить Selenium работать параллельно на трёх воркерах. На Java эта задача решается добавлением одной аннотации. Выбор языка — это не вопрос «что легче», а вопрос «что дешевле поддерживать команде».

«Открытый урок»: первые шаги в Java для автоматизации

Сегодня мы не будем погружаться в дебри Spring или многопоточности. Наша цель — перестать бояться кода и написать что‑то работающее. Для этого возьмём реальную задачу из тестирования: представьте, что нам нужно автоматизировать проверку формы регистрации. Мы напишем мини‑программу, которая проверяет: подходит ли пароль по длине и совпадают ли введённые пароли.

Настраиваем окружение

Перед тем, как писать код, нам понадобятся три вещи:

  1. JDK (Java Development Kit) — скачайте OpenJDK 11 или 17. Не гонитесь за последними версиями — как правило большие корпорации любят долго сидеть на старых версиях. И очень часто можно увидеть проекты на Java 8. Для освоения и первых шагов этого вполне будет более чем достаточно. Но если очень хочется, то добро пожаловать в Java 25.

  2. IntelliJ IDEA Community Edition — лучшая среда для Java‑разработчика. Бесплатная и самая популярная. Если есть проблема с ее загрузкой, то можно попробовать один из продуктов импортозамещения.

  3. Git — чтобы потом залить код на GitHub.

Вся установка — это просто «далее‑далее‑далее». С этим справляются все. Здесь останавливаться не будем.

Пишем первую программу: «Валидатор пароля»

Задача: у нас есть форма регистрации. Мы хотим проверить, что пароль длиннее 8 символов и что подтверждение пароля совпадает с оригиналом.

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

В Java принято хранить классы в пакетах — это как папки на компьютере. Для нашего проекта создадим структуру:

src/
 └── main/
     └── java/
         └── ru/
             └── otus/
                 └── firststeps/
                     └── PasswordValidator.java

Пакет ru.otus.firststeps говорит сам за себя. Это наш первый маленький шаг к порядку.

Создадим класс PasswordValidator. Весь код я выложил в репозиторий на GitHub, ссылка будет в конце статьи. Сейчас разберём ключевые моменты.

package ru.otus.firststeps;

public class PasswordValidator {
    public static void main(String[] args) {
        // Это наши входные данные (представьте, что мы получили их из веб-формы)
        String password = "Qwerty123";
        String confirmPassword = "Qwerty123";

        // Переменные для хранения результатов проверки
        boolean isLengthValid;
        boolean isPasswordMatch;

        // Условная конструкция: проверяем длину
        if (password.length() >= 8) {
            isLengthValid = true;
            System.out.println("Длина пароля корректна");
        } else {
            isLengthValid = false;
            System.out.println("Ошибка: пароль должен быть не менее 8 символов");
        }

        // Проверяем совпадение паролей
        if (password.equals(confirmPassword)) {
            isPasswordMatch = true;
            System.out.println("Пароли совпадают");
        } else {
            isPasswordMatch = false;
            System.out.println("Ошибка: пароли не совпадают");
        }

        // Итоговый вердикт
        if (isLengthValid && isPasswordMatch) {
            System.out.println("Регистрация возможна: все проверки пройдены");
        } else {
            System.out.println("Регистрация отклонена: исправьте ошибки");
        }
    }
}

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

Теперь разберем эти «многобукфф» по частям.

  1. Переменные и типы данных

    String — текст. Сюда пишем все, что пишется из букв и цифр и различных знаков.

    boolean — правда/ложь.

    Мы могли бы использовать int для подсчёта попыток или List для хранения списка ошибок, но для старта достаточно строк и флагов.

  2. Условные конструкции if/else
    Это — мозг нашей программы. Если условие в скобках истинно (true), выполняется первый блок, если ложно (false) — второй. В наших тестах мы постоянно будем проверять условия: если элемент отобразился, то кликни, иначе упади с ошибкой.

  3. Метод equals() в Java строки нельзя сравнивать через ==. Это частая ошибка новичков. == сравнивает ссылки на объекты, а equals() — содержимое. В своих код‑ревью я всегда подсвечиваю этот момент новичкам.

Усложняем пример: добавляем цикл и массив

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

Создадим новый класс BulkValidator:

package ru.otus.firststeps;

public class BulkValidator {
    public static void main(String[] args) {
        // Массив тестовых данных
        String[][] testData = {
            {"Qwerty123", "Qwerty123"}, // Валидный случай
            {"12345", "12345"},         // Слишком короткий
            {"StrongPass", "WrongPass"} // Не совпадают
        };

        System.out.println("ОТЧЁТ ВАЛИДАЦИИ:");

        // Цикл for: так проходим по всем элементам массива
        for (int i = 0; i < testData.length; i++) {
            String password = testData[i][0];
            String confirm = testData[i][1];

            System.out.println("\nТестовый случай №" + (i + 1) + ":");
            System.out.println("Пароль: " + password);
            System.out.println("Подтверждение: " + confirm);

            // Проверки
            if (password.length() >= 8) {
                System.out.println("Длина ОК");
            } else {
                System.out.println("Длина НЕ ОК");
            }

            if (password.equals(confirm)) {
                System.out.println("Совпадение ОК");
            } else {
                System.out.println("Совпадение НЕ ОК");
            }
        }
    }
}

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

Причём здесь автоматизация тестирования?

Теперь давайте свяжем этот код с реальностью. Мы пойдём дальше и покажем, как этот же валидатор превращается в настоящий автотест с использованием JUnit5. Выглядеть это будет так:

package ru.otus.firststeps;

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.Assertions;

class PasswordValidatorTest {

    @Test
    void shouldPassWhenPasswordIsValidAndMatches() {
        // Данные (Given)
        String password = "StrongPass123";
        String confirm = "StrongPass123";

        // Действие (When)
        boolean isLengthValid = password.length() >= 8;
        boolean isPasswordMatch = password.equals(confirm);

        // Проверка (Then)
        Assertions.assertTrue(isLengthValid, "Длина пароля менее 8 символов");
        Assertions.assertTrue(isPasswordMatch, "Пароли не совпадают");
    }

    @Test
    void shouldFailWhenPasswordTooShort() {
        String password = "123";
        String confirm = "123";

        boolean isLengthValid = password.length() >= 8;
        boolean isPasswordMatch = password.equals(confirm);

        Assertions.assertFalse(isLengthValid, "Пароль должен быть забракован из-за длины");
        Assertions.assertTrue(isPasswordMatch);
    }
}

Поздравляю! Это и есть автоматизация тестирования на Java. Мы просто берём нашу логику, оборачиваем её в методы с аннотацией @Test и используем встроенные средства проверки (Assertions). Все волшебство — в структуре и инструментах, а логика остаётся той же, что и в наших первых примерах.

Визуализируем: как тест взаимодействует с системой

Чтобы лучше понять место Java‑кода в процессе тестирования, посмотрите на простую диаграмму последовательности. Подробные диаграммы можно рисовать в Mermaid. Она показывает, как наш тест общается с браузером и приложением.

Рис. 1. Взаимодействие теста с системой
Рис. 1. Взаимодействие теста с системой

Диаграмма наглядно показывает как Java‑тест — управляет всем процессом: отдаёт команды, но не лезет в механику браузера. Вся сложность скрыта за фреймворками (Selenium), а мы лишь пишем логику на том же Java, что и в наших примерах.

Что рекомендуют лучшие практики тестирования?

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

  1. Правило бойскаута: оставляй код чище, чем ты его нашёл. Если видите дублирование (тот же валидатор пароля копируется в 10 местах) — выносите в отдельный приватный метод этого же класса.

  2. Именование переменных это всё! Переменная a1b2 заставит подумать что в ней находится, а назначение переменной userPasswordFromForm — понятно без комментариев. Если вы обнаруживаете, что вам нужен комментарий для объяснения переменной или функции — перепишите её имя так, чтобы оно само объясняло своё назначение.

  3. Один тест — одна проверка. Не надо в одном @Test методе проверять и логин, и регистрацию, и корзину. Когда такой тест упадёт, вы полдня будете искать причину.

На одном проекте мы сократили время прогона регресса в 3 раза только за счёт того, что переписали «монстров» (тесты, которые проверяли по 20 сценариев сразу) на маленькие атомарные тесты. Java позволяет делать это легко и элегантно.

Заключение

Java в автоматизации — это не страшно. Это просто набор инструментов и договорённостей. Сегодня мы написали две программы, разобрали типы данных, условия и циклы. Этого достаточно, чтобы понимать 80% кода, который пишут автоматизаторы в повседневной работе.

Если вы хотите пойти дальше и разобраться, как писать промышленные автотесты на Java — с фреймворками, отчётами и запуском различных инструментариев, то приходите к нам на специализацию по «Инженер по автоматизации тестирования» («QA Automation Engineer»). Мы как раз будем разбирать первые шаги, но уже в контексте реальных задач автоматизации.

Если хотите понять формат обучения — записывайтесь на бесплатные уроки от преподавателей специализации:

  • 12 марта в 20:00. «Первый автотест с Playwright)». Записаться

  • 23 марта в 20:00. «ИИ в автотестах: помощник или угроза?». Записаться

Еще больше бесплатных уроков от п��еподавателей курсов можно посмотреть в календаре мероприятий.