Skip to content

Why not Cucumber?

Executable Stories gives you given/when/then wording and readable docs, but it is not Cucumber. We stay inside your test runner and your codebase.

Terminal output
Raw terminal test output
Generated report
Clean HTML report from the same tests

You write TypeScript, JavaScript, or Ruby, not Gherkin. Stories and steps live alongside your normal tests in .test.ts / .spec.ts / .rb files. There are no .feature files to keep in sync.

Steps are inline functions, not regex-matched definitions. You don’t define “When I click the button” in one file and use it from another. You write the step and its implementation in the same place, so refactors and renames stay in sync and types work.

There is no shared “world” or context object. Use normal variables and closures (and framework fixtures in Playwright). Same mental model as any other test in Jest, Vitest, Playwright, or Ruby’s Minitest and RSpec adapters.

The reporter outputs plain Markdown with natural-language sections. You can paste it into Confluence, Notion, or any Markdown renderer. Stakeholders see “Given … When … Then …” without needing to understand the test runner.

We add story metadata to your existing tests; we don’t replace describe / it or test.

  • Your tests — You keep describe() and it() (or test.describe() and test()). We don’t take over the test lifecycle.
  • Opt-in docs — Call story.init(task) (or story.init() / story.init(testInfo) for Jest/Playwright, or ExecutableStories.init(...) / story(...) in Ruby) at the start of a test, then story.given, story.when, story.then to attach step labels. The scenario title in the report is the it/test name.
  • Modifiers — Use the framework’s own: it.skip, it.only, test.fail, etc. No custom step registry.
  • No enforced step order — Steps are just labels inside one test; filter and run tests with the framework’s normal options (-t, --watch, etc.).

If you want BDD-style wording and shareable docs without a separate Gherkin runtime, executable-stories is built for that.