contract-testing-lab · fuzz/

Schemathesis: тесты, которые пишет сама OpenAPI-спецификация

Schemathesis: tests written by the OpenAPI spec itself

Инструмент читает описание API, сам генерирует тысячи запросов, включая заведомо неправильные, и проверяет каждый ответ на соответствие той же спецификации. Здесь он гоняет копию Swagger Petstore в Docker.

The tool reads the API description, generates thousands of requests (deliberately broken ones included) and checks every response against that same spec. Here it runs against a private Swagger Petstore in Docker.

19/19операций провереноoperations tested
3 628сгенерировано запросовgenerated test cases
42 сна прогон в CIper CI run
83расхождения → 8 дефектовfailures → 8 defects
OpenAPI spec → generator → Petstore container → checks → baseline gate → CI openapi.json 19 operations generator examples coverage fuzzing stateful Petstore docker :8090 checks schema · status · 5xx · auth passed0 baseline0 new → CI red0
запросrequest ответ прошёл все проверкиresponse passed every check известный дефект (в baseline)known defect (in the baseline) новое расхождение → сборка краснаяnew failure → build fails
ИдеяThe idea

Пример против свойства

Example vs property

Обычный тест: вы придумываете примеры

A regular test: you invent the examples

200 POST /pet {"name":"Rex","photoUrls":[]}
404 GET /pet/999999999
400 GET /pet/abc

Точный оракул: «питомец Rex создан». Покрыто ровно то, о чём вы подумали.

Exact oracle: "Rex was created". Covers exactly what you thought of.

Property-based: вы задаёте правило

Property-based: you state a rule

∀ request ∈ spec: status ≠ 5xx ∧ body ⊨ schema

Как генерируются запросыHow requests are generated

Четыре фазы одного прогона

Four phases of one run

Фазы идут по порядку. Все примеры ниже взяты из настоящего прогона против Petstore.

The phases run in order. Every example below comes from the real run against Petstore.

Результат первого прогонаFirst run results

Где сервер расходится со своей спецификацией

Where the server disagrees with its own spec

Строки — операции, столбцы — дефекты. Число — сколько уникальных расхождений Schemathesis записал в baseline. Наведите на ячейку.

Rows are operations, columns are defects; the number is how many unique failures went into the baseline. Hover a cell.

Как это не ломает CIWhy CI stays usable

Baseline: известные дефекты отдельно, новые — красным

Baseline: known defects aside, new ones fail

Идея та же, что у test.fail() с номером дефекта в Playwright-тестах. Выберите случай и посмотрите, куда он пойдёт.

Same idea as test.fail() with a defect id in the Playwright tests. Pick a case and follow it.

failure foundop + check + signature in baseline.json?identity match expires passed?"expires": "YYYY-MM-DD" no → new knownexit 0 · CI green newexit 1 · CI red
Место в наборе инструментовWhere it fits

Чем отличается от того, что уже есть в репозитории

How it differs from what the repo already has

Playwright API testsSchemathesisPact (в планах)(planned)OWASP / ZAP
ВопросQuestion Работает ли бизнес-логика?Does the business logic work? Совпадает ли сервер со своей спецификацией на любых входных данных?Does the server match its spec for any input? Совместимы ли потребитель и поставщик?Are consumer and provider compatible? Можно ли это взломать?Can it be attacked?
Кто пишет кейсыWho writes cases инженерengineerгенератор по OpenAPIgenerator from OpenAPI потребитель, в кодеconsumer, in codeсканер + инженерscanner + engineer
ОракулOracle точные ожиданияexact expectationsобщие свойства + схемаgeneral properties + schema контракт-файлcontract fileправила уязвимостейvulnerability rules
ОбъёмVolume~100~3 600 / runдесятки взаимодействийtens of interactionsсотни атакhundreds of attacks
Лучше всего ловитBest at регрессии сценариевscenario regressionsдрейф контракта, 500 на странных данныхcontract drift, 500s on odd data ломающие изменения до деплояbreaking changes before deployBOLA, инъекции, заголовкиBOLA, injection, headers
ЗапускRun it

Локально за четыре команды

Locally in four commands

Нужны Docker Desktop и Python 3.10+. В CI то же самое делает .github/workflows/fuzz.yml каждую ночь и при изменениях в fuzz/.

Needs Docker Desktop and Python 3.10+. In CI, .github/workflows/fuzz.yml does the same nightly and on changes to fuzz/.

СловарьGlossary

Термины

Terms