test_runner: mark snapshot testing as stable

This commit marks the test runner's snapshot testing API as
stable.

PR-URL: https://github.com/nodejs/node/pull/55897
Reviewed-By: Moshe Atlow <moshe@atlow.co.il>
Reviewed-By: Pietro Marchini <pietro.marchini94@gmail.com>
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
Reviewed-By: Jacob Smith <jacob@frende.me>
Reviewed-By: Chemi Atlow <chemi@atlow.co.il>
This commit is contained in:
Colin Ihrig 2024-11-19 12:37:35 -05:00 committed by GitHub
parent 01b9a54a58
commit c921676512
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
9 changed files with 41 additions and 67 deletions

View File

@ -1121,16 +1121,6 @@ added:
Enable module mocking in the test runner. Enable module mocking in the test runner.
### `--experimental-test-snapshots`
<!-- YAML
added: v22.3.0
-->
> Stability: 1.0 - Early development
Enable [snapshot testing][] in the test runner.
### `--experimental-vm-modules` ### `--experimental-vm-modules`
<!-- YAML <!-- YAML
@ -2472,13 +2462,13 @@ subtests inherit this value from their parent. The default value is `Infinity`.
<!-- YAML <!-- YAML
added: v22.3.0 added: v22.3.0
changes:
- version: REPLACEME
pr-url: https://github.com/nodejs/node/pull/55897
description: Snapsnot testing is no longer experimental.
--> -->
> Stability: 1.0 - Early development
Regenerates the snapshot files used by the test runner for [snapshot testing][]. Regenerates the snapshot files used by the test runner for [snapshot testing][].
Node.js must be started with the `--experimental-test-snapshots` flag in order
to use this functionality.
### `--throw-deprecation` ### `--throw-deprecation`

View File

@ -937,8 +937,7 @@ compared against a set of known good values. The known good values are known as
snapshots, and are stored in a snapshot file. Snapshot files are managed by the snapshots, and are stored in a snapshot file. Snapshot files are managed by the
test runner, but are designed to be human readable to aid in debugging. Best test runner, but are designed to be human readable to aid in debugging. Best
practice is for snapshot files to be checked into source control along with your practice is for snapshot files to be checked into source control along with your
test files. In order to enable snapshot testing, Node.js must be started with test files.
the [`--experimental-test-snapshots`][] command-line flag.
Snapshot files are generated by starting Node.js with the Snapshot files are generated by starting Node.js with the
[`--test-update-snapshots`][] command-line flag. A separate snapshot file is [`--test-update-snapshots`][] command-line flag. A separate snapshot file is
@ -3593,7 +3592,6 @@ Can be used to abort test subtasks when the test has been aborted.
[`--experimental-strip-types`]: cli.md#--experimental-strip-types [`--experimental-strip-types`]: cli.md#--experimental-strip-types
[`--experimental-test-coverage`]: cli.md#--experimental-test-coverage [`--experimental-test-coverage`]: cli.md#--experimental-test-coverage
[`--experimental-test-module-mocks`]: cli.md#--experimental-test-module-mocks [`--experimental-test-module-mocks`]: cli.md#--experimental-test-module-mocks
[`--experimental-test-snapshots`]: cli.md#--experimental-test-snapshots
[`--import`]: cli.md#--importmodule [`--import`]: cli.md#--importmodule
[`--test-concurrency`]: cli.md#--test-concurrency [`--test-concurrency`]: cli.md#--test-concurrency
[`--test-coverage-include`]: cli.md#--test-coverage-include [`--test-coverage-include`]: cli.md#--test-coverage-include

View File

@ -191,9 +191,6 @@ Configures the type of test isolation used in the test runner.
.It Fl -experimental-test-module-mocks .It Fl -experimental-test-module-mocks
Enable module mocking in the test runner. Enable module mocking in the test runner.
. .
.It Fl -experimental-test-snapshots
Enable snapshot testing in the test runner.
.
.It Fl -experimental-strip-types .It Fl -experimental-strip-types
Enable experimental type-stripping for TypeScript files. Enable experimental type-stripping for TypeScript files.
. .

