Автоматизированный метод тестирования


Автоматизированное тестирование предполагает использование специального программного обеспечения (помимо тестируемого) для контроля выполнения тестов и сравнения ожидаемого фактического результата работы программы. Этот тип тестирования помогает автоматизировать часто повторяющиеся, но необходимые для максимизации тестового покрытия задачи.

Некоторые задачи тестирования, такие как низкоуровневое регрессионное тестирование, могут быть трудозатратными и требующими много времени если выполнять их вручную. Кроме того, мануальное тестирование может недостаточно эффективно находить некоторые классы ошибок. В таких случаях автоматизация может помочь сэкономить время и усилия проектной команды.

После создания автоматизированных тестов, их можно в любой момент запустить снова, причем запускаются и выполняются они быстро и точно. Таким образом, если есть необходимость частого повторного прогона тестов, значение автоматизации для упрощения сопровождения проекта и снижения его стоимости трудно переоценить. Ведь даже минимальные патчи и изменения кода могут стать причиной появления новых багов.

Существует несколько основных видов автоматизированного тестирования:


1.автоматизация тестирования кода (Code-driven testing) – тестирование на уровне программных модулей, классов и библиотек (фактически, автоматические юнит-тесты)

2.автоматизация тестирования графического пользовательского интерфейса (Graphical user interface testing) – специальная программа (фреймворк автоматизации тестирования) позволяет генерировать 3.пользовательские события – нажатия клавиш, клики мышкой, и отслеживать реакцию программы на эти действия – соответствует ли она спецификации

4.автоматизация тестирования API (ApplicationProgrammingInterface) – программного интерфейса программы. Тестируются интерфейсы, предназначенные для взаимодействия, например, с другими программами или с пользователем. Здесь опять же, как правило, используются специальные фреймворки


Для составления автоматизированных тестов, QA-специалист должен уметь программировать. Автоматические тесты – это полноценные программы, просто предназначенные для тестирования.

Когда, что и как автоматизировать и автоматизировать ли вообще – очень важные вопросы, ответы на которые должна дать команда разработки. Выбор правильных элементов программы для автоматизации в большой степени будет определять успех автоматизации тестирования в принципе. Нужно избегать автоматизации тестирования участков кода, которые могут часто меняться.



Selenium Locators


При работе с Селениумом практически первое, с чем придется столкнуться - это локаторы. Что это такое? Локатор - это строка, уникально идентифицирующая UI-элемент. Когда вы делаете клик мышкой, ввод текста и прочие действия, вы эти действия выполняете над вполне конкретным объектом. Селениум поступает так же. Но поскольку он не умеет читать ваши мысли, то ему надо четко указать объект, для которого надо применить то или иное действие.

Где локаторы используются? Посмотрите на методы, отвечающие за ввод/извлечение данных из элементов управления (это методы click, type, select, isElementPresent, keyPress и т.п.). Первым параметром подобных методов всегда идет локатор.

Итак, какие виды локаторов бывают:


1.id=<element_id> - соответствует элементу, у которого атрибут id равен значению element_id. Например, у нас есть элемент, который в HTML записывается так:<input type=text id='some_input_id' name='some_input_name' value='' /> В этом случае локатор будет иметь вид: id=some_input_id.Также следует отметить, что данный вид локаторов является одним из самых быстрых в нахождении и одним из самых уникальных. Это связано с тем, что в DOM-структуре ссылки на элементы, у которых задан ID, хранятся в отдельной таблице и через JScript (собственно именно через него осуществляется доступ к элементам на конечном уровне) обращение к элементам по ID идет достаточно короткой инструкцией, наподобие some_input_id.

2.name=<element_name> - соответствует элементу, у которого атрибут name равен значению element_name. Эффективно применяется при работе с полями ввода формы (кнопки, текстовые поля, выпадающие списки). Как правило, значения элементов формы используются в запросах, которые идут на сервер и как раз атрибут name в этих запросах ставит в соответствие поле и его значение. Если брать предыдущий пример:<input type=text id='some_input_id' name='some_input_name' value='' /> то данный элемент может быть также идентифицирован локатором вида name=some_input_name.Данный тип локаторов тоже является достаточно быстрым в нахождении, но менее уникальным, так как на странице может быть несколько форм, у которых могут быть элементы с одинаковым именем.

