Документация

Для начала необходимо ознакомиться с документацией по началу работы с Origami Framework

Origami Core

Подключение

Подключается автоматически при добавлении parent в pom проекта.

Аннотации

Чтобы тесты в Test IT и Allure отчетах отображались с указанными шагами, описанием и заголовками необходимо использовать универсальные аннотации (замена Allure и Test IT аннотаций)

Аннотации класса

                      
                      

@Epic, @Feature - стандартные Allure аннотации, в Test IT не используются. @Story - заменяет Allure аннотацию @Story. В Test IT не было аналога, используется в качестве значения пакета для тестовых классов. @DisplayName - заменяет Allure аннотацию @DisplayName. Заменяет Test IT аннотации - @DisplayName, @Title. @Link - заменяет Allure аннотацию @Link. Заменяет Test IT аннотацию - @Link. Для @Link можно выбрать тип ссылки отдельно для Allure(allureType) и отдельно для Test IT(testItType).

Аннотации теста

Тест

                      
                      

@DisplayName - заменяет Allure аннотацию @DisplayName. Заменяет Test IT аннотации - @DisplayName, @Title. @Description - заменяет Allure аннотацию @Description. Заменяет Test IT аннотацию - @Description. @WorkItemIds - стандартная Test IT аннотация, не используется в Allure. Указывается id теста (или id нескольких тестов - @WorkItemIds({"270492", "270493"})), который необходимо пометить как автоматизированный.

Параметризованный тест

                      
                      

Для параметризованного теста так же можно указать @DisplayName - будет влиять только на отображение названия группы тестов в IDE. Значение для теста в Test IT берется из @ParameterizedTest + параметризованные данные.

Шаг

                      
                      

@Step - заменяет Allure аннотацию @Step. Заменяет Test IT аннотации - @Step, @Title.

Аннотации предусловий/постусловий

                      
                      

Ранее в Allure для методов предусловий/постусловий бралось название на англ из метода. Теперь при указании данной аннотации будет взято ее значение.

Добавление описания в Test IT для вложений

В Allure при добавлении аннотации @Attachment к шагу будет добавлено вложение(например: sql запрос, сообщение в очередь и тд.). Для Test IT реализована аналогичная возможность добавления данных вложений к шагам. Вложения будут добавлены в виде Описания к шагу при условии, что у шага отсутствует свое описание(@Description).
К методу необходимо добавить аннотацию @Step со значением TEST_IT_ATTACHMENT_TECH_STEP_VALUE. С данным значением новый шаг не будет создан ни в Allure, ни в Test IT. А описание будет прикреплено к шагу в Test IT, который создавался до вызова данного метода. Так же необходимо добавить аннотацию @Description, которая будет содержать описание, которое будет прикреплено к шагу.

                      
                      

Task

Позволяет выполнить задачу, которая возвращает результат из отдельного потока. Может вызвать исключение.

Для использования необходимо: 1. Унаследоваться от класса Task 2. Переопределить конструктор с вызовом конструктора родителя

                      
                      

3. Реализовать необходимые для задачи методы - с возвращаемым результатом или без 4. В тестовом методе создать новый объект, где в сигнатуре конструктора: - первый параметр methodName - название метода для запуска в отдельном потоке - последующие параметры (могут быть/могут не быть) - входящие параметры для указанного метода Очередность параметров должна строго соответствовать очередности метода. 5. Вызвать у объекта submit() для запуска задачи в отдельном потоке 6. Вызвать один из нижеперечисленных методов: - get() / get(long timeout, TimeUnit unit) - при необходимости ожидает завершения задачи, а затем извлекает результат - cancel(boolean mayInterruptIfRunning) - пытается завершить выполнение текущей задачи - isCancelled() - возвращает true, если эта задача была отменена до ее завершения - isDone() - возвращает true, если эта задача завершена

Пример

Реализация класса с методами, которые будут выполняться в отдельных потоках

                      
                      

Использование вышеприведенных методов в шаге теста

                      
                      

Asserts

Asserts включает в себя необходимые проверки для использования в тестах.

Environment

Environment необходим для работы с параметрами. Вычитывает параметры из origami.properties, из /config/{stand}.json, где stand - системное свойство (CI/CD переменная: STAND). Так же вычитывает параметры из statics/routs.json и statics/any.json (необязательные). Существует возможность указать пользовательские файлы конфигураций. Для этого в origami.properties необходимо указать пути до таких файлов. Название параметра должно начинаться с custom.properties.file.path Если какие-либо параметры определены и в пользовательском файле и в файле stand, то возьмется значение из stand файла.

                      
                      

