Jujutsu and Jest: only test changed code
In a standard git repo you can run jest --watch
and jest --onlyChanged
to only run the tests for the files that you’ve changed.
However if you’re using jj
instead of git you’ll get this error:
$ yarn jest --watch
Determining test suites to run...
--watch is not supported without git/hg, please use --watchAll
Here’s how we can work around that.
Building block 1: the changed file paths
jj diff --name-only
gives us just the path of each changed file.
$ jj diff --name-only
apps/native/src/app/index.tsx
apps/native/src/components/component-a.tsx
apps/native/src/components/component-b.tsx
Building block 2: passing the file paths to jest
Passing just those file paths on their own to Jest won’t work. We want Jest to run the tests related to the code we’ve changed, and by default if you give Jest a file path it assumes it’s a test file and tries to just run it directly.
Instead the --findRelatedTests
flag is what we’re after:
jest --findRelatedTests fileA.ts fileB.ts
Piecing it together
We can glue the two together nicely using xargs
:
jj diff --name-only | xargs yarn test --findRelatedTests
You might want to add a shell alias or script to make this more convenient, but still it works nicely.
Adding back --watch
support
Piping to jest --watch
breaks the interactivity (the › Press f to run only failed tests.
stuff). So instead we can use command substitution:
# Fish shell
yarn test --watch --findRelatedTests (jj diff --name-only)
# Bash
yarn test --watch --findRelatedTests $(jj diff --name-only)