3.dom=<dom_object> - данный тип локатора позволяет обращаться к элементу так же, как и в DHTML используя DOM-структуру. Данный тип локатора используется нечасто, так как обычно находятся более удобные аналоги, но тем не менее данная возможность есть.

4.link=<link_text> - специально для ссылок используется отдельно зарезервированный тип локаторов, который находит нужную ссылку по ее тексту. Это сделано отчасти потому, что ссылки как правило не имеют таких атрибутов как ID или name. Соответственно, ссылка, которая в HTML записывается так:<a href='http://some_url'>Link Text 2345</a>в Селениуме идентифицируется локатором link=Link Text 2345.И небольшой частный случай: у ссылки есть фиксированная часть и есть часть, которая может варьироваться. Допустим, в предыдущем примере у нас число может варьироваться. В этом случае мы можем использовать wildcards, в частности '*'. В этом случае, мы можем идентифицировать ссылку локатором вида: link=Link Text* и данный локатор будет соответствовать первой ссылке, текст которой будет начинаться с 'Link Text'.

5.xpath=<xpath_locator> - наиболее универсальный тип локаторов. Как XPath формируется. HTML, как и его более обобщенная форма - XML, представляет собой различное сочетание тегов, которые могут содержать вложенные теги, а те в свою очередь тоже могут содержать теги и т.д. То есть ,выстраивается определенная иерархия, наподобие структуры каталогов в файловой системе. И задача XPath - отразить подобный путь к нужному элементу, с учетом иерархии. Например, XPath вида:A/B/C/D указывает на некоторый элемент с тегом D, который находится внутри тега C, а тот в свою очередь - внутри тега B, который находится внутри тега A, который находится на самом верхнем уровне иерархии.Если брать использование XPath в Селениуме, то там зачастую полный путь указывать не нужно, более того, вредно, особенно, если вложенность тега нужного елемента достаточно высока. Как правило, удобно указывать путь, начиная с некоторого промежуточного элемента, пропуская теги более высокого порядка. Например, такой XPath: //table/tbody/tr/td/a ссылается на первую ссылку в первой строке тела первой таблицы. Обратите внимание на начало данной записи. Строка '//' означает, что поиск элемента начинается с некоторого произвольного места.У XPath есть много удобств, но есть и основной недостаток - низкая скорость нахождения объекта. В частности, с подобной проблемой можно столкнуться при работе с IE, так как при работе с XPath под IE используются JScript-библиотеки, которые не отличаются высокой скоростью выполнения. В таких случаях рекомендуется воспользоваться CSS-локаторами (см. ниже), но в некоторых случаях от XPath уйти не получится.

css=<css_path> - данный тип локаторов основан на описаниях таблиц стилей (CSS), соответственно и синтаксис такой же. В отличие от локаторов по ID, по имени или по тексту ссылки, данный тип локаторов может учитывать иерархию объектов, а также значения атрибутов, что делает его ближайшим аналогом XPath. А в силу того, что объект находится по данному локатору быстрее, чем XPath, рекомендуется прибегать к помощи CSS вместо XPath.



Это основные типы локаторов. Если этого недостаточно, то можно добавить свою стратегию идетнификации элементов, но это отдельная тема. Единственное, что осталось отметить - это тип локаторов, который определяется по умолчанию. В частности, если мы используем локатор, в котором явно не указан тип локатора (отсутствует префикс id=, name=, link=, xpath=, css= и т.п.), то по умолчанию подбирается локатор по следующим правилам:


1.Если локатор начинается с '//', то используется XPath.

2.Если нет какого-либо префикса, то элемент ищется по ID

3Если элемент с заданным ID отсутствует, то элемент ищется по атрибуту name.