View File

@ -104,6 +104,7 @@ function lazyAssertObject(harness) {
if (assertObj === undefined) { if (assertObj === undefined) {
assertObj = new SafeMap(); assertObj = new SafeMap();
const assert = require('assert'); const assert = require('assert');
const { SnapshotManager } = require('internal/test_runner/snapshot');
const methodsToCopy = [ const methodsToCopy = [
'deepEqual', 'deepEqual',
'deepStrictEqual', 'deepStrictEqual',
@ -126,12 +127,8 @@ function lazyAssertObject(harness) {
assertObj.set(methodsToCopy[i], assert[methodsToCopy[i]]); assertObj.set(methodsToCopy[i], assert[methodsToCopy[i]]);
} }
const { getOptionValue } = require('internal/options'); harness.snapshotManager = new SnapshotManager(harness.config.updateSnapshots);
if (getOptionValue('--experimental-test-snapshots')) { assertObj.set('snapshot', harness.snapshotManager.createAssert());
const { SnapshotManager } = require('internal/test_runner/snapshot');
harness.snapshotManager = new SnapshotManager(harness.config.updateSnapshots);
assertObj.set('snapshot', harness.snapshotManager.createAssert());
}
} }
return assertObj; return assertObj;
} }

View File

@ -7,7 +7,6 @@ const {
const { test, suite, before, after, beforeEach, afterEach } = require('internal/test_runner/harness'); const { test, suite, before, after, beforeEach, afterEach } = require('internal/test_runner/harness');
const { run } = require('internal/test_runner/runner'); const { run } = require('internal/test_runner/runner');
const { getOptionValue } = require('internal/options');
module.exports = test; module.exports = test;
ObjectAssign(module.exports, { ObjectAssign(module.exports, {
@ -39,28 +38,26 @@ ObjectDefineProperty(module.exports, 'mock', {
}, },
}); });
if (getOptionValue('--experimental-test-snapshots')) { let lazySnapshot;
let lazySnapshot;
ObjectDefineProperty(module.exports, 'snapshot', { ObjectDefineProperty(module.exports, 'snapshot', {
__proto__: null, __proto__: null,
configurable: true, configurable: true,
enumerable: true, enumerable: true,
get() { get() {
if (lazySnapshot === undefined) { if (lazySnapshot === undefined) {
const { const {
setDefaultSnapshotSerializers, setDefaultSnapshotSerializers,
setResolveSnapshotPath, setResolveSnapshotPath,
} = require('internal/test_runner/snapshot'); } = require('internal/test_runner/snapshot');
lazySnapshot = { lazySnapshot = {
__proto__: null, __proto__: null,
setDefaultSnapshotSerializers, setDefaultSnapshotSerializers,
setResolveSnapshotPath, setResolveSnapshotPath,
}; };
} }
return lazySnapshot; return lazySnapshot;
}, },
}); });
}

View File

@ -692,9 +692,7 @@ EnvironmentOptionsParser::EnvironmentOptionsParser() {
AddOption("--experimental-test-module-mocks", AddOption("--experimental-test-module-mocks",
"enable module mocking in the test runner", "enable module mocking in the test runner",
&EnvironmentOptions::test_runner_module_mocks); &EnvironmentOptions::test_runner_module_mocks);
AddOption("--experimental-test-snapshots", AddOption("--experimental-test-snapshots", "", NoOp{});
"enable snapshot testing in the test runner",
&EnvironmentOptions::test_runner_snapshots);
AddOption("--test-name-pattern", AddOption("--test-name-pattern",
"run tests whose name matches this regular expression", "run tests whose name matches this regular expression",
&EnvironmentOptions::test_name_pattern, &EnvironmentOptions::test_name_pattern,

View File

@ -189,7 +189,6 @@ class EnvironmentOptions : public Options {
uint64_t test_coverage_functions = 0; uint64_t test_coverage_functions = 0;
uint64_t test_coverage_lines = 0; uint64_t test_coverage_lines = 0;
bool test_runner_module_mocks = false; bool test_runner_module_mocks = false;
bool test_runner_snapshots = false;
bool test_runner_update_snapshots = false; bool test_runner_update_snapshots = false;
std::vector<std::string> test_name_pattern; std::vector<std::string> test_name_pattern;
std::vector<std::string> test_reporter; std::vector<std::string> test_reporter;

View File

@ -3,13 +3,14 @@ require('../common');
const assert = require('node:assert'); const assert = require('node:assert');
const test = require('node:test'); const test = require('node:test');
const uncopiedKeys = [ test('expected methods are on t.assert', (t) => {
'AssertionError', const uncopiedKeys = [
'CallTracker', 'AssertionError',
'strict', 'CallTracker',
]; 'strict',
test('only methods from node:assert are on t.assert', (t) => { ];
const expectedKeys = Object.keys(assert).filter((key) => !uncopiedKeys.includes(key)).sort(); const assertKeys = Object.keys(assert).filter((key) => !uncopiedKeys.includes(key));
const expectedKeys = ['snapshot'].concat(assertKeys).sort();
assert.deepStrictEqual(Object.keys(t.assert).sort(), expectedKeys); assert.deepStrictEqual(Object.keys(t.assert).sort(), expectedKeys);
}); });

View File

@ -1,4 +1,4 @@
// Flags: --expose-internals --experimental-test-snapshots // Flags: --expose-internals
/* eslint-disable no-template-curly-in-string */ /* eslint-disable no-template-curly-in-string */
'use strict'; 'use strict';
const common = require('../common'); const common = require('../common');
@ -299,7 +299,7 @@ test('t.assert.snapshot()', async (t) => {
await t.test('fails prior to snapshot generation', async (t) => { await t.test('fails prior to snapshot generation', async (t) => {
const child = await common.spawnPromisified( const child = await common.spawnPromisified(
process.execPath, process.execPath,
['--experimental-test-snapshots', fixture], [fixture],
{ cwd: tmpdir.path }, { cwd: tmpdir.path },
); );
@ -314,7 +314,7 @@ test('t.assert.snapshot()', async (t) => {
await t.test('passes when regenerating snapshots', async (t) => { await t.test('passes when regenerating snapshots', async (t) => {
const child = await common.spawnPromisified( const child = await common.spawnPromisified(
process.execPath, process.execPath,
['--test-update-snapshots', '--experimental-test-snapshots', fixture], ['--test-update-snapshots', fixture],
{ cwd: tmpdir.path }, { cwd: tmpdir.path },
); );
@ -328,7 +328,7 @@ test('t.assert.snapshot()', async (t) => {
await t.test('passes when snapshots exist', async (t) => { await t.test('passes when snapshots exist', async (t) => {
const child = await common.spawnPromisified( const child = await common.spawnPromisified(
process.execPath, process.execPath,
['--experimental-test-snapshots', fixture], [fixture],
{ cwd: tmpdir.path }, { cwd: tmpdir.path },
); );
@ -350,7 +350,6 @@ test('snapshots from multiple files (isolation=none)', async (t) => {
const args = [ const args = [
'--test', '--test',
'--experimental-test-isolation=none', '--experimental-test-isolation=none',
'--experimental-test-snapshots',
fixture, fixture,
fixture2, fixture2,
]; ];
@ -372,7 +371,6 @@ test('snapshots from multiple files (isolation=none)', async (t) => {
const args = [ const args = [
'--test', '--test',
'--experimental-test-isolation=none', '--experimental-test-isolation=none',
'--experimental-test-snapshots',
'--test-update-snapshots', '--test-update-snapshots',
fixture, fixture,
fixture2, fixture2,
@ -394,7 +392,6 @@ test('snapshots from multiple files (isolation=none)', async (t) => {
const args = [ const args = [
'--test', '--test',
'--experimental-test-isolation=none', '--experimental-test-isolation=none',
'--experimental-test-snapshots',
fixture, fixture,
fixture2, fixture2,
]; ];