From 8975748527a82d2dcfd6168ada30359f39de91ba Mon Sep 17 00:00:00 2001 From: Pietro Marchini Date: Thu, 9 Jan 2025 12:12:12 +0100 Subject: [PATCH] test_runner: run single test file benchmark PR-URL: https://github.com/nodejs/node/pull/56479 Reviewed-By: Colin Ihrig Reviewed-By: Moshe Atlow Reviewed-By: Marco Ippolito --- benchmark/test_runner/run-single-test-file.js | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 benchmark/test_runner/run-single-test-file.js diff --git a/benchmark/test_runner/run-single-test-file.js b/benchmark/test_runner/run-single-test-file.js new file mode 100644 index 00000000000000..00e95e088a223e --- /dev/null +++ b/benchmark/test_runner/run-single-test-file.js @@ -0,0 +1,62 @@ +'use strict'; +const common = require('../common'); + +const tmpdir = require('../../test/common/tmpdir'); +const { run } = require('node:test'); +const { writeFileSync, mkdirSync } = require('node:fs'); +const { join } = require('node:path'); + +const fixtureContent = "const test = require('node:test'); test('test has ran');"; + +function makeTestDirWithFiles(dirPath, count) { + mkdirSync(dirPath); + for (let i = 0; i < count; i++) { + writeFileSync(join(dirPath, `test-${i}.js`), fixtureContent); + } +} + +function getTestDirPath(numberOfTestFiles) { + return join(tmpdir.path, `${numberOfTestFiles}-tests`); +} + +function setup(numberOfTestFiles) { + tmpdir.refresh(); + const dirPath = getTestDirPath(numberOfTestFiles); + makeTestDirWithFiles(dirPath, numberOfTestFiles); +} + +/** + * This benchmark evaluates the overhead of running a single test file under different + * isolation modes. + * Specifically, it compares the performance of running tests in the + * same process versus creating multiple processes. + */ +const bench = common.createBenchmark(main, { + numberOfTestFiles: [1, 10, 100], + isolation: ['none', 'process'], +}, { + // We don't want to test the reporter here + flags: ['--test-reporter=./benchmark/fixtures/empty-test-reporter.js'], +}); + +async function runBenchmark({ numberOfTestFiles, isolation }) { + const dirPath = getTestDirPath(numberOfTestFiles); + const stream = run({ + cwd: dirPath, + isolation, + concurrency: false, // We don't want to run tests concurrently + }); + + // eslint-disable-next-line no-unused-vars + for await (const _ of stream); + + return numberOfTestFiles; +} + +function main(params) { + setup(params.numberOfTestFiles); + bench.start(); + runBenchmark(params).then(() => { + bench.end(1); + }); +}