-
Notifications
You must be signed in to change notification settings - Fork 29.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
node:test
custom reporters get test:stdout
and test:stderr
events before test:dequeue
#53103
Comments
Also, when there are multiple tests, you can get all of their import { it } from "node:test";
it("test", () => {
console.log("message from the test");
});
it("test2", () => {
console.log("message from the test");
}); would generate this with the reported presented above test:dequeue index.test.mjs
test:stdout 'message from the test\n'
test:stdout 'message from the test\n'
test:dequeue test
test:dequeue test2 |
Based on what I can tell, the event for @nodejs/test_runner is this working as intended, or a bug? |
There are a few things going on here:
Someone could try binding the events to specific tests, but I don't think it will work correctly in all cases - for example if the logging happens from native code, |
I think I could have provided more context. I'm working on a custom reporter. I like to mimic Mocha's default reporter. Part of its behavior is that it prints any Currently, that's not possible. If I could get
I think that's fair. I also noticed
Do you mean race condition as in "this is not intentional" or that it is racy by design? Following your recommendation, I also tried import { it } from "node:test";
it("test", async () => {
await new Promise((resolve) =>
setImmediate(() => {
console.log(new Error().stack);
resolve();
})
);
}); which emits
|
Not entirely sure what you meant here, as I'm not familiar with the test runner internals. I'm just following (almost copy-pasting tbh) the docs. |
It is working as designed because (as far as I know) no major effort has been made to try to tie logs to individual tests. There are a few things that could be tried such as async hooks, monkey patching, etc. However, like I said before, I don't think it will work in all cases.
Yes, you still get the events because the orchestration process is just scraping stdout/stderr from a child process. But, the file on those events can potentially be wrong, and the line and column numbers are definitely not valid. An example where the file would be wrong is if your main file imports another file containing tests.
That wasn't a response to my comment, but I think the original comment is irrelevant. |
Regarding mocha - I'm not a mocha user, but it doesn't seem like it necessarily binds the output to tests either (maybe I'm missing something): it('test 1', () => {
console.log('message 1');
setTimeout(() => {
console.log('message 2');
});
});
it('test 2', () => {
console.log('message 3');
setTimeout(() => {
console.log('message 4');
});
}); I see the following output:
If I run the mocha binary directly, I see even different output:
Or sometimes:
And:
|
You are correct in that mocha doesn't associate output to a test. But it notifies the reporter that a suite has started running before running the tests, hence its title gets printed before the test is run. Here's a different example, where this is more clear: describe("main describe", () => {
describe("nested describe", () => {
it("doubly nested test", () => {
console.log("message from doubly nested test");
setTimeout(() => {
console.log("unbounded message"); // gets printed after the tests finish running
}, 1000);
});
});
it("nested test", () => {
console.log("message from nested test");
});
});
it("unnested test", async () => {
console.log("message from unnested test");
}); Which prints: $ npx mocha
message from unnested test
✔ unnested test
main describe
message from nested test
✔ nested test
nested describe
message from doubly nested test
✔ doubly nested test
3 passing (4ms)
unbounded message Here, the output of a test is always printed after the test's describe's title and usually right before its test name. The exception is if you do something like With my
So, the suite and test names are printed after the console logs, which can make it difficult to understand what's going on, especially if the messages were repeated. My expected output would be:
|
I think the only real alternative is to bypass the delay associated with the reporter interface. The events are emitted in the correct order by the test runner, but the events such as |
Version
v22.2.0
Platform
Linux 6a770f0f664c 6.6.26-linuxkit #1 SMP Sat Apr 27 04:13:19 UTC 2024 aarch64 GNU/Linux
Subsystem
test_runner
What steps will reproduce the bug?
Create a folder with these files:
index.test.mjs
:reporter.mjs
:and run
node --test --test-reporter=./reporter.mjs
which will print
How often does it reproduce? Is there a required condition?
It always does the same
What is the expected behavior? Why is that the expected behavior?
I expected
test:dequeue test
to be printed beforetest:stdout 'message from the test\n'
as the documentation states "Emitted when a test is dequeued, right before it is executed."What do you see instead?
The
test:stdout
event is emitted before thetest:dequeue
, which makes it impossible to understand which test was running when the message was written to stdout.Additional information
No response
The text was updated successfully, but these errors were encountered: