TESTMLv0.4Open 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.

LicenseMIT — fully open
Runtimes5+ languages
Installpip · npm · gem
tests/login.tmlPass
# Reusable across Python, JS, Ruby, Java
test: "Login returns a valid session"
when:
  POST: "/api/login"
  body:
    email: "dev@testml.org"
    password: "$ENV.PW"
then:
  status: 200
  json:
    session: "/^sess_[a-z0-9]{16}$/"
    expires_in: 3600

// 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.tmlPASSED · 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

11

langs

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

18

CIs

Native integrations

GitHub Actions, GitLab, CircleCI, Buildkite and more.

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.tmlUTF-8 · 14 lines
1%TestML 0.4
2%Import: math_lib
3
4=== Add two integers
5+ a: 2
6+ b: 3
7+ sum: 5
8
9=== Concat two strings
10+ left: "hello"
11+ right: " world"
12+ out: "hello world"
13
14# Same data. Any host. No edits.
harness/python 3.120.04s
$testml-py tests/string-add.tml
Add two integers18ms
Concat two strings22ms
2 passed · 0 failed · 0 skippedexit 0
harness/node 20.110.06s
$testml-node tests/string-add.tml
Add two integers24ms
Concat two strings36ms
2 passed · 0 failed · 0 skippedexit 0
SourceOne file. No language code. Plain TestML.
HarnessesPython, Node, Ruby, Perl, Java. Pick any.
ResultSame 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/passingt-01

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

    Priya NairQA LeadFintech payments platformpython · ruby · java
  • tests/passingt-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 HoltPlatform EngineerCloud infra, eight servicesgo · node · python
  • tests/passingt-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 TanakaOSS Maintainerschema-tools, since v0.2perl · js · rust · python
// signal3 of 142 case notesupdated 2026-05Read 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 licensedNo sign-upSix languages, one syntaxRead the docs