Three languages for scripts. None for checks.
A pre-request or post-response script in JavaScript, Go or Python, with the same sonda API in all three and real IntelliSense in the editor. And for the ninety percent of tests that are "the status is 200 and the body has an id", a check is a sentence you pick from three menus — no code at all.
At a glance
Tests that read as sentences.
Subject, operator, value. The runner, the flows and the load test all read them, and a failing one brings the Tests tab forward on its own.
Ten subjects
Status, time, size, redirects, content type, a header, a cookie, the body, a JSON path in it, and the spec — "the answer matches the spec" validates against the project's OpenAPI document.
Twenty-five operators
Equals and not, contains, starts and ends with, matches, one of, greater and less, between, exists, empty, null, is type, length and its bounds, is a date, matches a JSON Schema.
Inherited
Checks on a folder or a project run on every answer under them, before the post script. Draft a JSON Schema from an answer in one click. Re-read a check without sending again. See the rows as code in any of the three languages.
Your Postman scripts come across.
The scripting object is sonda, and the importer knows what yours was.
Postman
On import, pm. becomes sonda.; the legacy postman.* calls and tests[...] lines are converted. On export to Postman the reverse is done.
Bruno
A compatibility layer for bru, req, res and test(). Bruno folders import with their scripts, tests as checks, and docs.
require()
Shims over sonda for the usual suspects: lodash, uuid, nanoid, crypto-js hashes and HMAC, dayjs, moment, date-fns, axios, chai, buffer.