Существует возможность задать глобальный системный параметр для ssl.trust.store. Для этого необходимо в origami.properties указать путь и пароль от сертификата. Возможно указать как полный путь от корня проекта, так и путь конкретно в resources. В примере приведены оба варианта.

                      
                      

Данные параметры можно переопределить в CI/CD - GLOBAL_SSL_TRUST_STORE_LOCATION и GLOBAL_SSL_TRUST_STORE_PASSWORD соответственно.

Существует возможность глобально отключить проверку сертификатов для всех HTTPS-соединений

                      
                      

Данный параметр можно переопределить в CI/CD - DISABLE_SSL_VERIFICATION.

Методы

Получение значения параметра по ключу

                      
                      

Получение значения параметра по ключу или вернется null при отсутствии значения

                      
                      

Параметры из origami.properties будут добавлены в системные параметры.

OrigamiHelper

OrigamiHelper содержит общие методы, такие как ожидания, работа с xml/json и тд.

Allure

Чтобы задать шаблон URL для ссылок типа issue, необязательно создавать отдельный файл allure.properties и в нем прописывать значение параметра. В origami.properties можно задать аналогичный параметр allure.link.issue.pattern. Для генерации отчета в один html файл необходимо запустить mvn allure:report. Сгенерированный файл появится по пути /target/site/allure-maven-plugin/index.html Для генерации excel отчета на основе allure необходимо выполнить команду mvn exec:java@allure-excel. Сгенерированный файл появится по пути /target/allure-report_dd_MM_yyyy.xlsx

CartesianSource

Декартово произведение параметров позволяет прогонять тест с каждой возможной комбинацией входных данных из разных источников. Необходим для проверки поведения на всех сочетаниях различных параметров. Может использовать в качестве списков такие значения как Enum, ints, csv, и прочие.

@CartesianSource

Для использования необходимо на тестовый метод навесить аннотацию @CartesianSource, в которой:       • value - список CartesianValue[]       • exclude - список правил для исключения. Каждое правило — это И-условие с запятыми: "number=2, letter=B" (OR между строками массива). Можно ссылаться по имени оси (CartesianValue.name) или по индексу: "0=2"       • filters - cложные фильтры — класс(ы), реализующие CartesianFilter

@CartesianValue

Множество для проверки на сочетание различных параметров.       • name - имя множества(необязательно)       • displayFormat - "{name}={value}" если name задан, иначе просто "{value}"       • columns - названия значений по порядку. Должно совпадать с количеством значений в списке       • может быть одним из типов:           - enumSource           - ints           - longs           - doubles           - floats           - shorts           - bytes           - chars           - bools           - strings       • csv - строка в виде CSV           - csvDelimiter: по умолчанию ','           - csvQuote: по умолчанию '"'           - csvTrim: по умолчанию 'true'       • field - название поля для использования в перечислении       • method - аналог @MethodSource в Junit. Может принимать как Stream<Arguments>, так и например Stream<String>

@CartesianFilter

Сложные фильтры — класс(ы), реализующие @CartesianFilter. Пример реализации:

                      
                      

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

                      
                      
                      
                      
                      
                      

Origami Archetype

Origami Archetype поможет при создании нового проекта из готового шаблона.

Инициализация репозитория

Создаем репозиторий(например, на github), клонируем проект на локальную машину(git clone), создаем необходимую ветку

Тестовый проект

Создание проекта

В консоли IDE или в консоли ubuntu переходим на уровень выше того каталога, где был инициализирован репозиторий и выполняем команду maven:

                      
                      

Дальнейшие действия

В resources/origami.properties необходимо указать актуальные значения для свойств testit(при необходимости). В pom.xml изменить описание проекта на актуальное. Коммитим и пушим сформировавшиеся файлы.

Ошибки

При возникновении ошибки:

                      
                      

Необходимо проверить /home/{YOUR_PROFILE}/.bashrc (на примере ubuntu) Внутри должна быть строчка

                      
                      

Origami Hibernate

Описание

Модуль для работы с базами данных на основе Hibernate.

Подключение

Необходимо добавить зависимость в pom.xml в проекте:

                      
                      

Так же необходимо создать файл конфигурации для работы с требуемой базой:     - hibernate-postgres.cfg.xml     - hibernate-clickhouse.cfg.xml     - hibernate-oracle.cfg.xml     - hibernate-mssql.cfg.xml В файле необходимо указать параметр со значением класса драйвера:

                      
                      

Использование

Необходимо унаследовать класс с шагами для работы с конкретной базой данных от CommonFixtureSteps. В конструкторе класса в sessionProperties необходимо указать параметры для подключения и после проинициализировать сессию. Пример:

                      
                      