Тестирование API


Тестирование API проводят, основываясь на бизнес-логике программного продукта. Тестирование API относится к интеграционному тестированию, а значит в ходе него можно отловить ошибки взаимодействия между модулями системы или между системами. Для тестирования используют специальные инструменты, где можно отправить входные данные в запросе и проверить точность выходных данных. Одним из таких инструментов как раз и является Postman. Вот что он умеет:


1.Составлять и отправлять запросы;

2.Сохранять запросы в папки и коллекции;

3.Параметризовать запросы;

4.Добавлять к вызову API контрольные точки;

5.Создавать разные окружения для одних и тех же запросов;

6.Запускать коллекции с помощью Collection Runner и использовать их как автоматизированные тесты.



Jenkins


Jenkins система с открытым исходным кодом, то есть продукт доступен для просмотра, изучения и изменения. Кстати создан на базе Java. Дженкинс позволяет автоматизировать часть процесса разработки программного обеспечения, без участия человека. Данная система предназначена для обеспечения процесса непрерывной интеграции программного обеспечения. Воу воу.

Непрерывная интеграция (Continuous Integration, CI) это процесс разработки программного обеспечения, смысл которого заключается в постоянном соединении рабочих копий в общую линию разработки, и выполнении постоянных автоматизированных сборок проекта для быстрого выявления возможных ошибок и решения интеграционных проблем. Вот такой конвеер.
Иными словами, это создание нескольких драфтовых версий (черновиков) проекта, то есть копий, в предварительной сборке проекта.
В настоящий момент Jenkins используется практически в любой современной компании, где есть необходимость в автоматическом деплойменте (развертывании) приложений, а также в удобном управлении различного рода задач.
Для начала разберемся, что такое деплой вообще. С английского "deploy" переводится как "развертывание". И это целый процесс действий, которые делают программный продукт готовым к использованию:


1.выпуск;

2.установка;

3.активация;

4.адаптация;

5.обновление;

6.исправление ошибок и другие.


Автоматический деплой это развертывание при помощи автоматизированных решений.
Многие пользователи скажут: "Зачем нужен Jenkins, когда есть Buildbot?". У нас есть ответочка.
Основные плюсы и отличия Jenkins в том, что разобраться с ним может обычный, рядовой программист, либо менеджер не имеющий опыта в управлении. И сделает он это за короткий срок.
Конечно настроить программное обеспечение можно и в Buildbot, но для дальнейшей работы в нём необходим специально обученный человек, что не очень удобно.
При возникновении, или обнаружении, какой-либо нестандартной ошибки, Jenkins устранит эту проблему при помощи дополнительных плагинов, без привлечения помощи человека. Jenkins является бесплатным инструментом, обладающим огромными возможностями в виде тысяч плагинов, которые постоянно добавляются и обновляются.


Плагин это программный блок, который встраивается в программу и расширяет ее возможности, а так как у Jenkins очень много всевозможных плагинов, возможности такого автоматического деплоя не ограничены.
Jenkins это стандартизированная программа, осилить которую может даже специалист с небольшим бэкграундом (опытом) в IT, всего за несколько часов.

Стоит отметить основные преимущества Jenkins:


1.режим работы сразу в двух и более средах;

2.повышенная надежность развертываемого программного обеспечения;

3.уменьшение ошибок, связанных с человеческим фактором;

4.уменьшение затрат на персонал. Пока – пока операционка и косты;

5.упрощение рабочего процесса (нет необходимости нанимать дорогостоящую команду опытных специалистов, с Jenkins справится небольшая группа сотрудников без специальной квалификации).



Docker


Docker (Докер) — программное обеспечение с открытым исходным кодом, применяемое для разработки, тестирования, доставки и запуска веб-приложений в средах с поддержкой контейнеризации. Он нужен для более эффективного использование системы и ресурсов, быстрого развертывания готовых программных продуктов, а также для их масштабирования и переноса в другие среды с гарантированным сохранением стабильной работы.

