YATL is a declarative, YAML‑based testing language for API testing. If you know HTTP and YAML, you know YATL.
pip install yatl-testingCreate your first test file ping.yatl.yaml:
name: ping
base_url: google.com
steps:
- name: simple_test
request:
method: GET
expect:
status: 200Run it:
yatl .That’s it!
Consider another example, let's try to test a simple POST request:
We will use FastAPI to create a simple API:
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class User(BaseModel):
name: str
age: int
db = [
User(name="John", age=30),
User(name="Jane", age=25),
]
@app.post("/users", status_code=201)
def create_user(user: User):
db.append(user)
return {"status": "ok"}Create a test file users.yatl.yaml:
name: User API
base_url: https://localhost:8000
steps:
- name: create_user
description: Create a new user with name=John and age=30
request:
method: POST
url: /users
body:
json:
name: John
age: 30
expect:
status: 201
body:
json:
status: okRun it:
yatl .That’s it!
Writing API tests in code is cumbersome. YATL turns tests into pure data — declarative, readable, and accessible to every team member.
- You have to write code – even for a simple GET request
- High entry barrier – need to know programming languages well
- Complex dependencies – chaining requests becomes spaghetti code
- Hard to maintain – tests become unreadable over time
YATL is a domain‑specific language that lets you describe API tests in clean YAML. No imperative code, no hidden magic.
If you know HTTP and YAML, you know YATL.
- Declarative syntax – describe what to test, not how
- Data extraction & templating – use Jinja2 to reuse response data
- Multiple data formats – JSON, XML, form data, multipart files
- Parallel execution – run tests in parallel with
--workers - Skip tests & steps – disable tests without deleting them
- Advanced validation – validate with rules like
gt,regex,type
name: User API
base_url: https://api.example.com
steps:
- name: login
request:
method: POST
url: /auth/login
body:
json:
username: "test"
password: "secret"
expect:
status: 200
extract:
token: "response.access_token"
- name: get_profile
request:
method: GET
url: /profile
headers:
Authorization: "Bearer {{ token }}"
expect:
status: 200# Run all `.yatl.yaml` files in a directory
yatl .
# Run with 5 parallel workers on `tests/` directory
yatl tests/ --workers 5Every YATL test is a YAML file with a .yatl.yaml extension. The structure is simple:
name: Test Suite Name
base_url: https://api.example.com
steps:
- name: step_one
request:
method: GET
url: /endpoint
expect:
status: 200
body:
json:
field: "expected_value"See the full documentation for all available options.
Full documentation is available in the docs/ directory:
YATL fits seamlessly into CI pipelines. Example GitHub Actions workflow:
testing_api:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Python
uses: actions/setup-python@v4
with:
python-version: 3.14
- name: install yatl
run: pip install yatl-testing
- name: run tests
run: yatl ./api_testsIf you find this project useful, please star it on GitHub. It really motivates me! ⭐️