Запросы SELECT рекомендуется выполнять на языке hql.

                      
                      

Запросы INSERT, UPDATE, DELETE и тд. рекомендуется выполнять на языке sql.

                      
                      

Динамическая схема

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

                      
                      

В параметрах подключения в таком случае необходимо указать схему

                      
                      

Таким образом запрос будет выполнен с той или иной схемой в зависимости от переданного параметра.

Схема по умолчанию

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

                      
                      

Параметры

- hibernate.excel.result.enabled - параметр необходим для прикрепления результата выборки из базы данных в формате Excel. По умолчанию: false. (CI/CD переменная: HIBERNATE_EXCEL_RESULT_ENABLED)

Origami Kafka

Подключение

Необходимо добавить зависимость в pom.xml в проекте:

                      
                      

Таблица совместимости SASL механизмов и Security Protocol

Sasl Mechanism PLAINTEXT SASL_PLAINTEXT SSL SASL_SSL — (нет SASL) PLAIN SCRAM-SHA-256 SCRAM-SHA-512 GSSAPI (Kerberos) OAUTHBEARER EXTERNAL

Properties

- setBootstrapServers() - список адресов Kafka-брокеров - setGroupId() - имя группы консьюмеров, которые работают вместе - addSecurityProtocol() - протокол безопасности для подключения клиента. Опционально с указанием regexp для названия стенда. При запуске тестов на стендах, для которых указан протокол, будет использован данный протокол, для запусков на остальных стендов будет использован протокол без указания regexp. - addSaslMechanism() - определяет, какой механизм аутентификации SASL (Simple Authentication and Security Layer) будет использоваться клиентом Kafka - setUsername() - имя пользователя для аутентификации - setPassword() - пароль пользователя для аутентификации - setClientId() - идентификатор приложения (client), зарегистрированного во внешней системе авторизации (например, OAuth-сервере) - setClientSecret() - секретный ключ (пароль), привязанный к этому clientId - setSaslOauthBearerTokenEndpoint() - URL-адрес, по которому Kafka-клиент будет запрашивать OAuth 2.0 access token у внешнего сервера авторизации, указывая свои clientId, clientSecret. Этот токен затем используется для аутентификации с Kafka-брокером - setSaslOauthBearerJwksEndpoint() - URL, по которому Kafka-брокер (или клиент) получает открытые ключи для проверки подписи JWT-токенов - setSslTruststoreLocation() - путь к truststore-файлу, в котором хранятся сертификаты доверенных центров сертификации (CA certificates) - setSslTruststorePassword() - пароль для доступа к truststore-файлу - setSaslKerberosServiceName() - определяет имя Kerberos-сервиса, под которым зарегистрирован Kafka-брокер в Kerberos KDC (Key Distribution Center) - setSslKeystoreLocation() - путь к файлу keystore (обычно формата JKS или PKCS12), в котором хранятся приватный ключ и сертификат клиента (или брокера) - setSslKeystorePassword() - пароль для доступа ко всему keystore-файлу (для его открытия) - setSslKeyPassword() - пароль, который защищает приватный ключ внутри keystore - setTopicPrefix() - префикс будет добавлен перед названием топика кафки. Необходим для обхода различий в названии топиков на разных стендах. - setTopicPostfix() - постфикс будет добавлен после названия топика кафки. Необходим для обхода различий в названии топиков на разных стендах - setRetryWaitingTime() - установка общего времени ожидания для попыток чтения - setRetryMaxAttempts() - установка попыток чтения - setRetryReadTimeout() - установка времени ожидания между попытками чтения

Origami RestAssured

Описание

Модуль для работы с HTTP-запросами на основе RestAssured.

Подключение

Необходимо добавить зависимость в pom.xml в проекте:

                      
                      

Использование

Необходимо унаследовать класс CommonSteps от RestSteps. Необходимо использовать метод получения базового RequestSpecBuilder: getRequestSpecBuilder(). В CommonSteps реализуются методы "сборщики" базовых RequestSpecBuilder. Пример:

                      
                      

Далее необходимо унаследоваться от CommonSteps. Унаследованный класс должен содержать методы для работы с конкретным сервисом, который содержит методы получения RequestSpec для методов сервиса. Пример:

                      
                      

Далее необходимо унаследоваться от класса с общими шагами сервиса. Унаследованный класс будет содержать методы, доступные в тесте (методы, выполняющие get, post, put..., методы с проверками).

                      
                      

Методы

RestSteps содержит методы, для проверки статус кодов ответов. Примеры: Статус код 200:

                      
                      