Разработка Docker была начата в 2008 году, а в 2013 году он был опубликован как свободно распространяемое ПО под лицензией Apache 2.0. В качестве тестового приложения Docker был включен в дистрибутив Red Hat Enterprise Linux 6.5. В 2017 году была выпущена коммерческая версия Docker с расширенными возможностями.

Docker работает в Linux, ядро которых поддерживает cgroups, а также изоляцию пространства имен. Для инсталляции и использования на платформах, отличных от Linux, существуют специальные утилиты Kitematic или Docker Machine.

Основной принцип работы Docker — контейнеризация приложений. Этот тип виртуализации позволяет упаковывать программное обеспечение по изолированным средам — контейнерам. Каждый из этих виртуальных блоков содержит все нужные элементы для работы приложения. Это дает возможность одновременного запуска большого количества контейнеров на одном хосте.


Docker-контейнеры работают в разных средах: локальном центре обработки информации, облаке, персональных компьютерах и т. д.


Преимущества использования Docker:


1.Минимальное потребление ресурсов — контейнеры не виртуализируют всю операционную систему (ОС), а используют ядро хоста и изолируют программу на уровне процесса. Последний потребляет намного меньше ресурсов локального компьютера, чем виртуальная машина.

2.Скоростное развертывание — вспомогательные компоненты можно не устанавливать, а использовать уже готовые docker-образы (шаблоны). Например, не имеет смысла постоянно устанавливать и настраивать 3.Linux Ubuntu. Достаточно 1 раз ее инсталлировать, создать образ и постоянно использовать, лишь обновляя версию при необходимости.

4.Удобное скрытие процессов — для каждого контейнера можно использовать разные методы обработки данных, скрывая фоновые процессы.

5.Работа с небезопасным кодом — технология изоляции контейнеров позволяет запускать любой код без вреда для ОС.

6.Простое масштабирование — любой проект можно расширить, внедрив новые контейнеры.

7.Удобный запуск — приложение, находящееся внутри контейнера, можно запустить на любом docker-хосте.

8.Оптимизация файловой системы — образ состоит из слоев, которые позволяют очень эффективно использовать файловую систему.


Компоненты Docker

Для начинающих разработчиков необходимо знать как работает Docker, его основные компоненты и связь между ними.


1.Docker-демон (Docker-daemon) — сервер контейнеров, входящий в состав программных средств Docker. Демон управляет Docker-объектами (сети, хранилища, образы и контейнеры). Демон также может связываться с другими демонами для управления сервисами Docker.

2.Docker-клиент (Docker-client / CLI) — интерфейс взаимодействия пользователя с Docker-демоном. Клиент и Демон — важнейшие компоненты «движка» Докера (Docker Engine). Клиент Docker может взаимодействовать с несколькими демонами.

3.Docker-образ (Docker-image) — файл, включающий зависимости, сведения, конфигурацию для дальнейшего развертывания и инициализации контейнера.

4.Docker-файл (Docker-file) — описание правил по сборке образа, в котором первая строка указывает на базовый образ. Последующие команды выполняют копирование файлов и установку программ для создания определенной среды для разработки.

5.Docker-контейнер (Docker-container) — это легкий, автономный исполняемый пакет программного обеспечения, который включает в себя все необходимое для запуска приложения: код, среду выполнения, системные инструменты, системные библиотеки и настройки.

6.Том (Volume) — эмуляция файловой системы для осуществления операций чтения и записи. Она создается автоматически с контейнером, поскольку некоторые приложения осуществляют сохранение данных.

7.Реестр (Docker-registry) — зарезервированный сервер, используемый для хранения docker-образов. Примеры реестров:


1.Центр Docker — реестр, используемый для загрузки docker-image. Он обеспечивает их размещение и интеграцию с GitHub и Bitbucket.

2.Контейнеры Azure — предназначен для работы с образами и их компонентами в директории Azure (Azure Active Directory).

3.Доверенный реестр Docker или DTR — служба docker-реестра для инсталляции на локальном компьютере или сети компании.


