Quickstart in three commands
~ 5 min readNo demo project to clone. No proprietary runtime. The same three commands work on a fresh laptop or a CI agent.
DOCS v0.4Updated weekly
Read these docs front to back, or jump in. Each guide is short. The grammar is small. Most teams ship their first cross-runtime test in under an hour.
No demo project to clone. No proprietary runtime. The same three commands work on a fresh laptop or a CI agent.
A test file pairs a setup block with one or more assertion blocks. The syntax stays the same in every runtime.
Read the specEach bridge maps TestML primitives onto a host runtime. Pick the bridge for your language. The test file never changes.
See bridgesTables of inputs and expected outputs feed the same assertions. One block can drive hundreds of cases.
View examplesMatch by value, regex, JSON shape, or numeric range. Assertions read like documentation and run like code.
Assertion grammarPull values from the host environment with $ENV. Share fixtures across runtimes without rewriting them.
Fixture rulesRun TestML inside your pipeline. Exit codes, JUnit XML, and a clean diff format slot into existing CI tools.
Pipeline guideINSTALLpick any host
TestML ships through the package manager your team already uses. Pick the host you build in. The test file stays the same.
There is no paid tier. There is no telemetry. The runtime is open source under the MIT licence.
The test key holds a short, plain sentence. Reports and CI output use this name as-is. Write it for the next engineer.
The when block lists what the host runtime does. Call a function. Hit an endpoint. Read a file. One block per case.
The matrix block is a table. Each row becomes a separate run with the same assertions. Edge cases live next to happy paths.
The then block lists assertions. Match a value, a regex, or a JSON shape. Failures point at the row that broke.
The file does not change. Swap the runtime by swapping the bridge. The Python suite and the Java suite stay in sync by default.