Программирование на Java для тестировщиков
Ближайшая дата курса
тренер: Баранцев Алексей
Этот курс предназначен для обучения тестировщиков программированию на языке Java (для тех, кого интересуют другие языки, у нас есть аналогичные курсы для Python и C#).
Да, это курс именно для тестировщиков. Обучение программированию не сводится только к изучению языка программирования. Построение правильной архитектуры, использование фреймворков и библиотек, владение инструментами разработки и отладки -- это тоже часть “умения програмировать”. Поэтому в этом курсе детально рассматриваются именно те возможности языка и вспомогательных библиотек, которые наиболее востребованы при разработке автотестов, в том числе при тестировании веб- и windows-приложений через пользовательский интерфейс.
Изучаемый материал будет демонстрироваться на едином сквозном примере -- мы будем разрабатывать на языке Java автоматизированные тесты для веб-приложения, используя Selenium WebDriver. Начав с простого теста, записанного “рекордером”, мы будем постепенно усложнять архитектуру тестового набора, добавлять и усиливать проверки в тестах, дополнять тесты генераторами тестовых данных. Основной акцент будет сделан не на алгоритмы, а на изучение различных полезных библиотек и фреймворков, а также шаблонов проектирования, позволяющих организовать код автоматизированных тестов таким образом, чтобы его было легко модифицировать и расширять.
Но одним примером мы не ограничимся, для закрепления материала мы в течение курса построим "в едином стиле" несколько проектов с тестами для приложений разного типа, научимся тестировать приложения через веб-интерфейс, пользовательский интерфейс Windows, интерфейс доступа к базам данных, сетевые интерфейсы (почта, HTTP, веб-сервисы).
И напоследок научимся делать тесты на "естественном" языке Gherkin. Да, не удивляйтесь, чтобы делать тесты на "естественном" языке -- нужно уметь программировать :)
1. Основы программирования
Большинство учебников и курсов по программированию начинаются с написания простейшей программы, которая выводит на консоль слова “Hello, world!”. Мы не станем нарушать эту традицию, потому что первым делом нужно подготовить среду разработки и убедиться, что всё установлено и настроено правильно. Попутно мы научимся использовать сервис GitHub для хранения исходного кода проекта.
В первом занятии будут рассмотрены базовые конструкции языка программирования Java -- классы и объекты, переменные и функции. Заодно научимся пользоваться отладчиком. Но до создания тестов так и не доберёмся.
2. Двухуровневая архитектура тестового набора
Затем мы сразу совершим “прыжок” -- вместо того, чтобы постепенно усложнять свою первую примитивную программу, мы запишем “рекордером” готовый тест для веб-приложения, перенесём его в среду разработки, подключим все необходимые вспомогательные библиотеки, а потом будем его улучшать.
Автотесты “системного” уровня (в отличие от “unit-тестов”) удобно разделить на два слоя -- 1) собственно тесты, 2) код, ответственный за взамодействие с тестируемой системой, причём вторая часть, как правило, является более сложной технически.
Мы научимся создавать такую двухуровневую архитектуру путём плавной трансформации ранее созданных при помощи “рекордера” простых одноуровневых тестов, и познакомимся с понятием “рефакторинга” кода.
На этом же этапе мы познакомимся с базовыми возможностями тестового фреймворка TestNG.
А после того, как двухуровневая архитектура будет выстроена -- добавим пару новых тестов уже без использования рекордера.
3. Управление потоком выполнения кода: условный переход
Условный переход (if-then) -- это одна из основных конструкций языка программирования, позволяющая программе вести себя по разному в разных условиях.
Мы научимся использовать эту конструкцию для того, чтобы менять поведение программы в зависимости от ситуации (есть на странице тестируемого веб-приложения нужный элемент или нет) и от входных данных (определено значение некоторой переменной или нет), для оптимизации тестов (уже попали на нужную страницу приложения или нет) и для повышения их гибкости и надёжности.
4. Коллекции и циклы
Вторая основополагающая конструкция языка программирования -- это цикл, то есть многократное выполнение некоторого фрагмента кода. В тестах она может встречаться, например, при генерации большого количества тестовых данных.
Однако чаще циклы используются при работе с “коллекциями” -- списками и множествами объектов какого-то типа. Мы научимся строить и модифицировать коллекции, сравнивать и сортировать их, а также реализовывать в тестах сложные проверки, в которых участвуют коллекции объектов.
5. Работа со строками
Строки -- один из самых широко распространённых типов данных, с которым приходится иметь дело в тестах, особенно если тестирование выполняется через пользовательский интерфейс. Конечно, эти строки могут представлять собой числа или даты или объекты какого-то другого типа, но из тестируемого приложения мы получаем их именно в виде строк, так что перед дальнейшим использованием их ещё нужно правильно преобразовать в нужный тип данных.
Мы научимся сравнивать строки, проверять их на соответствие регулярным выражениям, преобразовывать строки в числа и обратно, а также генерировать строки, состоящие из случайного набора символов.
А затем доработаем тесты -- сделаем их параметризованными и свяжем их с генераторами тестовых данных. Такой подход называется Data Driven Testing (DDT).
6. Работа с файлами
Файлы -- это место, где можно хранить тестовые данные. Поэтому в контексте разработки автотестов важно уметь читать данные из файлов разного формата. С другой стороны, создавать тестовые данные тоже не обязательно вручную, можно написать программу, которая их будет гененировать и сохранять в файл нужного формата.
Мы научимся читать данные из файлов в формате CSV, XML, JSON, а также писать данные в файл в этих форматах.
7. Работа с базами данных
Подавляющее большинство многопользовательских приложений (к которым относятся и веб-приложения), а также многие однопользовательские приложения, используют базы данных для хранения информации. Когда пользователь вводит какую-то информацию через интерфейс приложения, она после некоторой обработки попадает в базу данных и хранится там до тех пор, пока она не потребуется для работы того же самого или или какого-то иного приложения. При тестировании часто бывает удобно проверить, правильно ли сохранилась информация в базе данных. Поэтому многие тестировщики, даже не умея программировать, достаточно хорошо владеют языком запросов к базе данных SQL.
Сначала мы научимся пользоваться технологией доступа к базам данных, которая позволяет выполнять привычные SQL-запросы и анализировать полученный ответ как таблицу. Затем мы освоим более современную технологию объектно-реляционных преобразований.
8. Сетевое программирование: протоколы прикладного уровня
С одной стороны, это занятие будет повторением пройденного материала. Мы построим новый тестовый набор с двухуровневой архитектурой для нового тестируемого приложения. Однако всё взаимодействие с тестируемым приложением будет происходить в обход пользовательского интерфейса.
В этом занятии будут рассмотрены механизмы работы с сетевыми протоколами для отправки и получения почты POP3 и SMTP, протоколом для отправки и получения файлов FTP, протоколом для удалённого выполнения команд Telnet, а также традиционным протоколом, используемый для взаимодействия с веб-приложениями HTTP.
Для веб-приложений характерным случаем является использование электронной почты -- отправка ссылки для подтверждения регистрации, восстановление пароля, оповещения о каких-либо событиях. Для тестирования такого рода функциональности мы научимся работать с почтовым сервером из автоматизированных тестов: принимать и отправлять почту, анализировать содержимое почтовых сообщений. Настройка приложения, находящегося на удалённом сервере, может потребовать умения загружать туда файлы по протоколу FTP.
9. Сетевое программирование: удалённые программные интерфейсы
И ещё одно занятие-повторение, в котором мы опять построим новый тестовый набор для нового учебного приложения, чтобы закрепить навык создания типовой двухуровневой архитектуры.
А затем научимся работать с удалёнными программными интерфейсами SOAP и REST. Технология SOAP чаще используется в крупных “промышленных” приложениях, а технология REST более характерна для современных веб-сервисов.
10. Тестовые фреймворки и инфраструктура
Последнее занятие будет посвящено рассмотрению альтернативных тестовых фреймворков, в том числе инструмента Cucumber для разработки тестов на "естественном" языке Gherkin и инструмента Robot Framework для разработки тестов в стиле Keyword Driven Testing.
Кроме того, мы научимся запускать тесты на сервере непрерывной интеграции Jenkins и генерировать красивые отчёты при помощи инструмента Allure.