Test runner with isolation=none does not work in child process
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- JavaScript
- Sterne
- 122k
- Forks
- 37.3k
- Ø Merge
- 4 T. 2 Std.
- Gemergte PRs (30 T.)
- 283
Beschreibung
Version
v24.9.0
Platform
Linux home 5.15.0-153-generic #163-Ubuntu SMP Thu Aug 7 16:37:18 UTC 2025 x86_64 x86_64 x86_64 GNU/Linux
Subsystem
No response
What steps will reproduce the bug?
runner.js
import cluster from 'node:cluster';
import { run } from "node:test";
if (cluster.isPrimary) {
cluster.fork();
} else {
const stream = run({
isolation: "none",
});
stream.on("data", (data) => {
console.log("on data", data.type);
});
stream.on("end", () => {
console.log("on end")
process.exit(0);
});
stream.on("error", (err) => {
console.log("on error", err);
});
}
dummy.test.js
import { describe, it } from "node:test";
import * as assert from "node:assert";
describe("suite", () => {
it("works", () => {
assert.ok(true);
});
});
How often does it reproduce? Is there a required condition?
Always. No.
What is the expected behavior? Why is that the expected behavior?
With isolation: "process" (the default), here's the output:
on data test:enqueue
on data test:dequeue
on data test:enqueue
on data test:dequeue
on data test:enqueue
on data test:dequeue
on data test:complete
on data test:start
on data test:start
on data test:pass
on data test:complete
on data test:plan
on data test:pass
on data test:summary
on data test:complete
on data test:plan
on data test:diagnostic
on data test:diagnostic
on data test:diagnostic
on data test:diagnostic
on data test:diagnostic
on data test:diagnostic
on data test:diagnostic
on data test:diagnostic
on data test:summary
on end
Process finished with exit code 0
The process cleanly exits at the end of the tests.
What do you see instead?
With isolation: "none", here's the output:
on data test:enqueue
on data test:dequeue
on data test:enqueue
on data test:dequeue
on data test:complete
on data test:start
on data test:start
on data test:pass
on data test:complete
on data test:plan
on data test:pass
And the process hangs.
Additional information
The goal was to use the "cluster" module to run the tests in parallel with the shard option:
import { run } from "node:test";
import { spec } from "node:test/reporters";
import { PassThrough } from "node:stream";
import { availableParallelism } from "node:os";
import cluster from 'node:cluster';
const concurrency = availableParallelism();
let completed = 0;
if (cluster.isPrimary) {
const mergedStream = new PassThrough({
objectMode: true
});
cluster.on("message", (_worker, message) => {
mergedStream.emit("data", message);
});
mergedStream
.compose(spec)
.pipe(process.stdout);
for (let i = 1; i <= concurrency; i++) {
cluster.fork({
SHARD_INDEX: i,
SHARD_TOTAL: concurrency,
});
}
cluster.on("exit", (worker, code, signal) => {
if (++completed === concurrency) {
mergedStream.end();
}
});
} else {
const stream = run({
isolation: "none",
shard: {
index: parseInt(process.env.SHARD_INDEX, 10),
total: parseInt(process.env.SHARD_TOTAL, 10),
},
});
stream.on("data", (chunk) => {
process.send(chunk);
});
}
Beitragsleitfaden
Erste Schritte
- Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
- Forke das Repository und arbeite in einem Branch.
- Öffne einen Pull Request, der die Issue-Nummer nennt.
Rechercherichtung
Beginne mit der Reproduktion in runner.js und dummy.test.js und verfolge dann den node:test-Einstiegspunkt run() mit auf "none" gesetzter Isolation, wenn er aus einem cluster-Kinderprozess aufgerufen wird. Vergleiche seinen Stream-Lebenszyklus mit der standardmäßigen Isolation "process" und dem verwandten Issue 55939. Erledigt ist die Aufgabe, wenn der Stream des Kindprozesses die verbleibenden Events ausgibt, endet und sauber beendet wird und dabei die Shard-Unterstützung erhalten bleibt.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- javascript, node.js
- Bereich
- testing-qa
- Issue-Typ
- Bug
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Aktivitätsstatus
- Aktiv
- Klarheit
- Größtenteils klar
- Anfängerfreundlichkeit
- 55/100