Документация Tester DSL: миграция с pytest/httpx

Миграция с pytest + httpx на Mockarty Tester

pytest + httpx — каноничный Python HTTP test-стек. Mockarty Tester
DSL — drop-in замена когда вы хотите:

  • Мульти-протокольный охват в одном DSL (HTTP, gRPC, GraphQL, Kafka,
    RabbitMQ, SSE, WebSocket, SOAP, DB)
  • Переменные между шагами чейна через синтаксис {{token}}
  • Загрузку результата как TCM external-run одним вызовом

Кратко

pytest + httpx Mockarty Tester (Python)
httpx.get(url) t.http().get(url)
resp.status_code == 200 .expect_status(200)
assert resp.json()["name"] == "Alice" .expect_json_path("$.name", "Alice")
assert "abc" in resp.text .expect_body_contains("abc")
resp.headers["X-Foo"] == "y" .expect_header("X-Foo", "y")
httpx.post(url, json={...}) .post(url).json({...})
httpx.Client(headers={...}) Tester(default_headers={...})
token = resp.json()["token"] .extract("$.token", "token")
Затем f"Bearer {token}" .header("Authorization", "Bearer {{token}}")
Параметризация через fixture Pre-populate через t.set_var(...)

Параллельный пример

pytest + httpx

import httpx
import pytest


def test_login_and_me():
    base = "http://localhost:8080"
    with httpx.Client(base_url=base) as c:
        login = c.post("/login", json={"user": "alice"})
        assert login.status_code == 200
        token = login.json()["token"]

        me = c.get("/me", headers={"Authorization": f"Bearer {token}"})
        assert me.status_code == 200
        assert me.json()["user"] == "alice"

Mockarty Tester

from mockarty.tester import Tester


def test_login_and_me():
    with Tester(base_url="http://localhost:8080") as t:
        (t.http().post("/login")
            .json({"user": "alice"})
            .expect_status(200)
            .extract("$.token", "token"))
        (t.http().get("/me")
            .header("Authorization", "Bearer {{token}}")
            .expect_status(200)
            .expect_json_path("$.user", "alice"))
        assert t.ok(), t.errors()

Зачем мигрировать

  • Одинаковая лексика на Go / Python / Java. QA-команда пишущая
    чейны на Python может передать исходник Go-шопу — чейн читается
    идентично.
  • Allure / TCM из коробки. Tester захватывает каждый шаг с
    timing + status + protocol metadata. to_report_kwargs(t, ...)
    маппит результат на client.external_runs.report(**) для TCM.
  • Без HTTP-плумбинга для чейнинга. {{var}} шаблон Tester’а
    решает cross-step плумбинг без f-string конкатенации.

Загрузка результата в TCM

from mockarty import MockartyClient
from mockarty.tester import Tester, to_report_kwargs

with MockartyClient(base_url="http://...", api_key="...", namespace="qa") as client:
    with Tester(base_url="http://localhost:8080") as t:
        # ... chain
        client.external_runs.report(
            **to_report_kwargs(t, case_name="Login flow", auto_create=True),
        )

Pipeline: pytest test → IR → TCM external run — закрывает петлю.
Запусти любой pytest, отправь результат через SDK, увидь его на
Mockarty admin рядом с нативными test-plan run’ами.

Сосуществование с pytest

Tester НЕ заменяет pytest — это fluent API для написания
HTTP / RPC / message-bus частей теста. @pytest.fixture,
pytest -k, pytest-xdist всё работает без изменений. Tester
заменяет только httpx-стайл ассерты внутри test body.

import pytest
from mockarty.tester import Tester


@pytest.fixture
def t():
    with Tester(base_url="http://localhost:8080") as t:
        yield t


@pytest.mark.parametrize("user_id", [1, 2, 3])
def test_user_visible(t, user_id):
    t.http().get(f"/users/{user_id}").expect_status(200)
    assert t.ok(), t.errors()