Документация
Для начала необходимо ознакомиться с документацией по началу работы с 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)