DSL для реализации паттерна Screenplay в Python-тестах.
Project description
persona-dsl: Руководство пользователя
persona-dsl — это ядро фреймворка, реализующее легковесную версию паттерна Screenplay для написания автотестов на Python. Оно спроектировано так, чтобы дать вам полный контроль над базовыми инструментами (Playwright, Allure), предоставляя при этом выразительный и читаемый DSL для описания тестов.
1. Основные концепции
В основе фреймворка лежат шесть ключевых компонентов, которые вместе описывают любое взаимодействие с системой.
- Persona: "Действующее лицо" или актор, который выполняет действия в тесте. Это главный объект, через который вы будете работать.
- Skill: "Навык" или способность Персоны взаимодействовать с системой. Например,
UseBrowserдля работы с веб-интерфейсом илиUseAPIдля запросов к API. - Ops: Низкоуровневая, техническая операция (клик, HTTP-запрос). Единственный компонент, который может напрямую использовать
Skill. - Action: "Действие", атомарная бизнес-операция, которая может изменять состояние системы. Состоит из последовательности
Ops. - Fact: "Факт" о состоянии системы. Действие, которое не изменяет состояние, а только запрашивает данные. Также состоит из
Ops. - Expectation: "Ожидание", которое проверяет, соответствует ли
Factопределенному условию (например,IsEqualTo("some text")). - Goal: "Цель", высокоуровневый бизнес-сценарий, объединяющий несколько
ActionиFact.
2. Стиль написания тестов
Фреймворк предлагает единый, пошаговый стиль написания тестов, который легко читать и поддерживать.
- Выполнение действий:
persona.make(Action(...), Goal(...)) - Получение данных:
data = persona.get(Fact(...)) - Проверки:
persona.check(data, Expectation(...))
# test_login.py
from persona_dsl.ops.web import NavigateTo, Fill, Click
from persona_dsl.facts.web import CurrentPath
from persona_dsl.expectations.generic import IsEqualTo
from tests.pages.login_page import LoginPage # Пример объекта страницы
def test_login_flow(persona):
login_page = LoginPage()
# Действия
persona.make(
NavigateTo("/login"),
Fill(login_page.username_field, "testuser"),
Fill(login_page.password_field, "password"),
Click(login_page.submit_button)
)
# Получение факта
current_path = persona.get(CurrentPath())
# Проверка
persona.check(current_path, IsEqualTo("/dashboard"))
3. Встроенная функциональность ("Батарейки в комплекте")
Ядро поставляется с pytest-плагином, который предоставляет полезные фикстуры и автоматизирует рутинные задачи.
3.1. Фикстуры
persona: Главная фикстура. Создает экземплярPersonaдля теста и автоматически наделяет её нужными навыками.config: Загружает конфигурацию из файловconfig/*.yamlи секреты из.env.*в зависимости от окружения (--env=...).testdata: Удобная фабрика для загрузки тестовых данных изtests/data/*.{yaml,yml,json}.
3.2. Автоматическая интеграция с Allure
Вам не нужно вручную создавать шаги в отчете, фреймворк делает это за вас:
- Каждый вызов
persona.make(),persona.get()иpersona.check()автоматически оборачивается вallure.step(). - Текст шага генерируется из метода
_get_step_description(), который вы реализуете в своих компонентах. - Результат, полученный
Фактом(Fact), автоматически логируется во вложенном шаге. - Навык
UseAPIпо явной настройке (log_bodies=True) прикрепляет к отчёту полные тела запросов и ответов.
3.3. Автоматические артефакты при падении теста
При падении любого теста, который использовал браузер, фреймворк автоматически собирает артефакты для отладки и прикладывает их к Allure-отчету:
- Скриншот последней активной страницы.
- HTML-код страницы (
page source).
Оба этих параметра включены по умолчанию. Их можно отключить в файле config/{env}.yaml в секции reporting:
# config/dev.yaml
reporting:
screenshot_on_fail: false
pagesource_on_fail: false
3.4. Декораторы для тестов
Ядро предоставляет удобные декораторы для работы с pytest:
@tag("smoke", "regression"): Позволяет назначать тестам теги (pytest-маркеры).@data_driven(...): Упрощает параметризацию тестов, позволяя загружать тестовые данные из списков или файлов вtests/data/*.{yaml,yml,json}.@parametrize_simple(...): Обёртка надpytest.mark.parametrizeдля простых наборов данных.
Динамические данные в @data_driven (SystemVar)
Вы можете использовать генераторы данных (SystemVar) прямо в ваших YAML/JSON файлах для параметризации.
Для этого используется специальная JSON-структура:
{
"kind": "system",
"name": "имя_провайдера",
"args": { "аргумент": "значение" }
}
Доступные провайдеры (name):
uuid(): Детерминированный UUID v4.randomInt(min, max): Случайное целое число.randomFloat(min, max, precision): Случайное число с плавающей точкой.randomString(length, alphabet?): Случайная строка.now(fmt?, tz?): Текущая дата/время.dateShift(days, fmt?, tz?): Дата со сдвигом.fromEnv(name, default?): Значение из переменной окружения.faker(provider, locale?, ...): Данные из библиотеки Faker.sequence(name, seed?): Детерминированная числовая последовательность.concat(parts: list): Склеивает строки.template(pattern, variables): Форматирует строку по шаблону.
Пример (tests/data/dynamic_users.yaml):
- test_id: "user-1"
payload:
username:
kind: system
name: randomString
args: { length: 8 }
email:
kind: system
name: faker
args: { provider: "email" }
Все значения генерируются детерминированно на основе run_id, env и variant_id (test_id), что обеспечивает воспроизводимость тестов.
4. Конфигурация и Декларация (conftest.py)
Вся настройка фреймворка — декларативная и сосредоточена в tests/conftest.py.
4.1. Декларация в conftest.py
class Roles(BaseRole): Enum-класс для объявления всех кастомных ролей (например,ADMIN).class Skills(BaseSkill): Класс для объявления всех именованных навыков (например,REPORTING_API).PERSONA_SKILLS = [...]: Список всех навыков, используемых в проекте, для строгой валидации конфигурации.PERSONA_ROLES = Roles: Регистрация ролей для валидации.
# tests/conftest.py
from persona_dsl import BaseRole, BaseSkill, SkillId
class Roles(BaseRole):
ADMIN = "admin"
class Skills(BaseSkill):
REPORTING_API = (SkillId.API, "reporting")
PERSONA_ROLES = Roles
PERSONA_SKILLS = [
BaseSkill.BROWSER,
BaseSkill.API,
Skills.REPORTING_API,
]
4.2. Структура конфигурации
config/{env}.yaml: Параметры для окружения (URL, настройки headless и т.д.).config/auth.yaml: Секреты и учетные данные.
При запуске плагин автоматически проверяет, что для каждой роли и навыка из conftest.py есть соответствующая конфигурация в YAML.
5. Готовые компоненты (Ops)
Ядро persona-dsl поставляется с набором готовых Ops для всех поддерживаемых Skill'ов.
persona_dsl.ops.web:NavigateTo,Click,Fill,PressKey,ElementText,ElementIsVisible,PageScreenshot,PageAriaSnapshotи др.persona_dsl.ops.api:JsonAs(для отправки запросов и валидации ответа по Pydantic модели),SendRequest.persona_dsl.ops.db:FetchOne,FetchAll,ExecuteSQL.persona_dsl.ops.kafka:SendMessage,MessageInTopic.persona_dsl.ops.soap:CallOperation,OperationResult.
6. Генераторы кода
Для ускорения разработки persona-dsl включает два генератора:
persona-page-gen: Интерактивно создает классыPageиз ARIA-снимка веб-страницы.persona-api-gen: Генерирует Pydantic-модели и классыAction/Factиз спецификации OpenAPI.
Это позволяет быстро создавать основу для PageObjects и API-клиентов, сокращая рутинную работу.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file persona_dsl-26.1.20.9.tar.gz.
File metadata
- Download URL: persona_dsl-26.1.20.9.tar.gz
- Upload date:
- Size: 101.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
53d98a3b53cd3f8ed950f34a24c0bb9da1e9a999c6330358334b67fe0a9ffd0d
|
|
| MD5 |
4c597881c1811fba052f2751595b2732
|
|
| BLAKE2b-256 |
89c2f902a95bcc1ccd36afbabe297ff9a54e5af6cebeef4e1fd6f76f7f274844
|
File details
Details for the file persona_dsl-26.1.20.9-py3-none-any.whl.
File metadata
- Download URL: persona_dsl-26.1.20.9-py3-none-any.whl
- Upload date:
- Size: 132.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
aa3bd39341f414aaadcea4c90480cca1fd871bd8ebc6cd2a1d43bad0f7e86207
|
|
| MD5 |
f24ff0304e2fff903f1a0b329aafe91b
|
|
| BLAKE2b-256 |
425677e687d26f64f7b1910adcb77f9e275c14c421112d50d354b4c493cdd7bb
|