Статус код 404:

                      
                      

Статус код 500:

                      
                      

Метод then(), доступный в классе с шагами проверок. Возвращает последний response для дальнейшей работы с ним.

                      
                      

Так же реализованы методы расширяющие стандартные у RestAssured, которые позволяют добавлять только not null значения в заголовки, параметры и тд.

                      
                      

Origami WebSocket

Подключение

Необходимо добавить зависимость в pom.xml в проекте:

                      
                      

WsSteps

Использование

Необходимо унаследоваться от WsSteps с указанием в конструкторе параметров для подключения. Параметр withWss: true при https, иначе false. Пример:

                      
                      

Методы

Осуществление подписки на топик

                      
                      

Осуществление подписки на топик с маппингом результата на переданный класс

                      
                      

Осуществление отписки от топика и получение результата. В случае переданного класса вернется список из объектов переданного класса. В ином случае вернется List<String>

                      
                      

Методы для отписки от топика при получении сообщения или списка сообщений. При неполучении сообщения в течении 5 сек или заданного интервала тест будет провален.

                      
                      

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

                      
                      

Осуществление отписки от топика без получения результата.

                      
                      

WsTopic

Представляет собой Enum, который содержит названия топиков.

Использование

Необходимо унаследоваться от WsTopic. Пример:

                      
                      

Origami Selenide

Описание

Модуль для работы с Web UI на основе Selenide.

Подключение

Необходимо добавить зависимость в pom.xml в проекте:

                      
                      

Параметры

- web.site.url - базовый URL-адрес - web.browser.name - браузер для использования. По умолчанию: chrome (CI/CD переменная: WEB_BROWSER_NAME) - web.timeout - таймаут в миллисекундах для провала теста, если условия все еще не выполнены. По умолчанию: 5000 - web.page.load.timeout - таймаут загрузки веб-страницы (в миллисекундах). По умолчанию: 10000 - web.browser.yandex.binary - путь до бинарника яндекс браузера в случае его использования

Origami IBM MQ

Подключение

Необходимо добавить зависимость в pom.xml в проекте:

                      
                      

Producer

Использование

Необходимо унаследоваться от IbmMqProducer с указанием в конструкторе параметров для подключения. Пример:

                      
                      

Методы

Отправка сообщения в топик

                      
                      

Browser

Использование

Необходимо унаследоваться от IbmMqBrowser с указанием в конструкторе параметров для подключения. Пример:

                      
                      

Методы

В результате выполнения метода вернется Message. Сообщение останется доступно для чтения из очереди.

                      
                      

Consumer

Использование

Необходимо унаследоваться от IbmMqConsumer с указанием в конструкторе параметров для подключения. Пример:

                      
                      

Методы

В результате выполнения метода вернется первый Message в очереди и сообщение будет более недоступно в очереди.

                      
                      

MessageHelper

MessageHelper содержит вспомогательные методы для работы с Message.

Методы

В результате выполнения метода из переданного Message будет извлечено сообщение и возвращена String.

                      
                      

Origami Test Containers

Подключение

Необходимо добавить зависимость в pom.xml в проекте:

                      
                      

Использование

Необходимо унаследовать класс c реализацией контейнеров(например, Containers) от TestContainers. В конструкторе Containers необходимо реализовать контейнеры, которые будут запущены перед стартом тестов, и добавить их в список контейнеров containers. Для включения поднятия контейнеров перед стартом тестов, необходимо выставить test.containers.enabled = true или для CI/CD переменную TEST_CONTAINERS_ENABLED = true.

                      
                      

Для создания преднастроенных контейнеров можно использовать методы: - withPostgres() - собирает контейнер Postgres с настройками по умолчанию       Образ: postgres:16       Имя: testdb       Фиксированный порт: 5432       Пользователь: postgres       Пароль: postgres - withOracle() - собирает контейнер Oracle с настройками по умолчанию       Образ: gvenzl/oracle-xe:21-slim       Имя: testdb       Фиксированный порт: 1521       Пользователь: test       Пароль: test - withMSSQL() - собирает контейнер MS SQL с настройками по умолчанию       Образ: mcr.microsoft.com/mssql/server:2019-CU18-ubuntu-20.04       Имя: master       Фиксированный порт: 1433       Пользователь: sa       Пароль: A_Str0ng_Required_Password - withClickhouse() - собирает контейнер ClickHouse с настройками по умолчанию       Образ: clickhouse/clickhouse-server:23.8-alpine       Имя: default       Фиксированный порт: 8123       Пользователь: test       Пароль: test - withKafka() - собирает контейнер Kafka с настройками по умолчанию       Образ: apache/kafka:3.9.1       Фиксированный порт: 9092       Пользователь: ""       Пароль: "" - withIbmMq() - собирает контейнер IBM MQ с настройками по умолчанию       Образ: icr.io/ibm-messaging/mq:9.3.0.0-r1       Фиксированный порт: 1414       Queue manager: QM1       Channel: DEV.APP.SVRCONN       Пользователь: app       Пароль: passw0rd - buildDefaultAppContainer(String imageName, String imageVersion, String containerName, Integer startPriority, String ciJavaOpts) - собирает контейнер с сервисом       • imageName - имя docker образа       • imageVersion - версия docker образа       • containerName - имя контейнера       • startPriority - приоритет запуска контейнера (начиная от 1 - самый приоритетный и запустится первым, может быть null(низший приоритет))       • ciJavaOpts - параметры для виртуальной машины Java (JVM) при запуске через CI/CD Пример:

                      
                      

