{
  "product": "Specification (reference)",
  "title": "Test Runner",
  "summary": "Run tests, report failures usefully, and stay fast enough to run often.",
  "category": "devtools",
  "entries": [
    {
      "path": [
        "AI",
        "Discovery",
        "Find tests by glob and naming convention"
      ],
      "value": "",
      "status": "yes",
      "note": ""
    },
    {
      "path": [
        "AI",
        "Discovery",
        "Filter by name pattern, file or tag"
      ],
      "value": "",
      "status": "yes",
      "note": ""
    },
    {
      "path": [
        "AI",
        "Structure",
        "Suites, cases and nesting"
      ],
      "value": "",
      "status": "yes",
      "note": ""
    },
    {
      "path": [
        "AI",
        "Structure",
        "Setup and teardown at each level"
      ],
      "value": "",
      "status": "yes",
      "note": "teardown runs even when a test throws"
    },
    {
      "path": [
        "AI",
        "Structure",
        "Skip, only and todo markers"
      ],
      "value": "",
      "status": "yes",
      "note": ""
    },
    {
      "path": [
        "AI",
        "Assertions",
        "Assertion library or a documented pluggable one"
      ],
      "value": "",
      "status": "yes",
      "note": ""
    },
    {
      "path": [
        "AI",
        "Assertions",
        "Deep equality with a readable diff"
      ],
      "value": "",
      "status": "yes",
      "note": ""
    },
    {
      "path": [
        "AI",
        "Assertions",
        "Async tests and rejection assertions"
      ],
      "value": "",
      "status": "yes",
      "note": ""
    },
    {
      "path": [
        "AI",
        "Assertions",
        "Snapshot testing with review and update"
      ],
      "value": "",
      "status": "yes",
      "note": ""
    },
    {
      "path": [
        "AI",
        "Isolation",
        "Per-file isolation and parallel workers"
      ],
      "value": "",
      "status": "yes",
      "note": ""
    },
    {
      "path": [
        "AI",
        "Isolation",
        "Deterministic ordering option"
      ],
      "value": "",
      "status": "yes",
      "note": "and a randomised mode to catch coupling"
    },
    {
      "path": [
        "AI",
        "Isolation",
        "Per-test timeout"
      ],
      "value": "",
      "status": "yes",
      "note": "a hang fails rather than blocks"
    },
    {
      "path": [
        "AI",
        "Reporting",
        "Failure shows expected, received and the stack in user code"
      ],
      "value": "",
      "status": "yes",
      "note": ""
    },
    {
      "path": [
        "AI",
        "Reporting",
        "Machine formats"
      ],
      "value": "JUnit XML, JSON",
      "status": "yes",
      "note": "for CI"
    },
    {
      "path": [
        "AI",
        "Reporting",
        "Summary with counts and duration; slowest tests"
      ],
      "value": "",
      "status": "yes",
      "note": ""
    },
    {
      "path": [
        "AI",
        "Coverage",
        "Line and branch coverage with thresholds"
      ],
      "value": "",
      "status": "yes",
      "note": ""
    },
    {
      "path": [
        "AI",
        "Watch",
        "Re-run only tests affected by a change"
      ],
      "value": "",
      "status": "yes",
      "note": ""
    },
    {
      "path": [
        "AI",
        "Exit",
        "Non-zero exit on any failure"
      ],
      "value": "",
      "status": "yes",
      "note": "including unhandled rejections"
    }
  ]
}