1.Docker-хаб (Docker-hub) или хранилище данных — репозиторий, предназначенный для хранения образов с различным программным обеспечением. Наличие готовых элементов влияет на скорость разработки.

2.Docker-хост (Docker-host) — машинная среда для запуска контейнеров с программным обеспечением.

3.Docker-сети (Docker-networks) — применяются для организации сетевого интерфейса между приложениями, развернутыми в контейнерах.


Что такое Docker Engine

Docker Engine («Движок» Docker) — ядро механизма Докера. «Движок» отвечает за функционирование и обеспечение связи между основными Docker-объектами (реестром, образами и контейнерами).


Элементы Docker Engine


1.Сервер выполняет инициализацию демона (фоновой программы), который применяется для управления и модификации контейнеров, образов и томов.

2.REST API — механизм, отвечающий за организацию взаимодействия Докер-клиента и Докер-демона.

3.Клиент — позволяет пользователю взаимодействовать с сервером при помощи команд, набираемых в интерфейсе (CLI).


Как работает Docker

Работа Docker основана на принципах клиент-серверной архитектуры, которая основана на взаимодействии клиента с веб-сервером (хостом). Первый отправляет запросы на получение данных, а второй их предоставляет.

Схема работы


1.Пользователь отдает команду с помощью клиентского интерфейса Docker-демону, развернутому на Docker-хосте. Например, скачать готовый образ из реестра (хранилища Docker-образов) с помощью команды docker pull. Взаимодействие между клиентом и демоном обеспечивает REST API. Демон может использовать публичный (Docker Hub) или частный реестры.

2.Исходя из команды, заданной клиентом, демон выполняет различные операции с образами на основе инструкций, прописанных в файле Dockerfile. Например, производит их автоматическую сборку с помощью команды docker build.
3.Работа образа в контейнере. Например, запуск docker-image, посредством команды docker run или удаление контейнера через команду docker kill.


Как работают образы

Docker-image — шаблон только для чтения (read-only) с набором некоторых инструкций, предназначенных для создания контейнера. Он состоит из слоев, которые Docker комбинирует в один образ при помощи вспомогательной файловой системы UnionFS. Так решается проблема нерационального использования дисковой памяти. Параметры образа определяются в Docker-file.
Для многократного применения Docker-image следует пользоваться реестром образов или Докер-реестром (Docker-registry), позволяющим закачивать готовые образы с внешнего репозитория сервиса и хранить их в реестре Докер-хоста. Рекомендуемый вариант — официальный реестр компании Docker Trusted Registry (DTR).
Если требуется файл, то скачиваться будут только нужные слои. Например, разработчик решил доработать программное обеспечение и модифицировать образ, изменив несколько файлов. После загрузки на сервер будут отправлены слои, содержащие только модифицированные данные.


Как работают контейнеры

Каждый контейнер строится на основе Docker-образов. Контейнеры запускаются напрямую из ядра операционной системы Linux. Благодаря этому, они потребляют гораздо меньше ресурсов, чем при аппаратной виртуализации.
Изоляция рабочей среды осуществляется при помощи технологии namespace. Для каждого изолированного пространства (контейнера) создается уникальное пространство имен, которое и обеспечивает к нему доступ. Любой процесс, выполняемый внутри контейнера, ограничивается namespace.
В ОС Linux посредством Docker Engine используется немного другая технология — контрольные группы (cgroups). При этом приложение ограничивается некоторым набором ресурсов. Сgroups осуществляют обмен доступных аппаратных ресурсов с контейнерами, на которые дополнительно устанавливаются необходимые ограничения (использование памяти, прав доступа к другому ресурсу и т. д.).
Движок Docker объединяет пространство имен (namespace), контрольные группы (cgroups) и файловую систему (UnionFS) в формат контейнера. В будущем планируется поддержка других форматов посредством интеграции технологий BSD Jails или Solaris Zones.



Что происходит при запуске контейнера



