3 декабря мы запускаем онлайн-тренинг "Программирование для тестировщиков" (анонс и условия участия по ссылке), в рамках которого мы будем учить тестировщиков программировать. Не просто использовать запись тестов в стиле catch-n-replay с последующей незначительной ручной доработкой, а создавать по настоящему хорошие автоматизированные тесты. Во-первых, хорошие с архитектурной точки зрения, которые легко изменять и добавлять новые. Во-вторых, хорошие с точки зрения читаемости, так чтобы посмотрев на код теста можно было легко понять, что он проверяет. В-третьих, хорошие с точки зрения возможности выполнять сложные проверки правильности результатов, даже если для этого требуется заглянуть в базу данных или проанализировать лог-файлы.
Весь изучаемый материал будет демонстрироваться на одном сквозном примере -- мы будем разрабатывать на языке Java автоматизированные тесты для веб-приложения, используя драйвер Selenium RC. И с каждым занятием мы будем писать всё более и более сложные тесты, добавляя в свой арсенал новые возможности как для управления тестируемой системой и её окружением, так и для выполнения проверок различного рода. Кроме того, мы будем не только учиться делать автоматизированные тесты, но также разрабатывать вспомогательные программы -- генераторы данных, анализаторы содержимого файлов, эмуляторы.
Мы не будем изобретать велосипед. К настоящему моменту в мире существует огромное количество уже готовых компонентов и библиотек, которыми можно воспользоваться для решения типичных задач. Поэтому программисту в наши дни требуется не только и не столько умение кодировать алгоритмы, сколько умение проектировать программу из готовых компонентов. Автоматизация тестирования не является исключением из этого правила. Поэтому мы будем делать основной упор не на алгоритмы, а на изучение различных полезных библиотек и фреймворков. Кроме того, мы будем параллельно рассматривать различные шаблоны проектирования, позволяющие организовать код автоматизированных тестов таким образом, чтобы его было легко модифицировать и расширять.
Подробная программа тренинга "Программирование для тестировщиков"
1. Основы программирования: структуризация кода.
Мы не станем пытаться брать крепость программирования "лобовой атакой", последовательно изучая типы данных, операторы и конструкции языка. Вместо этого мы зайдём "с тыла", начав понимание основ программирования с изучения тех тестов, которые генерируются инструментами catch-n-replay. Это может показаться странным, потому что я часто повторяю, что эти инструменты создают плохие тесты, и вдруг я выбрал их как пример для изучения. Да, именно по этой причине и выбрал. Эти тесты слишком примитивны, чтобы быть пригодными к использованию в реальной жизни, но как учебные примеры они достаточно хороши -- они крайне просты по своему устройству, но несмотря на это являются готовыми к выполнению тестами. Кроме того, эти тесты уже используют специальный фреймворк для запуска тестов, который нам также предстоит освоить в рамках тренинга.Сначала мы изучим возможности языка Java по структуризации кода -- пакеты и классы, методы и данные, а также посмотрим на то, как среда разработки позволяет манипулировать этой структурой кода. Затем поговорим о том, как тестовый фреймворк накладывает на код дополнительную структуру, выделяя специальные методы для работы с тестовым окружением, которые в нужный момент автоматически выполняются, чтобы выполнить инициализацию и зачистку.
2. Основы программирования: управление потоком выполнения кода.
Разобравшись с правилами структуризации кода, мы конечно же заглянем внутрь отдельных методов и изучим две основных конструкции для управления потоком выполнения кода -- ветвление и зацикливание. А также специальную конструкцию аварийного выхода -- выброс и перехват исключений. Это три кита, на которых стоит практически всё управление ходом выполнения программ, в том числе и автоматизированных тестов.Мы рассмотрим, как использовать ветвления в тестах для повышения их "интеллектуальности", так чтобы тесты могли вести себя по разному в зависимости от ситуации. Мы научимся перехватывать исключения, приходящие от тестируемой системы (или драйвера пользовательского интерфейса), и соответствующим образом реагировать на возникшие проблемы. Мы освоим использование циклов для создания генераторов тестовых данных, в том числе динамических генераторов, автоматически создающих данные в процессе выполнения тестов.
3. Работа с контейнерами, предназначенными для хранения наборов данных: множествами, списками, ассоциативными массивами.
Контейнерные типы данных предназначены для хранения коллекций данных. Эти коллекции могут использоваться для различных целей. Например, в коллекцию может быть собрано какое-то количество заранее подготовленных тестовых данных, которые затем будут последовательно использованы в тестах. При проверке свойств веб-страницы мы можем получить коллекцию всех ссылок или картинок, присутствующих на этой странице, чтобы затем тщательно изучить свойства отдельных объектов, входящих в эту коллекцию. Контейнерные типы данных будут впоследствии часто встречаться нам, когда мы будем учиться работать с файлами и базами данных.4. Работа со строками -- анализ строк, проверка соответствия образцу, регулярные выражения.
Текст -- один из наиболее распространённых форматов представления информации, особенно для веб-приложений. Текстовые данные вводятся в поля форм, в виде текста выдаются результаты работы приложения или сообщения об ошибках. Поэтому умение работать с текстовыми строками является непременным условием для тестировщика-автоматизатора. И наиболее сложной задачей является анализ содержимого текстовых строк, чтобы проверить, правильный ли результат выдало приложение или верно ли оно сообщило об ошибке.Разумеется, с текстовой информацией приходится много работать не только тестировщикам, поэтому эту область можно считать хорошо "культивированной". Для анализа строк имеются как простые средства, типа проверки вхождения подстроки в строку, так и потрясающей мощности регулярные выражения, позволяющие сформулировать весьма сложные описания формата, на соответствие которому нужно проверить текст.
Тестировщикам, использующим Selenium RC, нужно особенно хорошо уметь работать со строками. Дело в том, что характерной особенностью Selenium RC, отличающей его от других драйверов веб-интерфейса, является то, что большинство обмена данными с браузером производится в виде строк. Это определяется особенностями архитектуры Selenium RC -- тесты отправляют через сервер текстовые команды браузеру, и получают ответ также в виде текста. Поэтому при использовании других драйверов веб-интеферйса тестировщик в равной мере работает как с коллекциями объектов (элементов пользовательского интерфейса), так и со строками, а при работе с Selenium RC работа ведётся преимущественно с текстом.
5. Автоматизация управления веб-приложением через браузер.
Несмотря на то, что в этом тренинге мы с самого начала и до конца будем заниматься автоматизацией работы с веб-приложением через браузер, это занятие особое. Это "экватор" тренинга, и к этому моменту у нас будет уже достаточно знаний и умений, чтобы поговорить не только о низкоуровневом кодировании (типа анализа строк), но о проектировании тестов, о хороших и плохих архитектурных решениях. Фактически мы вернёмся к самому началу, к обсуждению структуризации кода, но уже на качественно новом уровне.6. Автоматизация Java GUI.
Эта тема представляет собой своеобразное отступление от основного материала тренинга. Мы не только обратим наше внимание на приложение другого типа, но и будем использовать другой инструмент тестирования. При этом преследуются две цели. Во-первых, показать, что надо инструмент подбирать под задачу, а не пытаться всё сделать одним и тем же инструментом. Во-вторых, показать, что несмотря на "во-первых" разные инструменты весьма похожи, так что изученные на предыдущих занятиях шаблоны проектирования с не меньшим успехом можно применять и при разработке тестов для приложений другого типа.7. Работа с файлами -- чтение и запись данных из файла и в файл, анализ содержимого директорий.
Многие приложения читают или пишут файлы. В конфигурационных файлах хранятся различные настройки. В файлы журнализации сбрасываются сообщения об ошибках и иная служебная информация. Файлами приложения обмениваются между собой, передавая таким образом информацию. В файлы записывается информация с целью её хранения и использования впоследствии. И конечно же при тестировании нужно создавать файлы, которые приложение читает, а также проверять корректность содержимого файлов, созданных приложением.Нам нужно научиться читать и писать файлы различного формата. Для работы с содержимым текстовых файлов нам пригодятся изученные ранее приёмы работы со строками. Для работы с более сложными форматами (MS Office, PDF, ZIP и т.д.) существуют специальные библиотеки, которыми мы тоже научимся пользоваться.
8. Работа с базами данных.
Подавляющее большинство многопользовательских приложений (к которым относятся и веб-приложения), а также многие однопользовательские приложения, используют базы данных для хранения информации. Когда пользователь вводит какую-то информацию через интерфейс приложения, она после некоторой обработки попадает в базу данных и хранится там до тех пор, пока она не потребуется для работы того же самого или или какого-то иного приложения. При тестировании часто бывает удобно проверить, правильно ли сохранилась информация в базе данных. Поэтому многие тестировщики, даже не умея программировать, достаточно хорошо владеют языком запросов к базе данных SQL.Сначала мы научимся пользоваться технологией доступа к базам данных JDBC, которая позволяет выполнять привычные SQL-запросы и анализировать полученный ответ как таблицу. Затем мы освоим более современную технологию объектно-реляционных преобразований Java Persistence, позволяющую практически полностью забыть про язык запросов SQL, а вместо него использовать более высокоуровневый и не зависящий от конкретной базы данных язык запросов. Наконец, мы научимся пользоваться инструментами, которые позволяют сохранять и сравнивать снимки (снапшоты) базы данных.
9. Работа с почтой -- сервер James и клиент Java Mail.
10. Сетевое программирование -- HTTP, FTP и другие протоколы прикладного уровня.
Последние два занятия будут посвящены рассмотрению особенностей тестирования распределённых приложений и вопросам автоматизации интеграционного тестирования.Помимо того, что приложения читают и пишут файлы, а также работают с базами данных, они ещё и взаимодействуют между собой. Поэтому при тестировании постоянно приходится решать задачу создания такого окружения для тестируемого приложения, которое либо эмулирует поведение сторонних систем, либо содержит специальные тестовые версии таких систем. Двигаясь по первому пути мы приходим к необходимости разработки специальных приложений-эмуляторов. Второй путь ставит перед нами задачу разработки таких автоматизированных тестов, которые способны управлять не только тестируемым приложением, но и рядом вспомогательных систем.
Для веб-приложений характерным случаем является использование электронной почты -- отправка ссылки для подтверждения регистрации, восстановление пароля, оповещения о каких-либо событиях. Для тестирования такого рода функциональности мы научимся работать с почтовым сервером из автоматизированных тестов: принимать и отправлять почту, анализировать содержимое почтовых сообщений. Одновременно с этим будут рассмотрены шаблоны проектирования тестов для распределённых систем.
Мы научимся из автоматизированных тестов получать файлы с тестового стенда или загружать их туда по протоколу FTP, это позволит проверять функциональность загрузки файлов на сервер через веб-приложение. Мы научимся формировать и отправлять произвольные HTTP-запросы, а не только такие, которые можно отправить через браузер, это позволит разрабатывать тесты для проверки надёжности и устойчивости приложений. Выйдя за пределы автоматизации только через пользовательский интерфейс путём эмуляции действий пользователя в браузере, мы научимся создавать комплексные тесты, проверяющие интеграцию нескольких систем.
Ну и конечно же эти два последних занятия будут сопровождаться наиболее сложными самостоятельными заданиями, поэтому в конце тренинга мы будем больше внимания уделять уже не столько изучению нового материала, сколько повторению уже пройденного, закреплению приобретённых навыков, разбору типичных ошибок, улучшению стиля программирования.
Комментариев нет:
Отправить комментарий