Python Challenge, или Как я ознакомился с автоматизированным тестированием за месяц
Преамбула
Программирование я полюбил еще во время учебы в институте. Меня настолько увлекала эта сфера, что на старших курсах я разработал методичку и вел практические занятия по кластерным вычислениям в Харьковском национальном экономическом университете.
Сегодня у меня около пяти лет опыта в разработке. За это время освоил несколько технологий: был .NET специалистом, окунулся в веб-разработку на JS и даже успел немного разобраться в Markup. Осенью 2017 года мне сделали предложение, от которого я не мог отказаться: освоить Python и провести внутренний курс по автоматизированному тестированию для специалистов Dev-Pro. Овладеть новой технологией, а затем побывать в роли тренера? Challenge accepted!
Раньше мне не приходилось сталкиваться с Python, но я был мотивирован и полон энтузиазма! QA отдел составил мне программу изучения, основываясь на том, что необходимо изучить Manual QA Engineer для перехода в автоматизаторы. Это послужило мне своеобразной дорожной картой в личном обучении и в подготовке курса.
Как это было
Я разбирал каждую тему из моего списка, держа в уме будущий курс и акцентируя внимание на моментах, которые были мне самому непонятны. Факт того, что у меня не было опыта в Python, стал плюсом. Коллеги-эксперты в автоматизированном тестировании составили программу курса, а я смог разобрать язык так, чтобы объяснить его тем, кто с ним ранее не сталкивался вообще.
Параллельно я был Team Lead на корпоративном благотворительном проекте, где мы на Angular создавали сайт для приюта «Порятунок тварин Харків». Тогда мой типичный день выглядел примерно так: четыре часа я работаю с JS, два часа — изучаю Python, еще два — готовлю курс.
В итоге мы успешно запустили сайт, я освоил написание автотестов и создал программу внутреннего курса. Она состояла из 18 лекций: от синтаксиса и написания простых программ до парадигмы ООП в тестировании, плюс задания для самостоятельной работы.
Материалы и рекомендации
Для изучения тестирования на Python мне пригодились такие источники:
- официальная документация языка на python.org/doc/;
- видеоуроки на YouTube (например, каналы David Beazley, CS Dojo и Corey Schafer);
- портал «Записки программиста»;
- записи видео с конференций PyCon, Selenium Camp;
- ресурсы Codecademy, Codewars и StackOverflow.
Помимо этого мне помогли следующие факторы:
- Классическое техническое фундаментальное образование. Кроме навыка быстро и легко обучаться, оно дало мне еще и знание парадигмы ООП, и базовый курс QA. Это тот фундамент, на котором я построил новое знание.
- Технический бэкграунд. Опыт .NET и JS помог мне быстрее разобраться со структурой и синтаксисом нового языка.
- Четкая цель. Python очень объемен: он применяется и в Web-разработке, и в системном администрировании, и в научных исследованиях. Однако у меня не было задачи создать Огромного Человекоподобного Робота, мне нужно было автоматизированное тестирование.
- Мотивация — тоже важный элемент. Стать тренером и испытать себя в новой роли!
- Грамотный тайм-менеджмент. Мне необходимо было правильно распределить время между несколькими задачами, курировать команду разработчиков и при этом не забывать про учебу. Именно умение планировать помогло мне успеть все.
- Обязательства. Мне всегда нравилось преподавать, а тут мой курс ждали студенты, на меня рассчитывала компания — я просто не мог не справиться! Когда делаешь что-то для себя, всегда есть риск, что в какой-то моменты ты столкнешься с трудностями и махнешь рукой. Но когда на тебя рассчитывают другие люди, сдаваться нельзя!
Многие могут спросить: почему курс по QA Automation доверили девелоперу, а не тестировщику?
Что такое автоматизированное тестирование
Все начинается с написания простого скрипта. А чтобы написать скрипт, надо иметь навыки программиста. Зачастую специалисты, которые хотят стать автоматизаторами, пришли из ручного тестирования и никогда не занимались разработкой программного обеспечения. Моя задача как раз в том, чтобы научить их программировать и дать лучшие практики написания кода.
В моем понимании хороший код обладает такими характеристиками:
- Удобен для повторного использования.
- Написан с использованием принципов проектирования ПО.
- Имеет лаконичную и понятную структуру.
- Программная часть легко поддается расширению и изменениям.
Почему это важно? Потому же, почему код должен быть качественный, а не состоять из костылей: автотест, написанный по принципам выше, будет проще в использовании, его можно будет менять и масштабировать под нужды проекта.
Если брать шире, то следование этим практикам позволяет проекту жить, а не утонуть в плохом коде, специалист, зайдя в проект через пару месяцев, не поседеет от ужаса, а новичок сможет быстро разобраться что к чему.
Этапы обучения
Теперь у меня уже есть опыт проведения как курсов для новичков в программировании, то есть QA-специалистов, которые занимаются ручным тестированием, так и более опытных в автоматизации ребят, проявивших желание изучить именно Python. Если мы говорим о первом курсе из 18 лекций, то он был рассчитан на тех, кто не написал ни строчки кода в своей жизни. Именно поэтому я могу условно разбить занятия на три модуля:
1. Знакомство с программированием, точнее — языком Python. Здесь мы говорим о базовых концепциях. Узнаем, как организовывать данные, об условных операторах и циклах, функциях и параметрах, коллбэках, модулях, системе импорта в Python.
Зачем тестировщикам эти знания? Без них хороший код, который требуется — не написать. Они буквально не смогут перейти на этап создания автотестов без умения оперировать фундаментальными понятиями. Для меня сложность в подготовке этого модуля состояла в том, что я должен был досконально изучить все детали, разобраться, как работает язык, чтобы отвечать на все вопросы моих учеников. Например, почему в документации написано одно, а работает по-другому. Недостаточно просто принять эту данность, но нужно раскопать истинную причину. И так с каждой деталью.
2. Подробно мы поговорим о втором модуле — про более углубленное изучение языка. Эти знания нужны, дабы мы могли полноценно использовать все возможности Python при написании тестов. О каждом элементе расскажу детальнее, чтобы возьмись вы изучать автоматизацию на этом языке — сразу обратили внимание на важные аспекты и не распылялись.
2.1. Collections. Basic Algorithms — во время написания программ всегда приходится работать с данными. Чем более удобно они представлены, тем нам легче с ними оперировать. У Python много интересных фишек и дополнительных возможностей, которые значительно упрощают работу с данными. Одна из них — специализированные структуры данных. QA-специалисты наверняка столкнутся с этим.
2.2. Iterators. Generators. Decorators. Когда пишешь свой скрипт, обязательно работаешь с итерированием коллекций и генерацией данных. Интеграторы и генераторы помогают справиться с различными сложными ситуациями, связанными с этим аспектом, например, именно генераторы позволяют не сразу считывать весь файл в память (так как он может быть очень большим), а построчно — облегчая процесс. Декораторы же в свою очередь позволяют нам добавить какую-нибудь функциональность к уже имеющейся, порой это очень удобно, принести домой ёлку, декорировать её новогодними игрушками и получить новогоднюю ёлку.
2.3. Exception handling. Operations with files. Почти в любом программе могут возникать исключительные ситуации, их нужно уметь обрабатывать, этому мы и учимся! Кроме того, не обойтись без знания, как открыть и прочитать файлы.
2.4. OOP and Python. Есть два подхода к написанию тестов: функциональный, сторонником которого я не являюсь, и стиль ООП. Второй метод мне больше по душе, потому что позволяет делать все более организованно. Более того, эти знания точно пригодятся при написании тестового фреймворка. Плюс, у Python есть свои особенности касательно ООП, с которыми обязательно нужно знакомиться, даже если вы разбираетесь в этой теме в рамках других языков.
2.5. MetaClasses. ContextManager. Эта возможность Python позволяет на лету генерировать тестовые методы. То есть вам не понадобится плодить десятки подобных тестов-методов, вместо этого их можно генерировать. Это возможно благодаря мета-программированию в Python. ContextManager — фишка, которая не даст вашему коду заблокировать какой-либо ресурс: проследит, что открытый файл или открытый connection к базе данных был закрыт после завершения программы.
2.6. Design patterns. На занятиях, посвященных этой теме, мы изучаем лучшие практики, выясняем, как решать типичные проблемы, с которыми сталкиваются как автоматизаторы, так и рядовые разработчики.
3. В рамках третьего модуля мы переходим непосредственно к созданию автотестов. Темы, о которых я говорю, это: Functional testing, Integration testing, Unit testing, API architecture approaches, Load testing, Acceptance testing, Selenium, OOP in tests Selenium, OOP in tests. Page Object Pattern — это темы для отдельного материала!
Для более опытных специалистов я сразу начинаю курс со второго модуля.
Выводы
Итак, подведем итог. С чего стоит начать QA-специалисту, который решил освоить автоматизированное тестирование без какого-либо опыта в этом вопросе?
С азов! Особенно рекомендую ресурсы типа Code School и Code Academy, о которых уже писал выше. Составил небольшой список, который рекомендую своим студентам перед курсом:
Разумеется, необходим хороший уровень английского и опыт в тестировании. Но, как я убедился на собственном примере, автоматизированное тестирование на Python реально освоить за месяц, если вам уже знаком другой язык программирования, даже совмещая с занятостью на другом проекте!