[READ-ONLY] Mirror of https://github.com/vitest-dev/vitest. Next generation testing framework powered by Vite. vitest.dev
test testing-tools vite
12

Configure Feed

Select the types of activity you want to include in your feed.

feat!: add meta to json output (#5802)

authored by

Vladimir and committed by
GitHub
(Jun 3, 2024, 9:01 AM +0200) dd754c10 34a310da

+64 -2
+1 -1
docs/advanced/metadata.md
··· 48 48 - If Vitest uses child process, the data will be send as a serialized Buffer via [`process.send`](https://nodejs.org/api/process.html#processsendmessage-sendhandle-options-callback) API 49 49 - If Vitest runs tests in the browser, the data will be stringified using [flatted](https://www.npmjs.com/package/flatted) package 50 50 51 - The general rule of thumb is that you can send almost anything, except for functions, Promises, regexp (`v8.stringify` cannot serialize it, but you can send a string version and parse it in the Node.js process yourself), and other non-serializable data, but you can have cyclic references inside. 51 + This property is also present on every test in the `json` reporter, so make sure that data can be serialized into JSON. 52 52 53 53 Also, make sure you serialize [Error properties](https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Structured_clone_algorithm#error_types) before you set them. 54 54 :::
+5
test/reporters/tests/merge-reports.test.ts
··· 163 163 "ancestorTitles": [], 164 164 "failureMessages": [], 165 165 "fullName": "test 1-1", 166 + "meta": {}, 166 167 "status": "passed", 167 168 "title": "test 1-1", 168 169 }, ··· 173 174 at <root>/fixtures/merge-reports/first.test.ts:15:13", 174 175 ], 175 176 "fullName": "test 1-2", 177 + "meta": {}, 176 178 "status": "failed", 177 179 "title": "test 1-2", 178 180 }, ··· 192 194 at <root>/fixtures/merge-reports/second.test.ts:5:13", 193 195 ], 194 196 "fullName": "test 2-1", 197 + "meta": {}, 195 198 "status": "failed", 196 199 "title": "test 2-1", 197 200 }, ··· 201 204 ], 202 205 "failureMessages": [], 203 206 "fullName": "group test 2-2", 207 + "meta": {}, 204 208 "status": "passed", 205 209 "title": "test 2-2", 206 210 }, ··· 210 214 ], 211 215 "failureMessages": [], 212 216 "fullName": "group test 2-3", 217 + "meta": {}, 213 218 "status": "passed", 214 219 "title": "test 2-3", 215 220 },
+1
test/reporters/tests/__snapshots__/json.test.ts.snap
··· 12 12 "column": 1, 13 13 "line": 5, 14 14 }, 15 + "meta": {}, 15 16 "status": "failed", 16 17 "title": "should fail", 17 18 }
+54
test/reporters/tests/__snapshots__/reporters.spec.ts.snap
··· 105 105 "column": 32, 106 106 "line": 8, 107 107 }, 108 + "meta": {}, 108 109 "status": "failed", 109 110 "title": "Math.sqrt()", 110 111 }, ··· 115 116 "duration": 1.0237109661102295, 116 117 "failureMessages": [], 117 118 "fullName": "suite JSON", 119 + "meta": {}, 118 120 "status": "passed", 119 121 "title": "JSON", 120 122 }, ··· 124 126 ], 125 127 "failureMessages": [], 126 128 "fullName": "suite async with timeout", 129 + "meta": {}, 127 130 "status": "skipped", 128 131 "title": "async with timeout", 129 132 }, ··· 134 137 "duration": 100.50598406791687, 135 138 "failureMessages": [], 136 139 "fullName": "suite timeout", 140 + "meta": {}, 137 141 "status": "passed", 138 142 "title": "timeout", 139 143 }, ··· 144 148 "duration": 20.184875011444092, 145 149 "failureMessages": [], 146 150 "fullName": "suite callback setup success ", 151 + "meta": {}, 147 152 "status": "passed", 148 153 "title": "callback setup success ", 149 154 }, ··· 154 159 "duration": 0.33245420455932617, 155 160 "failureMessages": [], 156 161 "fullName": "suite callback test success ", 162 + "meta": {}, 157 163 "status": "passed", 158 164 "title": "callback test success ", 159 165 }, ··· 164 170 "duration": 19.738605976104736, 165 171 "failureMessages": [], 166 172 "fullName": "suite callback setup success done(false)", 173 + "meta": {}, 167 174 "status": "passed", 168 175 "title": "callback setup success done(false)", 169 176 }, ··· 174 181 "duration": 0.1923508644104004, 175 182 "failureMessages": [], 176 183 "fullName": "suite callback test success done(false)", 184 + "meta": {}, 177 185 "status": "passed", 178 186 "title": "callback test success done(false)", 179 187 }, ··· 183 191 ], 184 192 "failureMessages": [], 185 193 "fullName": "suite todo test", 194 + "meta": {}, 186 195 "status": "todo", 187 196 "title": "todo test", 188 197 }, ··· 240 249 "column": 32, 241 250 "line": 8, 242 251 }, 252 + "meta": {}, 243 253 "status": "failed", 244 254 "title": "Math.sqrt()", 245 255 }, ··· 250 260 "duration": 1.0237109661102295, 251 261 "failureMessages": [], 252 262 "fullName": "suite JSON", 263 + "meta": {}, 253 264 "status": "passed", 254 265 "title": "JSON", 255 266 }, ··· 259 270 ], 260 271 "failureMessages": [], 261 272 "fullName": "suite async with timeout", 273 + "meta": {}, 262 274 "status": "skipped", 263 275 "title": "async with timeout", 264 276 }, ··· 269 281 "duration": 100.50598406791687, 270 282 "failureMessages": [], 271 283 "fullName": "suite timeout", 284 + "meta": {}, 272 285 "status": "passed", 273 286 "title": "timeout", 274 287 }, ··· 279 292 "duration": 20.184875011444092, 280 293 "failureMessages": [], 281 294 "fullName": "suite callback setup success ", 295 + "meta": {}, 282 296 "status": "passed", 283 297 "title": "callback setup success ", 284 298 }, ··· 289 303 "duration": 0.33245420455932617, 290 304 "failureMessages": [], 291 305 "fullName": "suite callback test success ", 306 + "meta": {}, 292 307 "status": "passed", 293 308 "title": "callback test success ", 294 309 }, ··· 299 314 "duration": 19.738605976104736, 300 315 "failureMessages": [], 301 316 "fullName": "suite callback setup success done(false)", 317 + "meta": {}, 302 318 "status": "passed", 303 319 "title": "callback setup success done(false)", 304 320 }, ··· 309 325 "duration": 0.1923508644104004, 310 326 "failureMessages": [], 311 327 "fullName": "suite callback test success done(false)", 328 + "meta": {}, 312 329 "status": "passed", 313 330 "title": "callback test success done(false)", 314 331 }, ··· 318 335 ], 319 336 "failureMessages": [], 320 337 "fullName": "suite todo test", 338 + "meta": {}, 321 339 "status": "todo", 322 340 "title": "todo test", 323 341 }, ··· 380 398 "column": 32, 381 399 "line": 8, 382 400 }, 401 + "meta": {}, 383 402 "status": "failed", 384 403 "title": "Math.sqrt()", 385 404 }, ··· 390 409 "duration": 1.0237109661102295, 391 410 "failureMessages": [], 392 411 "fullName": "suite JSON", 412 + "meta": {}, 393 413 "status": "passed", 394 414 "title": "JSON", 395 415 }, ··· 399 419 ], 400 420 "failureMessages": [], 401 421 "fullName": "suite async with timeout", 422 + "meta": {}, 402 423 "status": "skipped", 403 424 "title": "async with timeout", 404 425 }, ··· 409 430 "duration": 100.50598406791687, 410 431 "failureMessages": [], 411 432 "fullName": "suite timeout", 433 + "meta": {}, 412 434 "status": "passed", 413 435 "title": "timeout", 414 436 }, ··· 419 441 "duration": 20.184875011444092, 420 442 "failureMessages": [], 421 443 "fullName": "suite callback setup success ", 444 + "meta": {}, 422 445 "status": "passed", 423 446 "title": "callback setup success ", 424 447 }, ··· 429 452 "duration": 0.33245420455932617, 430 453 "failureMessages": [], 431 454 "fullName": "suite callback test success ", 455 + "meta": {}, 432 456 "status": "passed", 433 457 "title": "callback test success ", 434 458 }, ··· 439 463 "duration": 19.738605976104736, 440 464 "failureMessages": [], 441 465 "fullName": "suite callback setup success done(false)", 466 + "meta": {}, 442 467 "status": "passed", 443 468 "title": "callback setup success done(false)", 444 469 }, ··· 449 474 "duration": 0.1923508644104004, 450 475 "failureMessages": [], 451 476 "fullName": "suite callback test success done(false)", 477 + "meta": {}, 452 478 "status": "passed", 453 479 "title": "callback test success done(false)", 454 480 }, ··· 458 484 ], 459 485 "failureMessages": [], 460 486 "fullName": "suite todo test", 487 + "meta": {}, 461 488 "status": "todo", 462 489 "title": "todo test", 463 490 }, ··· 520 547 "column": 32, 521 548 "line": 8, 522 549 }, 550 + "meta": {}, 523 551 "status": "failed", 524 552 "title": "Math.sqrt()", 525 553 }, ··· 530 558 "duration": 1.0237109661102295, 531 559 "failureMessages": [], 532 560 "fullName": "suite JSON", 561 + "meta": {}, 533 562 "status": "passed", 534 563 "title": "JSON", 535 564 }, ··· 539 568 ], 540 569 "failureMessages": [], 541 570 "fullName": "suite async with timeout", 571 + "meta": {}, 542 572 "status": "skipped", 543 573 "title": "async with timeout", 544 574 }, ··· 549 579 "duration": 100.50598406791687, 550 580 "failureMessages": [], 551 581 "fullName": "suite timeout", 582 + "meta": {}, 552 583 "status": "passed", 553 584 "title": "timeout", 554 585 }, ··· 559 590 "duration": 20.184875011444092, 560 591 "failureMessages": [], 561 592 "fullName": "suite callback setup success ", 593 + "meta": {}, 562 594 "status": "passed", 563 595 "title": "callback setup success ", 564 596 }, ··· 569 601 "duration": 0.33245420455932617, 570 602 "failureMessages": [], 571 603 "fullName": "suite callback test success ", 604 + "meta": {}, 572 605 "status": "passed", 573 606 "title": "callback test success ", 574 607 }, ··· 579 612 "duration": 19.738605976104736, 580 613 "failureMessages": [], 581 614 "fullName": "suite callback setup success done(false)", 615 + "meta": {}, 582 616 "status": "passed", 583 617 "title": "callback setup success done(false)", 584 618 }, ··· 589 623 "duration": 0.1923508644104004, 590 624 "failureMessages": [], 591 625 "fullName": "suite callback test success done(false)", 626 + "meta": {}, 592 627 "status": "passed", 593 628 "title": "callback test success done(false)", 594 629 }, ··· 598 633 ], 599 634 "failureMessages": [], 600 635 "fullName": "suite todo test", 636 + "meta": {}, 601 637 "status": "todo", 602 638 "title": "todo test", 603 639 }, ··· 660 696 "column": 32, 661 697 "line": 8, 662 698 }, 699 + "meta": {}, 663 700 "status": "failed", 664 701 "title": "Math.sqrt()", 665 702 }, ··· 670 707 "duration": 1.0237109661102295, 671 708 "failureMessages": [], 672 709 "fullName": "suite JSON", 710 + "meta": {}, 673 711 "status": "passed", 674 712 "title": "JSON", 675 713 }, ··· 679 717 ], 680 718 "failureMessages": [], 681 719 "fullName": "suite async with timeout", 720 + "meta": {}, 682 721 "status": "skipped", 683 722 "title": "async with timeout", 684 723 }, ··· 689 728 "duration": 100.50598406791687, 690 729 "failureMessages": [], 691 730 "fullName": "suite timeout", 731 + "meta": {}, 692 732 "status": "passed", 693 733 "title": "timeout", 694 734 }, ··· 699 739 "duration": 20.184875011444092, 700 740 "failureMessages": [], 701 741 "fullName": "suite callback setup success ", 742 + "meta": {}, 702 743 "status": "passed", 703 744 "title": "callback setup success ", 704 745 }, ··· 709 750 "duration": 0.33245420455932617, 710 751 "failureMessages": [], 711 752 "fullName": "suite callback test success ", 753 + "meta": {}, 712 754 "status": "passed", 713 755 "title": "callback test success ", 714 756 }, ··· 719 761 "duration": 19.738605976104736, 720 762 "failureMessages": [], 721 763 "fullName": "suite callback setup success done(false)", 764 + "meta": {}, 722 765 "status": "passed", 723 766 "title": "callback setup success done(false)", 724 767 }, ··· 729 772 "duration": 0.1923508644104004, 730 773 "failureMessages": [], 731 774 "fullName": "suite callback test success done(false)", 775 + "meta": {}, 732 776 "status": "passed", 733 777 "title": "callback test success done(false)", 734 778 }, ··· 738 782 ], 739 783 "failureMessages": [], 740 784 "fullName": "suite todo test", 785 + "meta": {}, 741 786 "status": "todo", 742 787 "title": "todo test", 743 788 }, ··· 800 845 "column": 32, 801 846 "line": 8, 802 847 }, 848 + "meta": {}, 803 849 "status": "failed", 804 850 "title": "Math.sqrt()", 805 851 }, ··· 810 856 "duration": 1.0237109661102295, 811 857 "failureMessages": [], 812 858 "fullName": "suite JSON", 859 + "meta": {}, 813 860 "status": "passed", 814 861 "title": "JSON", 815 862 }, ··· 819 866 ], 820 867 "failureMessages": [], 821 868 "fullName": "suite async with timeout", 869 + "meta": {}, 822 870 "status": "skipped", 823 871 "title": "async with timeout", 824 872 }, ··· 829 877 "duration": 100.50598406791687, 830 878 "failureMessages": [], 831 879 "fullName": "suite timeout", 880 + "meta": {}, 832 881 "status": "passed", 833 882 "title": "timeout", 834 883 }, ··· 839 888 "duration": 20.184875011444092, 840 889 "failureMessages": [], 841 890 "fullName": "suite callback setup success ", 891 + "meta": {}, 842 892 "status": "passed", 843 893 "title": "callback setup success ", 844 894 }, ··· 849 899 "duration": 0.33245420455932617, 850 900 "failureMessages": [], 851 901 "fullName": "suite callback test success ", 902 + "meta": {}, 852 903 "status": "passed", 853 904 "title": "callback test success ", 854 905 }, ··· 859 910 "duration": 19.738605976104736, 860 911 "failureMessages": [], 861 912 "fullName": "suite callback setup success done(false)", 913 + "meta": {}, 862 914 "status": "passed", 863 915 "title": "callback setup success done(false)", 864 916 }, ··· 869 921 "duration": 0.1923508644104004, 870 922 "failureMessages": [], 871 923 "fullName": "suite callback test success done(false)", 924 + "meta": {}, 872 925 "status": "passed", 873 926 "title": "callback test success done(false)", 874 927 }, ··· 878 931 ], 879 932 "failureMessages": [], 880 933 "fullName": "suite todo test", 934 + "meta": {}, 881 935 "status": "todo", 882 936 "title": "todo test", 883 937 },
+3 -1
packages/vitest/src/node/reporters/json.ts
··· 1 1 import { existsSync, promises as fs } from 'node:fs' 2 2 import { dirname, resolve } from 'pathe' 3 3 import type { Vitest } from '../../node' 4 - import type { File, Reporter, SnapshotSummary, Suite, TaskState } from '../../types' 4 + import type { File, Reporter, SnapshotSummary, Suite, TaskMeta, TaskState } from '../../types' 5 5 import { getSuites, getTests } from '../../utils' 6 6 import { getOutputFile } from '../../utils/config-helpers' 7 7 ··· 30 30 fullName: string 31 31 status: Status 32 32 title: string 33 + meta: TaskMeta 33 34 duration?: Milliseconds | null 34 35 failureMessages: Array<string> | null 35 36 location?: Callsite | null ··· 123 124 duration: t.result?.duration, 124 125 failureMessages: t.result?.errors?.map(e => e.stack || e.message) || [], 125 126 location: t.location, 127 + meta: t.meta, 126 128 } satisfies JsonAssertionResult 127 129 }) 128 130