Всем привет! Меня зовут Илья Любимов. Я 2,5 года работаю инженером по автоматизации тестирования. В современном мире невозможно представить разработку программного обеспечения без тестирования. Крупные компании вкладывают огромные деньги в отделы качества, так как у пользователей сложились определённые ожидания от готового продукта. И бизнес стремится удовлетворить их, стараясь заранее предупредить возможные ошибки в приложениях. В некоторых случаях команды разработки могут обойтись и ручным тестированием, однако в большинстве случаев необходимы автотесты.
Если вы решили стать автоматизатором, то встаёт резонный вопрос: «Какие знания необходимы на входе в автоматизированное тестирование?» На этот вопрос я постараюсь ответить в этой статье.
Курсы
Обучение начинается именно с теории — текстов и документации по основным фреймворкам и языкам программирования. Плюс теория по тестированию в принципе. Её можно найти на обучающих порталах, например:
- Coursera.org — наверное, самый популярный ресурс на планете для обучения и переквалификации. Можно даже получить магистерскую степень зарубежных вузов. Там вы точно найдёте материалы по автотестированию. Осторожно: много английского!
- Stepik.org — русскоязычный портал с различными курсами: просто, бесплатно и интересно.
Книги
«Тестирование dot com» Романа Савина — must-read для начинающих тестировщиков. Об этой книге и других ресурсах я подробно написал в этой статье.
Основные понятия
Также стоит иметь представление о пирамиде тестирования и разных типах тестирования — это есть в книге Романа Савина. Далее, что такое Agile и CI/CD — эти понятия часто идут рука об руку, поэтому советую поискать информацию о них в интернете. Для начала достаточно будет поверхностных знаний, глубина понимания придёт с опытом. Отдельно стоит посмотреть, что такое и как работают баг-трекинговые системы, и как вести документацию (об этом расскажу далее).
Языки программирования
Самые распространённые языки программирования (ЯП) для автотестировщика — Java, Python, C# и JavaScript. В целом вы можете обратиться к тем же обучающим порталам, которые я привёл выше, но есть один важный момент. Вам просто необходимы проекты на выбранном ЯП, которые вы можете приложить к своему резюме. А иначе как вы сможете доказать, что действительно знаете программирование?
Основы разработки ПО
Тут начинается всё самое сложное 😊 Базовые знания ООП, коллекций, типов данных, исключений, циклов, распространенных фреймворков и библиотек, Git. Разберёмся с некоторыми пунктами отдельно (здесь и далее я буду рассказывать на примере Java).
ООП
Java — объектно-ориентированный ЯП, а значит от основ ООП здесь никуда не деться. Для начала необходимо разобрать основные термины ООП: инкапсуляция, наследование, полиморфизм и абстракция.
Из статьи «Object-Oriented Design Principles»:
- Инкапсуляция — размещение одного объекта или класса внутри другого для разграничения доступа к ним.
- Наследование — способность объекта или класса базироваться на другом объекте или классе. Это главный механизм для повторного использования кода. Наследственное отношение классов чётко определяет их иерархию.
- Полиморфизм — реализация задач одной и той же идеи разными способами.
- Абстракция — отделение концепции от её экземпляра.
Вам нужно уметь объяснять своими словами эти термины и как они реализованы в ЯП.
Коллекции
Во-первых, необходимо знать иерархию коллекций, чем отличается List от Array, какие есть разновидности Map, их отличие, сложность операций. Во-вторых, что такое Set, HashSet, LinkedHashSet, TreeSet, какой принцип используется для хранения данных в коллекциях.
Так, Collection и Collections — разные понятия. Collection — корневой интерфейс коллекций, а вот Collections — класс, состоящий из методов, которые оперируют или возвращают коллекции.
Схемы классов Collection и классов Map:
На рисунках сплошными линиями представлены отношения Extends, а пунктиром — отношения Implements. Эти отношения важны и всю информацию о них вы найдёте в теории по Java.
Исключения
Как и в случае с коллекциями, вам необходимо знать иерархию исключений (Exceptions), чем отличается Exception от Error, что такое обрабатываемые и необрабатываемые исключения (Checked/Unchecked Exceptions) и несколько примеров к ним.
Если вкратце:
Корневой интерфейс — Throwable. У него есть два «наследника» — Error и Exception. Error — это критическая ошибка во время исполнения программы, связанная с работой виртуальной машины Java, поэтому мы не можем обрабатывать ошибки, на этом всё.
И если с Error можно вот так быстро закончить, то с Exception нет. Не все подклассы Exception обрабатываются (Checked). Так, класс RuntimeException — unchecked, значит, как бы мы ни старались, мы не сможем его обработать. Компилятор нам говорит, что в ходе компиляции ничего подозрительного не обнаружено (как правило мы доверяем компилятору), однако что-то пошло не так, и значит в коде есть ошибка. Примерами таких исключений: выход за границы массива и арифметические ошибки (деление на ноль).
Базовые знания по автоматизации тестирования
Теперь, когда мы разобрались с основами ЯП, можно поговорить про основные инструменты по автоматизации тестирования, которые мы используем в нашей работе каждый день.
Работа автоматизатора состоит из 3 направлений:
- User Interface — если мы работаем с веб-приложениями и сайтами, то нам нужен инструмент, позволяющий проверять и взаимодействовать с элементами страниц. В большинстве случаев мы используем Selenium.
- Базы данных (Data Bases, DB) — как правило, можно обойтись знаниями написания SQL-запросов, не привязываясь к определенной СУБД. В этом вам поможет Metanit. В разделе о SQL есть уроки, вы можете попрактиковаться самостоятельно.
- Backend — автотестировщики пишут запросы к бэкенду и проверяют приходящие данные, исключая отображение на веб-странице. Здесь нам помогает утилита для отправки запросов к бэкенду Postman. А также библиотека RestAssured — она позволяет в понятной читаемой форме отправлять запросы и сопоставлять ответы к соответствующим классам в нашем фреймворке.
А что же нам позволяет связать все эти аспекты работы автоматизатора воедино и писать полноценные production-ready фреймворки?
Это JUnit, TestNG и, конечно, Cucumber. Первые два — это библиотеки, они позволяют нам писать и подхватывать тесты из кода, структурируя их по разным группам. А благодаря Cucumber мы пишем фреймворки, используя подход BDD (Behavior Driven Development). Основная его идея — использовать такие словесные конструкции в наших тестах, что даже человек, ничего не понимающий в программировании, сможет прочитать и понять по шагам каждый реализованный тест. Для этого используется Gherkin Notation. Про Cucumber и Gherkin Notation можно почитать здесь и здесь.
Git, Jira, Unix
Теперь, разобрав необходимый минимум по ЯП и автотестам, стоит рассказать о смежных технологиях и инструментах разработки ПО:
- Git — система контроля версий, помогает отслеживать кто, когда и какие внёс изменения в проект. К тому же, позволяет «откатывать» изменения и работать в команде над одинаковым функционалом без необходимости синхронизации. Крайне важная и неотъемлемая часть работы любого программиста. Вам необходимо знать, как с ним работать. Вам сюда.
- Jira — незаменимый инструмент. Мой опыт подсказывает, что огромная часть компаний использует Jira для ведения задач и работы по Agile-методологии.
- Unix-системы — подавляющее большинство машин, на которых «крутится» бэкенд и проходит развёртка компонентов приложения, работает на дистрибутивах Unix-систем. Поэтому очень важно знать на базовом уровне, как работать с системой через терминал на удалённой машине путём SSH-подключения.
На мой взгляд, это необходимый минимум знаний, чтобы уверенно стартовать в профессии автотестировщика. Возможно, вы уже знали это и просто освежили в памяти. А кому-то действительно будет полезно это руководство, и вы с горящими глазами пойдёте изучать что-то новое и интересное. Потому что автоматизированное тестирование именно такое. Главное, не забывайте тестировать, тестировать и ещё раз тестировать!