Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Testing & Assertions

Anes Berbic edited this page Mar 13, 2026 · 1 revision

Testing & Assertions

ApiArk provides two ways to test API responses: declarative YAML assertions (simple, no code) and JavaScript test blocks (powerful, Chai.js-based).


Declarative Assertions (YAML)

Add an assert block to any request YAML file. No scripting required.

assert:
 status: 200
 body.users.length: { gt: 0 }
 body.users[0].email: { matches: "^.+@.+$" }
 headers.content-type: { contains: "application/json" }
 responseTime: { lt: 2000 }

Available Operators

Operator Description Example
eq Equals (default if bare value) status: 200 or status: { eq: 200 }
neq Not equals status: { neq: 500 }
gt Greater than body.count: { gt: 0 }
gte Greater than or equal body.count: { gte: 1 }
lt Less than responseTime: { lt: 2000 }
lte Less than or equal responseTime: { lte: 5000 }
in Value in array status: { in: [200, 201] }
notIn Value not in array status: { notIn: [500, 502, 503] }
contains String/array contains body.name: { contains: "John" }
notContains Does not contain body.error: { notContains: "fatal" }
matches Regex match body.email: { matches: "^.+@.+\\..+$" }
type JavaScript type check body.id: { type: string }
exists Property exists body.token: { exists: true }
length Array/string length body.users: { length: 10 }
schema JSON Schema validation body: { schema: { type: object } }

Accessing Nested Values

Use dot notation and array indices:

assert:
 body.data.users[0].name: { type: string }
 body.data.pagination.total: { gt: 0 }
 body.meta.version: "2.0"
 headers.x-rate-limit-remaining: { gt: 0 }

JavaScript Tests

For more complex validation, use tests blocks with full JavaScript:

tests: |
 ark.test("should return paginated users", () => {
 const body = ark.response.json();

 // Status check
 ark.expect(ark.response.status).to.equal(200);

 // Structure check
 ark.expect(body).to.have.property("users");
 ark.expect(body).to.have.property("pagination");

 // Data validation
 ark.expect(body.users).to.be.an("array");
 ark.expect(body.users.length).to.be.at.most(20);

 // Each user has required fields
 body.users.forEach(user => {
 ark.expect(user).to.have.all.keys("id", "name", "email");
 ark.expect(user.email).to.match(/^.+@.+\..+$/);
 });
 });

 ark.test("pagination metadata is correct", () => {
 const { pagination } = ark.response.json();
 ark.expect(pagination.page).to.be.a("number");
 ark.expect(pagination.perPage).to.equal(20);
 ark.expect(pagination.total).to.be.at.least(0);
 });

 ark.test("response time is acceptable", () => {
 ark.expect(ark.response.time).to.be.below(2000);
 });

 ark.test("content type is JSON", () => {
 const ct = ark.response.headers["content-type"];
 ark.expect(ct).to.include("application/json");
 });

Chai.js Assertion Styles

ApiArk supports the full Chai.js expect API:

// Equality
ark.expect(value).to.equal(expected);
ark.expect(value).to.deep.equal({ key: "value" });
ark.expect(value).to.not.equal(unexpected);
// Type checking
ark.expect(value).to.be.a("string");
ark.expect(value).to.be.an("array");
ark.expect(value).to.be.null;
ark.expect(value).to.be.undefined;
ark.expect(value).to.be.true;
// Comparison
ark.expect(number).to.be.above(5);
ark.expect(number).to.be.below(100);
ark.expect(number).to.be.at.least(1);
ark.expect(number).to.be.at.most(50);
ark.expect(number).to.be.within(1, 100);
// String
ark.expect(str).to.include("substring");
ark.expect(str).to.match(/pattern/);
ark.expect(str).to.have.lengthOf(10);
// Array
ark.expect(arr).to.include("item");
ark.expect(arr).to.have.lengthOf(5);
ark.expect(arr).to.be.empty;
ark.expect(arr).to.have.members(["a", "b", "c"]);
// Object
ark.expect(obj).to.have.property("key");
ark.expect(obj).to.have.property("key", "value");
ark.expect(obj).to.have.all.keys("id", "name", "email");
ark.expect(obj).to.have.any.keys("id", "uuid");
ark.expect(obj).to.deep.include({ name: "John" });

Test Results Panel

After running a request with tests:

  1. Click the Tests tab in the response panel
  2. See each test with pass/fail status
  3. Failed tests show the assertion error message
  4. Total pass/fail count in the tab badge

JSON Schema Validation

Validate response structure against a JSON Schema:

assert:
 body:
 schema:
 type: object
 required:
 - id
 - name
 - email
 properties:
 id:
 type: string
 pattern: "^usr_[a-z0-9]+$"
 name:
 type: string
 minLength: 1
 email:
 type: string
 format: email
 age:
 type: integer
 minimum: 0
 maximum: 150

Or in JavaScript using Ajv:

ark.test("response matches schema", () => {
 const schema = {
 type: "object",
 required: ["id", "name"],
 properties: {
 id: { type: "string" },
 name: { type: "string" }
 }
 };
 const body = ark.response.json();
 ark.expect(body).to.matchSchema(schema);
});

Combining Assertions and Tests

You can use both in the same request. Declarative assertions run first, then JavaScript tests:

# Quick checks (no code needed)
assert:
 status: 200
 responseTime: { lt: 3000 }
 body.success: true
# Detailed validation (with code)
tests: |
 ark.test("business logic validation", () => {
 const body = ark.response.json();
 const total = body.items.reduce((sum, item) => sum + item.price, 0);
 ark.expect(total).to.equal(body.totalPrice);
 });

Clone this wiki locally

AltStyle によって変換されたページ (->オリジナル) /