@@ -105,11 +105,11 @@ top level test with two subtests.
105
105
106
106
``` js
107
107
test (' top level test' , async (t ) => {
108
- t .test (' subtest 1' , (t ) => {
108
+ await t .test (' subtest 1' , (t ) => {
109
109
assert .strictEqual (1 , 1 );
110
110
});
111
111
112
- t .test (' subtest 2' , (t ) => {
112
+ await t .test (' subtest 2' , (t ) => {
113
113
assert .strictEqual (2 , 2 );
114
114
});
115
115
});
@@ -118,7 +118,12 @@ test('top level test', async (t) => {
118
118
> ** Note:** ` beforeEach ` and ` afterEach ` hooks are triggered
119
119
> between each subtest execution.
120
120
121
- Any subtest failures cause the parent test to fail.
121
+ In this example, ` await ` is used to ensure that both subtests have completed.
122
+ This is necessary because tests do not wait for their subtests to
123
+ complete, unlike tests created within suites.
124
+ Any subtests that are still outstanding when their parent finishes
125
+ are cancelled and treated as failures. Any subtest failures cause the parent
126
+ test to fail.
122
127
123
128
## Skipping tests
124
129
@@ -236,20 +241,20 @@ that are not executed are omitted from the test runner output.
236
241
// The suite's 'only' option is set, so these tests are run.
237
242
test (' this test is run' , { only: true }, async (t ) => {
238
243
// Within this test, all subtests are run by default.
239
- t .test (' running subtest' );
244
+ await t .test (' running subtest' );
240
245
241
246
// The test context can be updated to run subtests with the 'only' option.
242
247
t .runOnly (true );
243
- t .test (' this subtest is now skipped' );
244
- t .test (' this subtest is run' , { only: true });
248
+ await t .test (' this subtest is now skipped' );
249
+ await t .test (' this subtest is run' , { only: true });
245
250
246
251
// Switch the context back to execute all tests.
247
252
t .runOnly (false );
248
- t .test (' this subtest is now run' );
253
+ await t .test (' this subtest is now run' );
249
254
250
255
// Explicitly do not run these tests.
251
- t .test (' skipped subtest 3' , { only: false });
252
- t .test (' skipped subtest 4' , { skip: true });
256
+ await t .test (' skipped subtest 3' , { only: false });
257
+ await t .test (' skipped subtest 4' , { skip: true });
253
258
});
254
259
255
260
// The 'only' option is not set, so this test is skipped.
@@ -304,13 +309,13 @@ multiple times (e.g. `--test-name-pattern="test 1"`,
304
309
305
310
``` js
306
311
test (' test 1' , async (t ) => {
307
- t .test (' test 2' );
308
- t .test (' test 3' );
312
+ await t .test (' test 2' );
313
+ await t .test (' test 3' );
309
314
});
310
315
311
316
test (' Test 4' , async (t ) => {
312
- t .test (' Test 5' );
313
- t .test (' test 6' );
317
+ await t .test (' Test 5' );
318
+ await t .test (' test 6' );
314
319
});
315
320
```
316
321
@@ -3388,9 +3393,12 @@ before each subtest of the current test.
3388
3393
``` js
3389
3394
test (' top level test' , async (t ) => {
3390
3395
t .beforeEach ((t ) => t .diagnostic (` about to run ${ t .name } ` ));
3391
- t .test (' This is a subtest' , (t ) => {
3392
- assert .ok (' some relevant assertion here' );
3393
- });
3396
+ await t .test (
3397
+ ' This is a subtest' ,
3398
+ (t ) => {
3399
+ assert .ok (' some relevant assertion here' );
3400
+ },
3401
+ );
3394
3402
});
3395
3403
```
3396
3404
@@ -3448,9 +3456,12 @@ after each subtest of the current test.
3448
3456
``` js
3449
3457
test (' top level test' , async (t ) => {
3450
3458
t .afterEach ((t ) => t .diagnostic (` finished running ${ t .name } ` ));
3451
- t .test (' This is a subtest' , (t ) => {
3452
- assert .ok (' some relevant assertion here' );
3453
- });
3459
+ await t .test (
3460
+ ' This is a subtest' ,
3461
+ (t ) => {
3462
+ assert .ok (' some relevant assertion here' );
3463
+ },
3464
+ );
3454
3465
});
3455
3466
```
3456
3467
@@ -3702,8 +3713,10 @@ no-op.
3702
3713
test (' top level test' , (t ) => {
3703
3714
// The test context can be set to run subtests with the 'only' option.
3704
3715
t .runOnly (true );
3705
- t .test (' this subtest is now skipped' );
3706
- t .test (' this subtest is run' , { only: true });
3716
+ return Promise .all ([
3717
+ t .test (' this subtest is now skipped' ),
3718
+ t .test (' this subtest is run' , { only: true }),
3719
+ ]);
3707
3720
});
3708
3721
```
3709
3722
@@ -3775,10 +3788,6 @@ added:
3775
3788
- v18.0.0
3776
3789
- v16.17.0
3777
3790
changes:
3778
- - version:
3779
- - v24.0.0
3780
- pr-url: https://github.com/nodejs/node/pull/56664
3781
- description: This function no longer returns a `Promise`.
3782
3791
- version:
3783
3792
- v18.8.0
3784
3793
- v16.18.0
@@ -3823,13 +3832,14 @@ changes:
3823
3832
to this function is a [ ` TestContext ` ] [ ] object. If the test uses callbacks,
3824
3833
the callback function is passed as the second argument. ** Default:** A no-op
3825
3834
function.
3835
+ * Returns: {Promise} Fulfilled with ` undefined ` once the test completes.
3826
3836
3827
3837
This function is used to create subtests under the current test. This function
3828
3838
behaves in the same fashion as the top level [ ` test() ` ] [ ] function.
3829
3839
3830
3840
``` js
3831
3841
test (' top level test' , async (t ) => {
3832
- t .test (
3842
+ await t .test (
3833
3843
' This is a subtest' ,
3834
3844
{ only: false , skip: false , concurrency: 1 , todo: false , plan: 1 },
3835
3845
(t ) => {
0 commit comments