1.Происходит запуск образа (Docker-image). Docker Engine проверяет существование образа. Если образ уже существует локально, Docker использует его для нового контейнера. При его отсутствии выполняется скачивание с Docker Hub.

2.Создание контейнера из образа.

3.Разметка файловой системы и добавление слоя для записи.

4.Создание сетевого интерфейса.

5.Поиск и присвоение IP-адреса.

6.Запуск указанного процесса.

7.Захват ввода/вывода приложения.


Docker Compose

Для управления несколькими контейнерами, из которых состоит проект, используют пакетный менеджер — Docker Compose.
Он применяется не во всех случаях. Если проект является простым приложением, не требующим использования сторонних сервисов, то для его развертывания можно ограничиться только Docker. Docker Compose рекомендуется использовать при проектировании сложных программных продуктов, включающих в себя множество процессов и сервисов.

Docker Swarm

При преобразовании хостов в кластер нужно воспользоваться утилитой кластеризации Docker Swarm. Хост, находящийся в его составе, называется «узлом» (node), который бывает управляющим или рабочим. Один кластер содержит только один управляющий «узел».

Некоторые возможности утилиты:


1.Управление нагрузочными характеристиками — осуществляется оптимизация рассылки запросов между хостами, обеспечивая на них равномерную нагрузку.

2.Динамическое управление — допускается добавление элементов в swarm-кластер без дальнейшего его перезапуска.

3.Возможность масштабирования — позволяет добавлять или удалять docker-образ для автоматического создания контейнера.

4.Восстановление «узла» после сбоя — работоспособность каждого хоста постоянно контролируется управляющим «узлом». При сбое кластера происходит его восстановление и перезапуск.

5.Rolling-update — выполняет обновление контейнеров. Процедура может выполняться в определенной последовательности и с временной задержкой для запуска другого контейнера. Параметр указывается в настройках. Если произойдет сбой обновления, то Docker Swarm выдаст ошибку и процесс повторится заново.



Примеры применения

Окружение для разработки Docker применяется во множестве сфер — от обработки больших массивов данных, до работы с микросервисами, основанных на распределенной архитектуре.
Чтобы понять, как можно применять Докер на практике, разберем основные примеры использования для чайников.


1.Быстрая доставка приложений (команды docker pull и docker push) позволяет организовать коллективную работу над проектом. Разработчики могут работать удаленно на локальных компьютерах и выполнять пересылку фрагментов кода в контейнер для тестов.

2.Развертывание и масштабирование — контейнеры работоспособны на локальных компьютерах, серверах, в облачных онлайн-сервисах. Их можно загружать на хостинг для дальнейшего тестирования, создавать (docker run), останавливать (docker stop), запускать (docker start), приостанавливать и возобновлять (docker pause и docker unpause соответственно).

3.Множественные нагрузки — осуществление запуска большого количества контейнеров на одном и том же оборудовании, поскольку Docker занимает небольшой объем дисковой памяти.

4.Диспетчер процессов — возможность мониторинга процессов в Docker посредством команд docker ps и docker top, имеющими схожий синтаксис с Linux.

5.Удобный поиск — в реестрах Docker он осуществляется очень просто. Для этого следует использовать команду docker search.



Заключение

Docker является важным инструментом для каждого современного разработчика, как основа аппаратной виртуализации приложений. Эта технология обладает широким функционалом и возможностями для контроля процессов. Докер позволяет не только развертывать контейнеры, но и оперативно масштабировать их экземпляры, работать с многоконтейнерными приложениями (Docker Compose), а также объединять несколько Докер-хостов в единый кластер (Docker Swarm).





Полезные ссылки:

Automation testing article/eng

Selenium as an automation testing tool article/eng

Selenium locators article/eng

Docker article/eng

API testing article/eng

Jenkins article/eng

Automation testing video tutorial/eng

Automation testing video tutorial/arm

Locators in Selenuim video tutorial/eng

Xpath in Selenium video tutorial/eng

Jenkins video tutorial/eng

Docker video tutorial/eng

Содержание