Имя containerName будет использоваться для установки значений переменных стенда(например в test_containers.json) - kafka:       containerName (по умолчанию kafka_container)       containerName + "_bootstrap_servers" - databases:       containerName (по умолчанию postgres_container, oracle_container, mssql_container, clickhouse_container в зависимости от бд)       containerName + "_host"       containerName + "_port"       containerName + "_name"       containerName + "_username"       containerName + "_password" - services:       containerName + "_host"       containerName + "_port"       containerName + "_ws_host"       containerName + "_ws_port" - ibm mq:       containerName (по умолчанию ibm_mq_container)       containerName + "_host"       containerName + "_port"       containerName + "_queue_manager"       containerName + "_username"       containerName + "_password" Пример использования данных динамических значений в /config/test_containers.json

                      
                      

Для создания топиков Kafka необходимо в список kafkaTopics добавить топики с помощью метода getTopic(String name, int partitions, short rf, boolean compact). Топики будут созданы при старте контейнера с Kafka.

                      
                      

Для выполнения миграций базы данных(последовательного выполнения sql скриптов) необходимо вызвать метод setDatabaseScriptLocations(List<String> databaseScriptLocations) для конкретной базы данных.

                      
                      

Сами скрипты необходимо разместить в resources например в пакете db.migrations. Будут выполнены все скрипты в указанном пакете. Можно указывать несколько пакетов. Как в примере выше, в случае с пакетом db.migrations в setDatabaseScriptLocations необходимо будет передать db/migrations. Файлы со скриптами должны быть версионированы и начинаться с v1__name.

                      
                      

Для создания очередей IBM MQ необходимо в список ibmMqQueues добавить названия очередей. Очереди будут созданы при старте контейнера с IBM MQ.

                      
                      

Для поднятия контейнеров на фиксированных портах можно использовать метод withFixedPorts()       - kafka: 9092       - postgres: 5432       - oracle: 1521       - ms sql: 1433       - clickhouse: 8123       - services: 8080 (и далее в порядке возрастания)       - ibm mq: 1414 Без использования метода контейнеры будут подниматься на случайном порту(например, 41287). При реализации нескольких классов наследников TestContainers необходимо точно понимать в рамках какого класса требуется поднимать контейнеры. Для этого существует аннотация @TestContainerName, в которой можно задать имя, и затем при формировании mvn команды указать это имя с помощью параметра test.containers.name. Так же можно ограничить пакет для поиска классов с помощью параметра test.containers.pkg.prefix. Пример команды maven:

                      
                      

CI/CD

При запуске в CI/CD возможно переопределить переменную SERVICE_SRC_DIR, которая указывает на директорию куда будет склонирован код сервиса. По умолчанию: service-src. Пример реализации в .gitlab-ci.yml:

                      
                      

Параметры

- test.containers.enabled - старт контейнеров при запуске тестов (CI/CD переменная: TEST_CONTAINERS_ENABLED) - test.containers.app.log.level - уровень логирования контейнеров с сервисами созданных из преднастроенных методов. По умолчанию: INFO (CI/CD переменная: TEST_CONTAINERS_APP_LOG_LEVEL) - test.containers.name - имя в аннотации @TestContainerName у класса с реализацией контейнеров (CI/CD переменная: TEST_CONTAINERS_NAME) - test.containers.pkg.prefix - имя пакета для поиска классов с реализацией контейнеров (CI/CD переменная: TEST_CONTAINERS_PKG_PREFIX) - test.containers.fixed.ports - поднятие контейнеров на фиксированных портах. Переопределяет метод withFixedPorts() (CI/CD переменная: TEST_CONTAINERS_FIXED_PORTS)