1. Окружение и первая программа: структура класса и метод main
Ручное регрессионное тестирование формы регистрации может занимать два часа монотонных кликов, ввода одних и тех же данных и проверок сообщений об ошибках. Автоматизированный скрипт делает то же самое за пятнадцать секунд в фоновом режиме. Разница между этими двумя сценариями заключается в умении объяснить компьютеру, что именно нужно сделать, на понятном ему языке. Java — один из самых строгих, надежных и популярных языков для написания таких инструкций в enterprise-сегменте.
Чтобы написать свою первую строчку кода, не нужно сразу понимать устройство сложных тестовых фреймворков вроде JUnit или Selenide. Достаточно разобраться, где этот код живет, как он запускается и почему в Java нельзя просто написать команду и нажать клавишу ввода.
Инфраструктура языка: от JVM до IDE
Компьютер не понимает английский язык или синтаксис Java. Процессор оперирует исключительно машинным кодом — последовательностями нулей и единиц, специфичными для конкретной архитектуры. Чтобы ваш текст превратился в реальные действия (например, открытие браузера), нужна многоуровневая система трансляции. В мире Java эта система состоит из трех вложенных друг в друга компонентов.
JVM (Java Virtual Machine) — виртуальная машина Java. Это сердце экосистемы. JVM берет промежуточный код (о котором пойдет речь ниже) и переводит его в машинные инструкции «на лету», прямо в момент выполнения программы. Для каждой операционной системы (Windows, macOS, Linux) существует своя версия JVM.
JRE (Java Runtime Environment) — среда выполнения. Это JVM плюс набор стандартных библиотек (готовых фрагментов кода), необходимых для работы программ. Если на компьютере установлено только JRE, вы сможете запускать чужие Java-программы, но не сможете создавать свои.
JDK (Java Development Kit) — набор разработчика. Это максимальная комплектация, которая включает в себя JRE, а также утилиты для разработки. Главная из этих утилит — компилятор (javac), который переводит написанный вами текст в формат, понятный виртуальной машине. Без установленного JDK написать и собрать автотест невозможно.
> Для автоматизации тестирования на рабочий компьютер всегда устанавливается именно JDK.
Помимо инфраструктуры самого языка, инженеру нужен инструмент для написания текста. IDE (Integrated Development Environment) — это интегрированная среда разработки. Вы могли бы писать код в обычном текстовом редакторе, но это неэффективно: блокнот не подскажет, где пропущена запятая, и не подсветит ошибку до попытки запуска. В индустрии QA Automation стандартом де-факто является IntelliJ IDEA (версии Community Edition более чем достаточно). Эта программа анализирует код в реальном времени, автоматически форматирует текст, импортирует библиотеки и позволяет запускать тесты нажатием одной кнопки, скрывая под капотом сложные вызовы утилит из JDK.
Анатомия первой программы
В некоторых языках программирования, например в Python, чтобы вывести текст на экран, достаточно написать одну короткую строку: print("Hello"). Java устроена иначе. Это объектно-ориентированный язык со строгой иерархией, где ни одна строчка логики не может существовать в пустоте. Все должно быть структурировано.
Рассмотрим минимально возможную программу, которая выводит сообщение о готовности системы.
На первый взгляд это выглядит как избыточное нагромождение служебных слов. Однако в Java каждое слово имеет строгий смысл и выполняет конкретную техническую функцию.
!Основные элементы структуры Java-класса на примере программы FirstTest.
Класс — контейнер для кода
Первая строка public class FirstTest объявляет класс. В Java класс — это фундаментальная единица структуры. Вне классов в Java не существует ничего.
public — модификатор доступа. Он означает, что этот класс публичный, то есть доступен для запуска и использования извне (например, операционной системой или тестовым фреймворком).class — ключевое слово, сигнализирующее компилятору о создании нового класса.FirstTest — имя класса.В Java существует жесткое правило: имя публичного класса должно в точности совпадать с именем файла, в котором он находится. Если класс называется FirstTest, файл обязан называться FirstTest.java. Ошибка даже в одной букве или регистре приведет к тому, что программа не скомпилируется.
Сами классы принято называть в стиле PascalCase: каждое слово начинается с заглавной буквы, без пробелов и подчеркиваний (например, UserLoginTest, PaymentPage).
Метод main — точка входа
Вторая строка public static void main(String[] args) — это главная точка входа в любую базовую программу на Java.
Когда вы нажимаете кнопку запуска в IntelliJ IDEA, виртуальная машина начинает искать в указанном классе именно этот метод. Если метода main нет, или он написан с опечаткой (например, Main с большой буквы), JVM выдаст ошибку NoSuchMethodError, так как не поймет, откуда начинать выполнение инструкций.
Разбор сигнатуры метода:
public — метод открыт, чтобы JVM могла вызвать его снаружи класса.static — означает, что метод принадлежит самому классу. Это позволяет виртуальной машине запустить его сразу, без необходимости предварительно создавать объект этого класса в оперативной памяти (подробно концепция объектов будет раскрыта в теме ООП).void — тип возвращаемого значения. Переводится как «пустота». Это означает, что метод просто выполнит свою работу (напечатает текст) и не будет возвращать никакого числового или текстового результата обратно в систему после завершения.main — строго зарезервированное имя стартового метода.(String[] args) — параметры метода. Это массив строк, канал связи, через который программе можно передать внешние аргументы при запуске. Например, при запуске автотестов через консоль сюда можно передать параметр --browser=chrome, чтобы код понял, в каком браузере выполнять проверки. Даже если аргументы не используются, эти скобки обязаны присутствовать.Команды вывода: print и println
Третья строка System.out.println("Система готова к тестированию!"); — это исполняемая команда. Она просит системный класс (System) обратиться к стандартному потоку вывода (out) и напечатать строку.
Текст обязательно заключается в двойные кавычки "". Для компилятора все, что внутри двойных кавычек — это строковый литерал, простой набор символов, который не нужно пытаться анализировать как код.
Существует две базовые команды для вывода текста:
System.out.print() — выводит текст и оставляет курсор на той же строке. Следующий вывод приклеится вплотную.System.out.println() — выводит текст и добавляет невидимый символ переноса строки (сокращение от print line). Следующий вывод начнется с новой строки.Строгий синтаксис: пунктуация и комментарии
Java не прощает небрежности. Если в человеческом общении можно забыть точку в конце предложения без потери смысла, то компилятор Java при отсутствии одного символа откажется собирать программу.
Фигурные скобки {} определяют границы блоков (область видимости).
После объявления класса FirstTest открывается фигурная скобка {. Она закрывается в самом конце файла }. Все, что между ними — это тело класса. Точно так же у метода main есть свои фигурные скобки. Потеря одной скобки ломает вложенность, и компилятор теряет контекст программы.
Точка с запятой ; завершает инструкцию.
Каждое конкретное действие (вызов метода, создание переменной) должно заканчиваться точкой с запятой. Она говорит компьютеру: «Эта команда закончена, переходи к следующей». После закрывающих фигурных скобок } точка с запятой не ставится.
Чувствительность к регистру (Case Sensitivity).
Для Java слова System, system и SYSTEM — это три абсолютно разных идентификатора. Ключевые слова языка (public, class, void) всегда пишутся строчными буквами. А вот встроенные классы (например, System или String) — всегда с большой.
Комментарии. Часто в коде нужно оставить пояснение для других тестировщиков или временно отключить часть логики. Для этого используются комментарии — текст, который компилятор полностью игнорирует.
Жизненный цикл кода: от текста к выполнению
Автотестировщику важно понимать, что происходит после нажатия кнопки запуска. Код не выполняется напрямую. Он проходит двухэтапный процесс трансляции.
!Схема процесса компиляции кода в байт-код для его последующего выполнения на JVM.
javac из комплекта JDK берет текстовый файл FirstTest.java и проверяет его на синтаксические ошибки. Если правила соблюдены, компилятор переводит текст в байт-код. Создается новый файл — FirstTest.class. Байт-код не привязан к процессору, это универсальный язык, понятный только JVM.FirstTest.class, переводит байт-код в машинные инструкции конкретно для текущей операционной системы и процессора, а затем выполняет их.Зачем нужна эта сложность с промежуточным байт-кодом? Это обеспечивает фундаментальный принцип Java: Write Once, Run Anywhere (Напиши один раз, запускай везде).
Для автоматизации тестирования это критическое преимущество. Инженер может написать и скомпилировать автотест на рабочем ноутбуке с Windows. Затем этот же самый скомпилированный файл с байт-кодом отправляется в систему непрерывной интеграции (например, Jenkins), которая работает на удаленном сервере под управлением Linux. Код не нужно переписывать или перекомпилировать — Linux-версия JVM сама поймет, как выполнить полученный байт-код в своей среде.
Типичные ошибки на старте
Когда вы начнете писать код, IDE неизбежно будет подчеркивать его красным цветом. Компилятор не пытается вас запутать, он прямо указывает на нарушение строгих правил.
| Ошибка в коде | Сообщение IDE / Компилятора | Причина и решение |
| :--- | :--- | :--- |
| System.out.println("Тест") | java: ';' expected | Пропущена точка с запятой. Компилятор не понимает, где заканчивается команда. Добавьте ; в конец строки. |
| system.out.println("Тест"); | Cannot resolve symbol 'system' | Ошибка регистра. Встроенный класс называется System (с заглавной буквы). Компилятор воспринимает system как неизвестное слово. |
| Удалена последняя } | java: reached end of file while parsing | Потеряна закрывающая скобка. Компилятор дошел до конца документа, но не нашел логического завершения блока класса. |
| Класс назван Test, а файл First.java | class Test is public, should be declared in a file named Test.java | Несовпадение имен. Имя публичного класса обязано строго совпадать с именем файла, включая регистр. |
Освоение Java начинается с принятия этих строгих правил игры. Поначалу необходимость писать public static void main и следить за каждой скобкой может казаться избыточной бюрократией по сравнению с более легковесными языками. Однако именно эта строгость делает Java предсказуемой. Когда автотестов станут сотни, жесткие рамки классов спасут проект от хаоса, а мгновенные проверки компилятора не позволят отправить синтаксически неверный код на сервер выполнения.