TESTML v0.4 Open Source

Write tests once. Run them in every language.

Built for polyglot teams. One YAML-style syntax. Real interop across Python, JavaScript, Ruby, Perl, and Java. No vendor lock-in. No duplicated suites.

License
MIT — fully open
Runtimes
5+ languages
Install
pip · npm · gem
TestML brand still — abstract, precise developer-tool aesthetic in teal and near-black
tests/login.tml Pass
$ testml run tests/login.tml 12/12 assertions · 84ms

platform · v0.4

One syntax. Every runtime.

Write your test once in TestML. Ship it to five runtimes. The same suite drives Python, JavaScript, Ruby, Perl, and Java. No rewrites.

tests/login.tml PASSED · 4/4 · 2.41s
%TestML 0.4.0 Title = 'Login Form Validation' valid_email accepts %1 ==> true - 'alice@testml.dev' - 'bob+filter@studio.io' valid_email rejects %1 ==> false - 'missing-at-symbol.com' - 'two spaces here'

Runnable in every bridge.

The same .tml file drives every runtime. Tests stay declarative. Data stays portable.

01 · Bridges

Five runtimes. One file.

Bridges land in Python, JavaScript, Ruby, Perl, and Java. Your suite runs the same way in each one.

  • Python
  • JavaScript
  • Ruby
  • Perl
  • Java

02 · Pipelines

Hook into any CI.

Wire it to GitHub Actions, GitLab, or Jenkins. Output is JUnit XML. Reports plug into the tools you already trust.

testml run --report junit

03 · License

Zero lock-in. Ever.

TestML is open source under a permissive license. No paid tiers. No phone home. Fork it. Own it.

Read the spec

Adoption · live signal

The numbers behind “write once, run everywhere.”

updated 2026-05-20 · v0.4.2

github.com/testml

3,847

GitHub stars

Growing 40 new stars per week.

language runtimes

11langs

Supported targets

Python, JS, Ruby, Perl, Java, Go, Rust, PHP, C#, Lua, Bash.

average reuse

4.6×

Test reuse ratio

One test file. Runs in 4.6 stacks on average.

ci providers

18CIs

Native integrations

GitHub Actions, GitLab, CircleCI, Buildkite and more.

$ testml --statsopen-source. no telemetry. no signup. read the spec

One file · Two harnesses

Same test. Both runtimes. Zero edits.

One TestML file. Two harnesses run it. The Python and Node results match, line for line. No fork. No rewrite.

tests/string-add.tml UTF-8 · 14 lines
%TestML 0.4 %Import: math_lib === Add two integers + a: 2 + b: 3 + sum: 5 === Concat two strings + left: "hello" + right: " world" + out: "hello world" # Same data. Any host. No edits.
harness/python 3.12 0.04s
testml-py tests/string-add.tml
Add two integers18ms
Concat two strings22ms
2 passed · 0 failed · 0 skippedexit 0
harness/node 20.11 0.06s
testml-node tests/string-add.tml
Add two integers24ms
Concat two strings36ms
2 passed · 0 failed · 0 skippedexit 0
Source
One file. No language code. Plain TestML.
Harnesses
Python, Node, Ruby, Perl, Java. Pick any.
Result
Same pass list. Same exit code. Every time.

Field notes / polyglot teams

Engineers who ship in three languages now run one suite.

Polyglot teams use TestML to drop duplicate suites and cut CI time. Here is what they say. No demos required.

  • tests/passing t-01

    Three teams. Three test suites. Same checks. We merged them with TestML. CI now runs in half the time.

    Priya Nair QA Lead — Fintech payments platform python · ruby · java
  • tests/passing t-02

    Our CI used to fork into language jobs. Now it is one job. One syntax. Same tests. Builds are faster. Flakes are gone.

    Marcus Holt Platform Engineer — Cloud infra, eight services go · node · python
  • tests/passing t-03

    I ship libs in four languages. Writing parallel suites burned half my week. Now I write the suite once. The bindings do the rest.

    Yuki Tanaka OSS Maintainer — schema-tools, since v0.2 perl · js · rust · python
// signal3 of 142 case notesupdated 2026-05 Read the full set in /examples or join the community.

// status: ready

Write tests once. Run everywhere.

Two ways to start with TestML today. Pick the path that fits your team. Both are free and fully open source.

for developers

Ship your first portable test in ten minutes.

Install the runner. Write one YAML file. Run it in Python, Node, Ruby, or Java. No license keys. No sign-up wall.

Get Started Free

for the community

Help shape the cross-language spec.

TestML is built in the open. Read the spec. Open a pull request. Add a runtime for your favorite language. We ship in days.

Contribute Now
  • MIT licensed
  • No sign-up
  • Six languages, one syntax
  • Read the docs