Cucumber Messages — Passing Checkout Run (NDJSON)
The machine twin of checkout.feature: the cucumber-messages envelope stream a runner emits, with meta, source, gherkinDocument, one pickle per expanded scenario, and paired testStepStarted/testStepFinished envelopes carrying nanosecond durations. Written as NDJSON because that is the format's actual wire shape — one envelope per line, not a JSON array.
{"meta": {"protocolVersion": "24.0.0", "implementation": {"name": "cucumber-js", "version": "11.0.1"}, "runtime": {"name": "node.js", "version": "22.6.0"}, "os": {"name": "linux", "version": "6.8.0"}, "cpu": {"name": "x86_64"}, "ci": {"name": "Novus Sample CI", "url": "https://ci.example.com/builds/4821", "buildNumber": "4821"}}}
{"source": {"uri": "features/checkout.feature", "data": "# language: en\n@checkout @smoke\nFeature: Checkout totals\n As a shopper\n I want the cart total to include tax and discounts\n So that I am never surprised at the payment step\n\n Background:\n Given the catalogue contains:\n | sku | name | price |\n | NX-1042 | Sample desk lamp | 12.99 |\n | NX-2087 | Sample notebook | 4.50 |\n And the tax rate is 20 percent\n\n @pricing\n Scenario: A single-item cart shows tax separately\n Given my cart is empty\n When I add 1 of \"NX-1042\"\n Then the subtotal is \"12.99\"\n And the tax is \"2.60\"\n And the total is \"15.59\"\n\n @pricing @outline\n Scenario Outline: Quantity multiplies the subtotal\n Given my cart is empty\n When I add <quantity> of \"<sku>\"\n Then the subtotal is \"<subtotal>\"\n\n Examples: whole units\n | sku | quantity | subtotal |\n | NX-1042 | 1 | 12.99 |\n | NX-1042 | 3 | 38.97 |\n | NX-2087 | 2 | 9.00 |\n\n @edge\n Examples: boundary quantities\n | sku | quantity | subtotal |\n | NX-1042 | 0 | 0.00 |\n\n @receipt\n Scenario: The receipt renders as plain text\n Given my cart contains 1 of \"NX-1042\"\n When I request the receipt\n Then the receipt reads:\n \"\"\"\n Novus Checkout SAMPLE receipt\n 1 x Sample desk lamp 12.99\n Tax (20 percent) 2.60\n Total 15.59\n \"\"\"\n", "mediaType": "text/x.cucumber.gherkin+plain"}}
{"gherkinDocument": {"uri": "features/checkout.feature", "feature": {"location": {"line": 3, "column": 1}, "language": "en", "keyword": "Feature", "name": "Checkout totals", "description": " As a shopper\n I want the cart total to include tax and discounts\n So that I am never surprised at the payment step", "tags": [{"location": {"line": 2, "column": 1}, "name": "@checkout", "id": "t-1"}, {"location": {"line": 2, "column": 11}, "name": "@smoke", "id": "t-2"}], "children": [{"background": {"location": {"line": 8, "column": 3}, "keyword": "Background", "name": "", "id": "bg-1", "steps": [{"id": "s-bg-1", "keyword": "Given ", "keywordType": "Context", "text": "the catalogue contains:", "location": {"line": 9, "column": 5}}, {"id": "s-bg-2", "keyword": "And ", "keywordType": "Conjunction", "text": "the tax rate is 20 percent", "location": {"line": 13, "column": 5}}]}}, {"scenario": {"id": "sc-1", "keyword": "Scenario", "name": "A single-item cart shows tax separately", "location": {"line": 16, "column": 3}, "tags": [{"name": "@pricing", "id": "t-3", "location": {"line": 15, "column": 3}}], "steps": [], "examples": []}}, {"scenario": {"id": "sc-2", "keyword": "Scenario Outline", "name": "Quantity multiplies the subtotal", "location": {"line": 24, "column": 3}, "tags": [{"name": "@pricing", "id": "t-4", "location": {"line": 23, "column": 3}}, {"name": "@outline", "id": "t-5", "location": {"line": 23, "column": 12}}], "steps": [], "examples": [{"id": "ex-1", "keyword": "Examples", "name": "whole units", "location": {"line": 29, "column": 5}, "tags": []}, {"id": "ex-2", "keyword": "Examples", "name": "boundary quantities", "location": {"line": 36, "column": 5}, "tags": [{"name": "@edge", "id": "t-6", "location": {"line": 35, "column": 5}}]}]}}, {"scenario": {"id": "sc-3", "keyword": "Scenario", "name": "The receipt renders as plain text", "location": {"line": 41, "column": 3}, "tags": [{"name": "@receipt", "id": "t-7", "location": {"line": 40, "column": 3}}], "steps": [], "examples": []}}]}}}
{"pickle": {"id": "pk-1", "uri": "features/checkout.feature", "name": "A single-item cart shows tax separately", "language": "en", "astNodeIds": ["sc-1"], "tags": [{"name": "@checkout", "astNodeId": "t-1"}, {"name": "@smoke", "astNodeId": "t-2"}, {"name": "@pricing", "astNodeId": "t-3"}], "steps": [{"id": "pk-1-s-1", "type": "Context", "text": "step 1 of A single-item cart shows tax separately", "astNodeIds": ["s-1-1"]}, {"id": "pk-1-s-2", "type": "Context", "text": "step 2 of A single-item cart shows tax separately", "astNodeIds": ["s-1-2"]}, {"id": "pk-1-s-3", "type": "Action", "text": "step 3 of A single-item cart shows tax separately", "astNodeIds": ["s-1-3"]}, {"id": "pk-1-s-4", "type": "Action", "text": "step 4 of A single-item cart shows tax separately", "astNodeIds": ["s-1-4"]}, {"id": "pk-1-s-5", "type": "Action", "text": "step 5 of A single-item cart shows tax separately", "astNodeIds": ["s-1-5"]}, {"id": "pk-1-s-6", "type": "Action", "text": "step 6 of A single-item cart shows tax separately", "astNodeIds": ["s-1-6"]}, {"id": "pk-1-s-7", "type": "Action", "text": "step 7 of A single-item cart shows tax separately", "astNodeIds": ["s-1-7"]}]}}
{"pickle": {"id": "pk-2", "uri": "features/checkout.feature", "name": "Quantity multiplies the subtotal", "language": "en", "astNodeIds": ["sc-2"], "tags": [{"name": "@checkout", "astNodeId": "t-1"}, {"name": "@smoke", "astNodeId": "t-2"}, {"name": "@pricing", "astNodeId": "t-3"}, {"name": "@outline", "astNodeId": "t-4"}], "steps": [{"id": "pk-2-s-1", "type": "Context", "text": "step 1 of Quantity multiplies the subtotal", "astNodeIds": ["s-2-1"]}, {"id": "pk-2-s-2", "type": "Context", "text": "step 2 of Quantity multiplies the subtotal", "astNodeIds": ["s-2-2"]}, {"id": "pk-2-s-3", "type": "Action", "text": "step 3 of Quantity multiplies the subtotal", "astNodeIds": ["s-2-3"]}, {"id": "pk-2-s-4", "type": "Action", "text": "step 4 of Quantity multiplies the subtotal", "astNodeIds": ["s-2-4"]}, {"id": "pk-2-s-5", "type": "Action", "text": "step 5 of Quantity multiplies the subtotal", "astNodeIds": ["s-2-5"]}]}}
{"pickle": {"id": "pk-3", "uri": "features/checkout.feature", "name": "Quantity multiplies the subtotal", "language": "en", "astNodeIds": ["sc-3"], "tags": [{"name": "@checkout", "astNodeId": "t-1"}, {"name": "@smoke", "astNodeId": "t-2"}, {"name": "@pricing", "astNodeId": "t-3"}, {"name": "@outline", "astNodeId": "t-4"}], "steps": [{"id": "pk-3-s-1", "type": "Context", "text": "step 1 of Quantity multiplies the subtotal", "astNodeIds": ["s-3-1"]}, {"id": "pk-3-s-2", "type": "Context", "text": "step 2 of Quantity multiplies the subtotal", "astNodeIds": ["s-3-2"]}, {"id": "pk-3-s-3", "type": "Action", "text": "step 3 of Quantity multiplies the subtotal", "astNodeIds": ["s-3-3"]}, {"id": "pk-3-s-4", "type": "Action", "text": "step 4 of Quantity multiplies the subtotal", "astNodeIds": ["s-3-4"]}, {"id": "pk-3-s-5", "type": "Action", "text": "step 5 of Quantity multiplies the subtotal", "astNodeIds": ["s-3-5"]}]}}
{"pickle": {"id": "pk-4", "uri": "features/checkout.feature", "name": "Quantity multiplies the subtotal", "language": "en", "astNodeIds": ["sc-3"], "tags": [{"name": "@checkout", "astNodeId": "t-1"}, {"name": "@smoke", "astNodeId": "t-2"}, {"name": "@pricing", "astNodeId": "t-3"}, {"name": "@outline", "astNodeId": "t-4"}], "steps": [{"id": "pk-4-s-1", "type": "Context", "text": "step 1 of Quantity multiplies the subtotal", "astNodeIds": ["s-4-1"]}, {"id": "pk-4-s-2", "type": "Context", "text": "step 2 of Quantity multiplies the subtotal", "astNodeIds": ["s-4-2"]}, {"id": "pk-4-s-3", "type": "Action", "text": "step 3 of Quantity multiplies the subtotal", "astNodeIds": ["s-4-3"]}, {"id": "pk-4-s-4", "type": "Action", "text": "step 4 of Quantity multiplies the subtotal", "astNodeIds": ["s-4-4"]}, {"id": "pk-4-s-5", "type": "Action", "text": "step 5 of Quantity multiplies the subtotal", "astNodeIds": ["s-4-5"]}]}}
{"pickle": {"id": "pk-5", "uri": "features/checkout.feature", "name": "Quantity multiplies the subtotal", "language": "en", "astNodeIds": ["sc-3"], "tags": [{"name": "@checkout", "astNodeId": "t-1"}, {"name": "@smoke", "astNodeId": "t-2"}, {"name": "@pricing", "astNodeId": "t-3"}, {"name": "@outline", "astNodeId": "t-4"}, {"name": "@edge", "astNodeId": "t-5"}], "steps": [{"id": "pk-5-s-1", "type": "Context", "text": "step 1 of Quantity multiplies the subtotal", "astNodeIds": ["s-5-1"]}, {"id": "pk-5-s-2", "type": "Context", "text": "step 2 of Quantity multiplies the subtotal", "astNodeIds": ["s-5-2"]}, {"id": "pk-5-s-3", "type": "Action", "text": "step 3 of Quantity multiplies the subtotal", "astNodeIds": ["s-5-3"]}, {"id": "pk-5-s-4", "type": "Action", "text": "step 4 of Quantity multiplies the subtotal", "astNodeIds": ["s-5-4"]}, {"id": "pk-5-s-5", "type": "Action", "text": "step 5 of Quantity multiplies the subtotal", "astNodeIds": ["s-5-5"]}]}}
{"pickle": {"id": "pk-6", "uri": "features/checkout.feature", "name": "The receipt renders as plain text", "language": "en", "astNodeIds": ["sc-3"], "tags": [{"name": "@checkout", "astNodeId": "t-1"}, {"name": "@smoke", "astNodeId": "t-2"}, {"name": "@receipt", "astNodeId": "t-3"}], "steps": [{"id": "pk-6-s-1", "type": "Context", "text": "step 1 of The receipt renders as plain text", "astNodeIds": ["s-6-1"]}, {"id": "pk-6-s-2", "type": "Context", "text": "step 2 of The receipt renders as plain text", "astNodeIds": ["s-6-2"]}, {"id": "pk-6-s-3", "type": "Action", "text": "step 3 of The receipt renders as plain text", "astNodeIds": ["s-6-3"]}, {"id": "pk-6-s-4", "type": "Action", "text": "step 4 of The receipt renders as plain text", "astNodeIds": ["s-6-4"]}, {"id": "pk-6-s-5", "type": "Action", "text": "step 5 of The receipt renders as plain text", "astNodeIds": ["s-6-5"]}]}}
{"testRunStarted": {"timestamp": {"seconds": 1786000401, "nanos": 0}, "id": "run-1"}}
{"testCase": {"id": "tc-1", "pickleId": "pk-1", "testRunStartedId": "run-1", "testSteps": [{"id": "tc-1-ts-1", "pickleStepId": "pk-1-s-1", "stepDefinitionIds": ["sd-1"], "stepMatchArgumentsLists": [{"stepMatchArguments": []}]}, {"id": "tc-1-ts-2", "pickleStepId": "pk-1-s-2", "stepDefinitionIds": ["sd-2"], "stepMatchArgumentsLists": [{"stepMatchArguments": []}]}, {"id": "tc-1-ts-3", "pickleStepId": "pk-1-s-3", "stepDefinitionIds": ["sd-3"], "stepMatchArgumentsLists": [{"stepMatchArguments": []}]}, {"id": "tc-1-ts-4", "pickleStepId": "pk-1-s-4", "stepDefinitionIds": ["sd-4"], "stepMatchArgumentsLists": [{"stepMatchArguments": []}]}, {"id": "tc-1-ts-5", "pickleStepId": "pk-1-s-5", "stepDefinitionIds": ["sd-5"], "stepMatchArgumentsLists": [{"stepMatchArguments": []}]}, {"id": "tc-1-ts-6", "pickleStepId": "pk-1-s-6", "stepDefinitionIds": ["sd-6"], "stepMatchArgumentsLists": [{"stepMatchArguments": []}]}, {"id": "tc-1-ts-7", "pickleStepId": "pk-1-s-7", "stepDefinitionIds": ["sd-7"], "stepMatchArgumentsLists": [{"stepMatchArguments": []}]}]}}
{"testCase": {"id": "tc-2", "pickleId": "pk-2", "testRunStartedId": "run-1", "testSteps": [{"id": "tc-2-ts-1", "pickleStepId": "pk-2-s-1", "stepDefinitionIds": ["sd-1"], "stepMatchArgumentsLists": [{"stepMatchArguments": []}]}, {"id": "tc-2-ts-2", "pickleStepId": "pk-2-s-2", "stepDefinitionIds": ["sd-2"], "stepMatchArgumentsLists": [{"stepMatchArguments": []}]}, {"id": "tc-2-ts-3", "pickleStepId": "pk-2-s-3", "stepDefinitionIds": ["sd-3"], "stepMatchArgumentsLists": [{"stepMatchArguments": []}]}, {"id": "tc-2-ts-4", "pickleStepId": "pk-2-s-4", "stepDefinitionIds": ["sd-4"], "stepMatchArgumentsLists": [{"stepMatchArguments": []}]}, {"id": "tc-2-ts-5", "pickleStepId": "pk-2-s-5", "stepDefinitionIds": ["sd-5"], "stepMatchArgumentsLists": [{"stepMatchArguments": []}]}]}}
{"testCase": {"id": "tc-3", "pickleId": "pk-3", "testRunStartedId": "run-1", "testSteps": [{"id": "tc-3-ts-1", "pickleStepId": "pk-3-s-1", "stepDefinitionIds": ["sd-1"], "stepMatchArgumentsLists": [{"stepMatchArguments": []}]}, {"id": "tc-3-ts-2", "pickleStepId": "pk-3-s-2", "stepDefinitionIds": ["sd-2"], "stepMatchArgumentsLists": [{"stepMatchArguments": []}]}, {"id": "tc-3-ts-3", "pickleStepId": "pk-3-s-3", "stepDefinitionIds": ["sd-3"], "stepMatchArgumentsLists": [{"stepMatchArguments": []}]}, {"id": "tc-3-ts-4", "pickleStepId": "pk-3-s-4", "stepDefinitionIds": ["sd-4"], "stepMatchArgumentsLists": [{"stepMatchArguments": []}]}, {"id": "tc-3-ts-5", "pickleStepId": "pk-3-s-5", "stepDefinitionIds": ["sd-5"], "stepMatchArgumentsLists": [{"stepMatchArguments": []}]}]}}
{"testCase": {"id": "tc-4", "pickleId": "pk-4", "testRunStartedId": "run-1", "testSteps": [{"id": "tc-4-ts-1", "pickleStepId": "pk-4-s-1", "stepDefinitionIds": ["sd-1"], "stepMatchArgumentsLists": [{"stepMatchArguments": []}]}, {"id": "tc-4-ts-2", "pickleStepId": "pk-4-s-2", "stepDefinitionIds": ["sd-2"], "stepMatchArgumentsLists": [{"stepMatchArguments": []}]}, {"id": "tc-4-ts-3", "pickleStepId": "pk-4-s-3", "stepDefinitionIds": ["sd-3"], "stepMatchArgumentsLists": [{"stepMatchArguments": []}]}, {"id": "tc-4-ts-4", "pickleStepId": "pk-4-s-4", "stepDefinitionIds": ["sd-4"], "stepMatchArgumentsLists": [{"stepMatchArguments": []}]}, {"id": "tc-4-ts-5", "pickleStepId": "pk-4-s-5", "stepDefinitionIds": ["sd-5"], "stepMatchArgumentsLists": [{"stepMatchArguments": []}]}]}}
{"testCase": {"id": "tc-5", "pickleId": "pk-5", "testRunStartedId": "run-1", "testSteps": [{"id": "tc-5-ts-1", "pickleStepId": "pk-5-s-1", "stepDefinitionIds": ["sd-1"], "stepMatchArgumentsLists": [{"stepMatchArguments": []}]}, {"id": "tc-5-ts-2", "pickleStepId": "pk-5-s-2", "stepDefinitionIds": ["sd-2"], "stepMatchArgumentsLists": [{"stepMatchArguments": []}]}, {"id": "tc-5-ts-3", "pickleStepId": "pk-5-s-3", "stepDefinitionIds": ["sd-3"], "stepMatchArgumentsLists": [{"stepMatchArguments": []}]}, {"id": "tc-5-ts-4", "pickleStepId": "pk-5-s-4", "stepDefinitionIds": ["sd-4"], "stepMatchArgumentsLists": [{"stepMatchArguments": []}]}, {"id": "tc-5-ts-5", "pickleStepId": "pk-5-s-5", "stepDefinitionIds": ["sd-5"], "stepMatchArgumentsLists": [{"stepMatchArguments": []}]}]}}
{"testCase": {"id": "tc-6", "pickleId": "pk-6", "testRunStartedId": "run-1", "testSteps": [{"id": "tc-6-ts-1", "pickleStepId": "pk-6-s-1", "stepDefinitionIds": ["sd-1"], "stepMatchArgumentsLists": [{"stepMatchArguments": []}]}, {"id": "tc-6-ts-2", "pickleStepId": "pk-6-s-2", "stepDefinitionIds": ["sd-2"], "stepMatchArgumentsLists": [{"stepMatchArguments": []}]}, {"id": "tc-6-ts-3", "pickleStepId": "pk-6-s-3", "stepDefinitionIds": ["sd-3"], "stepMatchArgumentsLists": [{"stepMatchArguments": []}]}, {"id": "tc-6-ts-4", "pickleStepId": "pk-6-s-4", "stepDefinitionIds": ["sd-4"], "stepMatchArgumentsLists": [{"stepMatchArguments": []}]}, {"id": "tc-6-ts-5", "pickleStepId": "pk-6-s-5", "stepDefinitionIds": ["sd-5"], "stepMatchArgumentsLists": [{"stepMatchArguments": []}]}]}}
{"testCaseStarted": {"id": "tcs-1", "testCaseId": "tc-1", "attempt": 0, "timestamp": {"seconds": 1786000402, "nanos": 0}}}
{"testStepStarted": {"testStepId": "tc-1-ts-1", "testCaseStartedId": "tcs-1", "timestamp": {"seconds": 1786000402, "nanos": 40000000}}}
{"testStepFinished": {"testStepId": "tc-1-ts-1", "testCaseStartedId": "tcs-1", "testStepResult": {"status": "PASSED", "duration": {"seconds": 0, "nanos": 39000000}}, "timestamp": {"seconds": 1786000402, "nanos": 45000000}}}
{"testStepStarted": {"testStepId": "tc-1-ts-2", "testCaseStartedId": "tcs-1", "timestamp": {"seconds": 1786000402, "nanos": 80000000}}}
{"testStepFinished": {"testStepId": "tc-1-ts-2", "testCaseStartedId": "tcs-1", "testStepResult": {"status": "PASSED", "duration": {"seconds": 0, "nanos": 40000000}}, "timestamp": {"seconds": 1786000402, "nanos": 90000000}}}
{"testStepStarted": {"testStepId": "tc-1-ts-3", "testCaseStartedId": "tcs-1", "timestamp": {"seconds": 1786000402, "nanos": 120000000}}}
{"testStepFinished": {"testStepId": "tc-1-ts-3", "testCaseStartedId": "tcs-1", "testStepResult": {"status": "PASSED", "duration": {"seconds": 0, "nanos": 41000000}}, "timestamp": {"seconds": 1786000402, "nanos": 135000000}}}
{"testStepStarted": {"testStepId": "tc-1-ts-4", "testCaseStartedId": "tcs-1", "timestamp": {"seconds": 1786000402, "nanos": 160000000}}}
{"testStepFinished": {"testStepId": "tc-1-ts-4", "testCaseStartedId": "tcs-1", "testStepResult": {"status": "PASSED", "duration": {"seconds": 0, "nanos": 42000000}}, "timestamp": {"seconds": 1786000402, "nanos": 180000000}}}
{"testStepStarted": {"testStepId": "tc-1-ts-5", "testCaseStartedId": "tcs-1", "timestamp": {"seconds": 1786000402, "nanos": 200000000}}}
{"testStepFinished": {"testStepId": "tc-1-ts-5", "testCaseStartedId": "tcs-1", "testStepResult": {"status": "PASSED", "duration": {"seconds": 0, "nanos": 43000000}}, "timestamp": {"seconds": 1786000402, "nanos": 225000000}}}
{"testStepStarted": {"testStepId": "tc-1-ts-6", "testCaseStartedId": "tcs-1", "timestamp": {"seconds": 1786000402, "nanos": 240000000}}}
{"testStepFinished": {"testStepId": "tc-1-ts-6", "testCaseStartedId": "tcs-1", "testStepResult": {"status": "PASSED", "duration": {"seconds": 0, "nanos": 44000000}}, "timestamp": {"seconds": 1786000402, "nanos": 270000000}}}
{"testStepStarted": {"testStepId": "tc-1-ts-7", "testCaseStartedId": "tcs-1", "timestamp": {"seconds": 1786000402, "nanos": 280000000}}}
{"testStepFinished": {"testStepId": "tc-1-ts-7", "testCaseStartedId": "tcs-1", "testStepResult": {"status": "PASSED", "duration": {"seconds": 0, "nanos": 45000000}}, "timestamp": {"seconds": 1786000402, "nanos": 315000000}}}
{"testCaseFinished": {"testCaseStartedId": "tcs-1", "willBeRetried": false, "timestamp": {"seconds": 1786000403, "nanos": 0}}}
{"testCaseStarted": {"id": "tcs-2", "testCaseId": "tc-2", "attempt": 0, "timestamp": {"seconds": 1786000404, "nanos": 0}}}
{"testStepStarted": {"testStepId": "tc-2-ts-1", "testCaseStartedId": "tcs-2", "timestamp": {"seconds": 1786000404, "nanos": 40000000}}}
{"testStepFinished": {"testStepId": "tc-2-ts-1", "testCaseStartedId": "tcs-2", "testStepResult": {"status": "PASSED", "duration": {"seconds": 0, "nanos": 39000000}}, "timestamp": {"seconds": 1786000404, "nanos": 45000000}}}
{"testStepStarted": {"testStepId": "tc-2-ts-2", "testCaseStartedId": "tcs-2", "timestamp": {"seconds": 1786000404, "nanos": 80000000}}}
{"testStepFinished": {"testStepId": "tc-2-ts-2", "testCaseStartedId": "tcs-2", "testStepResult": {"status": "PASSED", "duration": {"seconds": 0, "nanos": 40000000}}, "timestamp": {"seconds": 1786000404, "nanos": 90000000}}}
{"testStepStarted": {"testStepId": "tc-2-ts-3", "testCaseStartedId": "tcs-2", "timestamp": {"seconds": 1786000404, "nanos": 120000000}}}
{"testStepFinished": {"testStepId": "tc-2-ts-3", "testCaseStartedId": "tcs-2", "testStepResult": {"status": "PASSED", "duration": {"seconds": 0, "nanos": 41000000}}, "timestamp": {"seconds": 1786000404, "nanos": 135000000}}}
{"testStepStarted": {"testStepId": "tc-2-ts-4", "testCaseStartedId": "tcs-2", "timestamp": {"seconds": 1786000404, "nanos": 160000000}}}
{"testStepFinished": {"testStepId": "tc-2-ts-4", "testCaseStartedId": "tcs-2", "testStepResult": {"status": "PASSED", "duration": {"seconds": 0, "nanos": 42000000}}, "timestamp": {"seconds": 1786000404, "nanos": 180000000}}}
{"testStepStarted": {"testStepId": "tc-2-ts-5", "testCaseStartedId": "tcs-2", "timestamp": {"seconds": 1786000404, "nanos": 200000000}}}
{"testStepFinished": {"testStepId": "tc-2-ts-5", "testCaseStartedId": "tcs-2", "testStepResult": {"status": "PASSED", "duration": {"seconds": 0, "nanos": 43000000}}, "timestamp": {"seconds": 1786000404, "nanos": 225000000}}}
{"testCaseFinished": {"testCaseStartedId": "tcs-2", "willBeRetried": false, "timestamp": {"seconds": 1786000405, "nanos": 0}}}
{"testCaseStarted": {"id": "tcs-3", "testCaseId": "tc-3", "attempt": 0, "timestamp": {"seconds": 1786000406, "nanos": 0}}}
{"testStepStarted": {"testStepId": "tc-3-ts-1", "testCaseStartedId": "tcs-3", "timestamp": {"seconds": 1786000406, "nanos": 40000000}}}
{"testStepFinished": {"testStepId": "tc-3-ts-1", "testCaseStartedId": "tcs-3", "testStepResult": {"status": "PASSED", "duration": {"seconds": 0, "nanos": 39000000}}, "timestamp": {"seconds": 1786000406, "nanos": 45000000}}}
{"testStepStarted": {"testStepId": "tc-3-ts-2", "testCaseStartedId": "tcs-3", "timestamp": {"seconds": 1786000406, "nanos": 80000000}}}
{"testStepFinished": {"testStepId": "tc-3-ts-2", "testCaseStartedId": "tcs-3", "testStepResult": {"status": "PASSED", "duration": {"seconds": 0, "nanos": 40000000}}, "timestamp": {"seconds": 1786000406, "nanos": 90000000}}}
{"testStepStarted": {"testStepId": "tc-3-ts-3", "testCaseStartedId": "tcs-3", "timestamp": {"seconds": 1786000406, "nanos": 120000000}}}Specifications
- Seed
- 61200
- Encoding
- UTF-8
- Line Endings
- LF
- Protocol Version
- 24.0.0
- Envelopes
- 93
- Pickles
- 6
- Test Cases
- 6
- Step Results
- 32
- All Passed
- true
- Serialisation
- one JSON envelope per line (NDJSON, the cucumber-messages wire format)
Testing contract
Expected to pass- Scenario
- Reduce a cucumber-messages stream to a per-scenario pass/fail summary.
- Expected result
- 6 test cases and 32 step results are found, every status is PASSED, and testRunFinished reports success true.
What is a .ndjson file?
NDJSON (Newline-Delimited JSON) is a streaming format where each newline-separated line is a standalone JSON object, functionally equivalent to JSON Lines. It enables incremental processing of large datasets and streaming APIs. Each record is parsed independently of the rest.
How to use this file
Use an example NDJSON to test streaming ingestion, chunked HTTP or API response parsing, and tools that process records incrementally without loading the full file.
How to use this file for testing
“Cucumber Messages — Passing Checkout Run (NDJSON)” is a deterministic Novus Examples fixture for JSON parsing, Conversion testing, Schema validation. Flat, deeply nested, JSON Lines, and intentionally invalid JSON for testing parsers and error handling.
Documented properties for this file: seed 61200 · UTF-8 · LF. Compare results against paired or grouped companions on this page when present (clean↔damaged, searchable↔scanned, or format twins) so scores stay reproducible across runs.
Download the file once, keep the path stable in CI or local scripts, and treat the spec table as the contract: dimensions, seeds, field lists, and roles are intentional. Corrupt or invalid samples are labelled as such — expect parsers to fail loudly rather than silently accept them.
Test and coverage reports document their totals (suites, cases, passes, failures, skips, covered lines) in the spec table. Point your CI dashboard, coverage gate, or report converter at the file and assert those counts survive; format twins carry identical numbers so a conversion can be scored exactly.
Feed the file to your parser and assert it handles the documented quirks — quoted delimiters, embedded newlines, ragged rows, or invalid syntax; the valid↔invalid distinction is labelled in the title.
Code examples
import json
with open("checkout-messages.ndjson") as f:
rows = [json.loads(line) for line in f if line.strip()]
print(len(rows))Related files
- jsonCoverage — Istanbul JSON SummaryThe compact json-summary reporter output: a total block plus one block per file, each with lines, statements, functions and branches as total/covered/skipped/pct. This is what coverage badges and pull-request comments are generated from. Every file in this group describes the same four-file source tree and reports 127/140 lines, 17/24 branch outcomes and 18/20 functions, so a converter can be diffed against a known answer.

