diff --git a/lib/internal/test_runner/runner.js b/lib/internal/test_runner/runner.js index 9590ef8dcf75bf..e2237dd73f468d 100644 --- a/lib/internal/test_runner/runner.js +++ b/lib/internal/test_runner/runner.js @@ -34,6 +34,7 @@ const { spawn } = require('child_process'); const { finished } = require('internal/streams/end-of-stream'); const { resolve } = require('path'); const { DefaultDeserializer, DefaultSerializer } = require('v8'); +const { getOptionValue } = require('internal/options'); const { Interface } = require('internal/readline/interface'); const { deserializeError } = require('internal/error_serdes'); const { Buffer } = require('buffer'); @@ -697,6 +698,11 @@ function run(options = kEmptyObject) { root.harness.bootstrapPromise = promise; + const userImports = getOptionValue('--import'); + for (let i = 0; i < userImports.length; i++) { + await cascadedLoader.import(userImports[i], parentURL, kEmptyObject); + } + for (let i = 0; i < testFiles.length; ++i) { const testFile = testFiles[i]; const fileURL = pathToFileURL(testFile); diff --git a/test/fixtures/test-runner/no-isolation/global-hooks.js b/test/fixtures/test-runner/no-isolation/global-hooks.js new file mode 100644 index 00000000000000..4ff69c51ba1486 --- /dev/null +++ b/test/fixtures/test-runner/no-isolation/global-hooks.js @@ -0,0 +1,6 @@ +import('node:test').then((test) => { + test.before(() => console.log('before(): global')); + test.beforeEach(() => console.log('beforeEach(): global')); + test.after(() => console.log('after(): global')); + test.afterEach(() => console.log('afterEach(): global')); +}); \ No newline at end of file diff --git a/test/fixtures/test-runner/no-isolation/one.test.js b/test/fixtures/test-runner/no-isolation/one.test.js index 69e0485a37127b..5b5cc2b025cfbb 100644 --- a/test/fixtures/test-runner/no-isolation/one.test.js +++ b/test/fixtures/test-runner/no-isolation/one.test.js @@ -3,30 +3,35 @@ const { before, beforeEach, after, afterEach, test, suite } = require('node:test globalThis.GLOBAL_ORDER = []; +function record(data) { + globalThis.GLOBAL_ORDER.push(data); + console.log(data); +} + before(function() { - GLOBAL_ORDER.push(`before one: ${this.name}`); + record(`before one: ${this.name}`); }); beforeEach(function() { - GLOBAL_ORDER.push(`beforeEach one: ${this.name}`); + record(`beforeEach one: ${this.name}`); }); after(function() { - GLOBAL_ORDER.push(`after one: ${this.name}`); + record(`after one: ${this.name}`); }); afterEach(function() { - GLOBAL_ORDER.push(`afterEach one: ${this.name}`); + record(`afterEach one: ${this.name}`); }); suite('suite one', function() { - GLOBAL_ORDER.push(this.name); + record(this.name); test('suite one - test', { only: true }, function() { - GLOBAL_ORDER.push(this.name); + record(this.name); }); }); test('test one', function() { - GLOBAL_ORDER.push(this.name); + record(this.name); }); diff --git a/test/fixtures/test-runner/no-isolation/two.test.js b/test/fixtures/test-runner/no-isolation/two.test.js index 50ae6541ce156d..4fbc7dfc840e16 100644 --- a/test/fixtures/test-runner/no-isolation/two.test.js +++ b/test/fixtures/test-runner/no-isolation/two.test.js @@ -1,30 +1,35 @@ 'use strict'; const { before, beforeEach, after, afterEach, test, suite } = require('node:test'); +function record(data) { + globalThis.GLOBAL_ORDER.push(data); + console.log(data); +} + before(function() { - GLOBAL_ORDER.push(`before two: ${this.name}`); + record(`before two: ${this.name}`); }); beforeEach(function() { - GLOBAL_ORDER.push(`beforeEach two: ${this.name}`); + record(`beforeEach two: ${this.name}`); }); after(function() { - GLOBAL_ORDER.push(`after two: ${this.name}`); + record(`after two: ${this.name}`); }); afterEach(function() { - GLOBAL_ORDER.push(`afterEach two: ${this.name}`); + record(`afterEach two: ${this.name}`); }); suite('suite two', function() { - GLOBAL_ORDER.push(this.name); + record(this.name); before(function() { - GLOBAL_ORDER.push(`before suite two: ${this.name}`); + record(`before suite two: ${this.name}`); }); test('suite two - test', { only: true }, function() { - GLOBAL_ORDER.push(this.name); + record(this.name); }); }); diff --git a/test/parallel/test-runner-no-isolation-hooks.mjs b/test/parallel/test-runner-no-isolation-hooks.mjs new file mode 100644 index 00000000000000..475d3ae33990c1 --- /dev/null +++ b/test/parallel/test-runner-no-isolation-hooks.mjs @@ -0,0 +1,77 @@ +import * as common from '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { test } from 'node:test'; + +const testArguments = [ + '--test', + '--experimental-test-isolation=none', +]; + +const testFiles = [ + fixtures.path('test-runner', 'no-isolation', 'one.test.js'), + fixtures.path('test-runner', 'no-isolation', 'two.test.js'), +]; + +const hookFixture = fixtures.path('test-runner', 'no-isolation', 'global-hooks.js'); + +const order = [ + 'before(): global', + + 'before one: ', + 'suite one', + + 'before two: ', + 'suite two', + + 'beforeEach(): global', + 'beforeEach one: suite one - test', + 'beforeEach two: suite one - test', + + 'suite one - test', + 'afterEach(): global', + 'afterEach one: suite one - test', + 'afterEach two: suite one - test', + + 'beforeEach(): global', + 'beforeEach one: test one', + 'beforeEach two: test one', + 'test one', + + 'afterEach(): global', + 'afterEach one: test one', + 'afterEach two: test one', + + 'before suite two: suite two', + 'beforeEach(): global', + 'beforeEach one: suite two - test', + 'beforeEach two: suite two - test', + + 'suite two - test', + 'afterEach(): global', + 'afterEach one: suite two - test', + 'afterEach two: suite two - test', + + 'after(): global', + 'after one: ', + 'after two: ', +]; + +test('Using --require to define global hooks works', async (t) => { + const spawned = await common.spawnPromisified(process.execPath, [ + ...testArguments, + '--require', hookFixture, + ...testFiles, + ]); + + t.assert.ok(spawned.stdout.includes(order.join('\n'))); +}); + +test('Using --import to define global hooks works', async (t) => { + const spawned = await common.spawnPromisified(process.execPath, [ + ...testArguments, + '--import', hookFixture, + ...testFiles, + ]); + + t.assert.ok(spawned.stdout.includes(order.join('\n'))); +});