Skip to content

fix(jest-core): always use workers in watch mode - #14059

Merged
SimenB merged 4 commits into
jestjs:mainfrom
benjaminjkraft:watch-worker
Apr 15, 2023
Merged

fix(jest-core): always use workers in watch mode#14059
SimenB merged 4 commits into
jestjs:mainfrom
benjaminjkraft:watch-worker

Conversation

@benjaminjkraft

Copy link
Copy Markdown
Contributor

Summary

The comment here already said one good reason to do this; another is that if the test hard-crashes (e.g. an async error after it completes) then using workers allows us to still watch for changes (perhaps to fix that crash). So now we just always use workers in watch mode; this probably worsens startup time slightly but for watch mode that's hopefully not as much of a problem.

Fixes #13996.

Test plan

Updated existing unit tests. Let me know if it makes sense to add something e2e for the specific crash case in #13996.

The comment here already said one good reason to do this; another is
that if the test hard-crashes (e.g. an async error after it completes)
then using workers allows us to still watch for changes (perhaps to fix
that crash). So now we just always use workers in watch mode; this
probably worsens startup time slightly but for watch mode that's
hopefully not as much of a problem.

Fixes jestjs#13996.
* watchAll.
* If we are using watch/watchAll mode, don't schedule anything in the main
* thread to keep the TTY responsive and to keep the watcher running even if
* the test crashes.

@mrazauskas mrazauskas Apr 7, 2023

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hm.. Perhaps the comment should say: "and prevents watch mode crashes caused by tests leaking due to improper teardown". Or something that way?

It isn’t that workers do prevent watch mode to crash due to fatal errors in tests, that is more about preventing leaks / open handles or debugging them (as you pointed out in the issue).

There is no mechanism to deal with this problem if tests run in band. Leaks are handled more gracefully in parallel run, because worker farm gets killed after tests run is finished:

https://github.com/facebook/jest/blob/470d72ee74e50291bf8593954f24eb75b5621351/packages/jest-runner/src/index.ts#L180-L194

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the suggestions -- took another stab at explaining this.

Comment on lines +34 to +35
const isWatchMode = watch || watchAll;
if (isWatchMode) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
const isWatchMode = watch || watchAll;
if (isWatchMode) {
if (watch || watchAll) {

Comment on lines 36 to 43
* quickly we also run in band to reduce the overhead of spawning workers.
* Finally, the user can provide the runInBand argument in the CLI to
* force running in band.
* https://github.com/facebook/jest/blob/700e0dadb85f5dc8ff5dac6c7e98956690049734/packages/jest-config/src/getMaxWorkers.js#L14-L17

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Leave this comment in place, please. Check that link, the logic there sets maxWorkers to 1 if runInBand is provided. At first it is not clear why runInBand is mentioned here, but it makes sense. Or?