- jsonAttestation With a Full SPDX PredicateAn in-toto statement whose predicate is an entire SPDX 2.3 document — the nesting that makes attestation payloads large and that a size-limited verifier has to cope with. Every package, version, hash and licence is fictional — the tree describes nothing real.

- jsoncargo-audit Report (JSON)A cargo-audit report that shows three findings while a fourth is on the ignore list, plus an unmaintained-crate warning — so a gate must decide whether warnings count against it. Advisory identifiers use the invented NOVUS-SAMPLE namespace with SAMPLE-CVE aliases; no identifier here refers to a published CVE, GHSA or OSV record, and no package named exists.

- jsonCSAF 2.0 VEX DocumentA CSAF 2.0 VEX advisory with the nested product tree that CSAF requires — vendor, product name, product version — and product_status buckets rather than a per-statement status field. Advisory identifiers use the invented NOVUS-SAMPLE namespace with SAMPLE-CVE aliases; no identifier here refers to a published CVE, GHSA or OSV record, and no package named exists.

- jsonCycloneDX 1.5 Application SBOM (JSON)A CycloneDX 1.5 SBOM of the same fictional tree, useful for spec-version migration tests: 1.5 introduced the object form of metadata.tools and this file uses it, while dropping the 1.6-only external references. Every package, version, hash and licence is fictional — the tree describes nothing real.

- jsonCycloneDX 1.6 Application SBOM (JSON)A complete CycloneDX 1.6 SBOM in JSON for a fictional application and its nine dependencies, with purls, SHA-256 hashes, supplier records, external references and an explicit dependency graph. Every package, version, hash and licence is fictional — the tree describes nothing real.

Generated by generation/testing.py. Free for any use, no attribution required — license.