Tests belong to the spec, not the language.
A login flow is a login flow. Python should not own it. Java should not own it. We write the spec once. Every runtime reads the same file.
TestML is a spec, not a vendor. One YAML-style file holds the cases. Five runtimes read it the same way. No more re-writing the same login test in Python and Java and Ruby.
The spec is short. The runtimes are small. These rules keep us honest when scope creeps. Read them as a contract.
A login flow is a login flow. Python should not own it. Java should not own it. We write the spec once. Every runtime reads the same file.
Real teams ship in five languages. They re-implement the same assertions five times. That is wasted work. TestML refuses to accept it.
Plain text wins. It diffs in Git. It reads in pull requests. It loads in any language without a parser fight.
MIT license. No vendor seats. No locked tiers. The spec is the product. The runtimes are community-owned.
We measure success in pass dots, not stars. A framework that fails CI is not a framework. It is a liability.
Every choice maps back to one of these. If a feature breaks a pillar, we cut the feature.
Author a test once. Run it under Python, JavaScript, Ruby, Perl, or Java. Same assertions. Same fixtures. Same pass criteria.
Cases live next to the spec. No glue code. Add a row to add a case. Drop a row to drop one. That is the whole loop.
TestML is a spec first. Runtimes follow it. That means no plugin lock-in and no breaking moves between releases.
Roadmap on GitHub. RFCs in public. Community governance with no paywall behind the docs.
Most testing tools list features. We list constraints. A clear no makes a clear yes possible.
Pick the language your service uses. Install the runtime. Point it at the same .tml file. The pass dot goes green.
$ pip install testmlstable$ npm i testmlstable$ gem install testmlstable$ cpan TestMLstable$ maven: org.testmlstablePick a language. Install in one line. Drop in a .tml file. The first green pass dot takes about three minutes.