Миграция с 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()