Jestで実行時間を短縮する方法を調査した

目次
1. 背景
2. jest,ts-jestとは
3. testのタイミング
4. 検証環境
5. 検証内容
    5.1. runInBand
    5.2. max-workers
    5.3. isolatedModules
    5.4. lastCommit,onlyChanged
    5.5. CIでJest cacheの保存・リストア
    5.6. CI自体の並列実行
    5.7. jest-light-runner
    5.8. swc/jest
    5.10. esbuild-jest
    5.11. jest configファイルをjs、jsonにする
6. 検証結果
    6.1. runInBand
    6.2. max-workers
    6.3. CIでJest cacheの保存・リストア
    6.4. tsc + swc/jest
    6.5. jest configファイルをjs、jsonにする
7. その他の改善案
8. ts-jestが今後高速化する？
9. 最後に

# 1. 背景
弊社ではフロントエンドのテストでjest,ts-jestを採用しています。
テストコード、ファイルの量が増えるに連れてテストの実行時間が膨大になるのは自明です。
そこで、少しでも実行時間を短縮したいなと思ったからです。

# 2.jest,ts-jest

### [jest](https://jestjs.io/ja/)
- JavaScriptのテストフレームワークです。
- テストランナー、アサーション、テストモック・テストダブルがオールインワンになっています。

# 3.testのタイミング
- リモートにpush時
- ローカルで好きなタイミングで実行

### [ts-jest](https://www.npmjs.com/package/ts-jest)
- TypeScriptで書いたテストコードを、実行前にJavaScritpにトランスパイルします。
- 型チェックを含むTypeScriptのすべての機能をサポートしています。

# 4. 検証環境
[こちらのリポジトリ](https://github.com/yamatai12/jest-lab)で行います。

# 5.検証方法

## 5.1. runInBand
### runInBandとは
1つのプロセスですべてのテストをシリアル（順番）に実行します。

Jestは、高速なSSDを搭載した最新のマルチコアコンピュータ上ではほとんどの場合非常に高速ですが、特定のセットアップ上では遅くなることがあります。
速度を最大50%改善する1つの方法は、テストを連続して実行することです。
これを行うには、--runInBand を使って同じスレッドでテストを実行します
```terminal
# Using Jest CLI
jest --runInBand

# Using your package manager's `test` script (e.g. with create-react-app)
npm test -- --runInBand
```

## 5.2.max-workers
### max-workersとは
- テストの実行時にワーカープールが生成するワーカの最大数を指定します。
- シングルランモードでは、マシンで使用可能なコア数からメインスレッド用に1を引いた数がデフォルトです。
- CIのようなリソースが限られた環境ではこれを調整するのが便利かもしれませんが、ほとんどのユースケースではデフォルトで十分だそうです。
- 利用可能なCPUが変化する環境では、パーセンテージベースの設定もできます。

### ローカル環境下では--maxWorkers=49%という[記事](https://zenn.dev/tkiryu/articles/a6a43bd9d043b0)を発見

### github-actionsでの使用例
 github-actions-cpu-coresでCPUの数を検出し、それをJestに渡します。
```yaml
- name: Get number of CPU cores
  id: cpu-cores
  uses: SimenB/github-actions-cpu-cores@v2
- name: run tests
  run: npm jest --max-workers ${{ steps.cpu-cores.outputs.count }}
```

## 5.3 isolatedModules
ts-jestが使用するtsconfigのincludeの値を変更することで、このモードを使用する際のパフォーマンスを向上させる方法があります。
includeで提供されるファイルが少なければ少ないほど、テスト実行のパフォーマンスが向上します。

複数のファイルをimportしてテストするのが多いのでこちらは**却下**とします。

## 5.4 lastCommit,onlyChanged
[ミツモア様のブログ](https://engineering.meetsmore.com/entry/2021/01/21/134930#:~:text=%E3%81%93%E3%81%AE%E6%96%B9%E6%B3%95%E3%81%A0%E3%81%A8%E4%BF%AE%E6%AD%A3%E6%95%B0%E3%81%AB%E5%BF%9C%E3%81%98%E3%81%A6%E3%83%86%E3%82%B9%E3%83%88%E6%99%82%E9%96%93%E3%81%AB%E3%81%B0%E3%82%89%E3%81%A4%E3%81%8D%E3%81%8C%E3%81%A7%E3%81%9F%E3%82%8A%E3%80%81%20%E5%A4%9A%E3%81%8F%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AB%E4%BE%9D%E5%AD%98%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E7%B7%A8%E9%9B%86%E3%81%99%E3%82%8B%E3%81%A8%E3%81%BB%E3%81%A8%E3%82%93%E3%81%A9%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%8C%E5%AE%9F%E8%A1%8C%E3%81%95%E3%82%8C%E3%81%9F%E3%82%8A%E3%80%81%20%E3%81%9D%E3%81%97%E3%81%A6%E3%81%94%E3%81%8F%E7%A8%80%E3%81%AB%E7%9B%B4%E6%8E%A5%E4%BE%9D%E5%AD%98%E3%81%97%E3%81%AA%E3%81%84%E3%83%86%E3%82%B9%E3%83%88%E3%81%A7%E4%B8%8D%E5%85%B7%E5%90%88%E3%81%8C%E8%A6%8B%E3%81%A4%E3%81%8B%E3%81%A3%E3%81%9F%E3%82%8A%E3%81%97%E3%81%9F%E3%81%93%E3%81%A8%E3%82%82%E3%81%82%E3%81%A3%E3%81%9F%EF%BC%88%E4%BE%8B%3A%20node%20%E3%81%AE%20version%20up%20%E3%81%A7%E3%81%86%E3%81%BE%E3%81%8F%E5%8B%95%E3%81%8B%E3%81%AA%E3%81%8F%E3%81%AA%E3%81%A3%E3%81%9F%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AA%E3%81%A9%EF%BC%89%E3%81%9F%E3%82%81%E3%80%81%20%E7%8F%BE%E5%9C%A8%E3%81%A7%E3%81%AF%E3%81%93%E3%81%AE%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AF%E5%88%A9%E7%94%A8%E3%81%9B%E3%81%9A%E5%85%A8%E5%AE%9F%E8%A1%8C%E3%81%95%E3%81%9B%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%97%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99)に以下の記述がされていましたので**却下**とします。
>修正数に応じてテスト時間にばらつきがでたり、 多くのファイルに依存しているファイルを編集するとほとんどのファイルが実行されたり、 そしてごく稀に直接依存しないテストで不具合が見つかったりしたこともあった（例: node の version up でうまく動かなくなったファイルなど）ため、 現在ではこのオプションは利用せず全実行させるようにしています

# 5.5. CIでJest cacheの保存・リストア
以下2つの記事を参考に実装します。
- [CI 環境でのユニットテストの実行時間を2倍速くした話 (Jest + Mongo DB + Circle CI)](https://engineering.meetsmore.com/entry/2021/01/21/134930#:~:text=4.-,CI%20%E3%81%A7%20Jest%20cache%20%E3%81%AE%E4%BF%9D%E5%AD%98%E3%83%BB%E3%83%AA%E3%82%B9%E3%83%88%E3%82%A2,-%E3%81%93%E3%81%93%E3%81%8B%E3%82%89%E3%81%AF)
- [JestのcacheをCIでも利用して高速化するメモ](https://madogiwa0124.hatenablog.com/entry/2022/10/01/143839)

CI で cache しやすいようにcacheの配置先を cacheDirectory で明示的に指定します。
cacheDirectory とは Jest がキャッシュされた依存情報を保存するディレクトリです。

```jest.config.ts
  // ...
  cacheDirectory: "node_modules/.cache/jest"
  // ...
}
```

```yaml
name: Test CI

on:
  push:
    branches:
      - '*'
  pull_request:
    branches:
      - '*'

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3

    - name: Use Node.js
      uses: actions/setup-node@v3
      with:
        node-version: 18

    - name: Install dependencies
      run: npm ci

    - name: cache jest
      uses: actions/cache@v3
      with:
        path: node_modules/.cache/jest
        key: jest-v1-${hashFiles('package-lock.json')}-${{ github.ref_name }}-${{ github.sha }}
        restore-keys: |
            jest-v1-

    - name: Get number of CPU cores
      id: cpu-cores
      uses: SimenB/github-actions-cpu-cores@v2

    - name: Run Jest tests
      run: npx jest  --max-workers ${{ steps.cpu-cores.outputs.count }}
```

# 5.6  CI自体の並列実行
以下の記事にも書いてある通り、job自体の実行時間の短縮はされないので**却下**とします
[github actions 上のテストを並列化する](https://qiita.com/itouoti/items/37e0420b232a1c694288#github-actions-%E4%B8%8A%E3%81%AE%E3%83%86%E3%82%B9%E3%83%88%E3%82%92%E4%B8%A6%E5%88%97%E5%8C%96%E3%81%99%E3%82%8B)
>github actions の実行時間無料枠の消費は job 単位(runs-on単位)となるため、パイプラインとしての実行時間は短縮されるが無料枠の消費時間は変わらない。


# 5.7 jest-light-runner
環境を仮想化することなく、素のNode.jsで直接テストを実行するJestランナーです。

使い方は以下のようにpackage.jsonか、jest.configを修正してください。
```package.json

{
  "jest": {
    "runner": "jest-light-runner"
  }
}
```
```jest.config.js
module.exports = {
  runner: "jest-light-runner",
};
```

[記事](https://backend.cafe/should-you-use-jest-as-a-testing-library)で以下のように書かれてました。
>全てのjest機能がこのランナーでサポートされているわけではないです。
 最もよく使われる機能は全て動作します。

実際に何が使えて何が使えないのかは[jest-light-runnerの公式](https://www.npmjs.com/package/jest-light-runner)に書いてました。
他に欠けているJest機能があるかもしれないとのことです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405182/193315c3-5435-d466-2dff-5c66195db4d2.png)

以下の理由で**不採用**とします。
- jestのゼロコンフィグの良さが失われる
- コミュニティが小さい中で設定をカスタマイズして運用していく（テストを独立して実行させたり、mockのimport等）のが難しそう

興味はあるので実際どのくらい速くなるのか今度検証してみます🙏。

# 5.8. swc/jest

```terminal
npm i --save-dev @swc/jest
```

```ts:jest.config.ts
transform: {
    '^.+\\.ts$': ['@swc/jest'],
  }
```

以下の問題点があります。
- 型チェックがされない
- spyonが使えない

spyonを使えるようにする設定につきましては別記事で投稿します🙏。

型チェックをするように設定します。
[tsconfig.jsonの主要オプションを理解する](https://qiita.com/ryokkkke/items/390647a7c26933940470#noemit)
以下です。
```ts:package.json
"scripts": {
   
    "tsc-swc-jest": "tsc --noEmit && npx jest"
  }
```

tscで型チェック、トランスパイルはswcで行うという流れです。

```processNumbers3.test.ts
import { processNumbers } from "../src/processNumbers";

describe("processNumbers", () => {
  it("should double each number in the array", () => {
    const numbers = [1, 2, 3];
    const result = processNumbers(numbers);
    expect(result).toEqual([2, 4, 6]);
  });

  it("should return an empty array if no numbers are provided", () => {
    const numbers: number[] = [];
    const result = processNumbers('');
    //tscの型チェックでここがエラーになります。
    expect(result).toEqual([]);
  });
});
```
```terminal
~/Desktop/github.com/yamatai12/jest-lab(test/swc-jest) $ npm run tsc-swc-jest

> jest-lab@1.0.0 tsc-swc-jest
> tsc --noEmit && npx jest

tests/processNumbers3.test.ts:12:35 - error TS2345: Argument of type 'string' is not assignable to parameter of type 'number[]'.

12     const result = processNumbers('');
                                     ~~
Found 1 error in tests/processNumbers3.test.ts:12

```

確かにエラーになりました。

この設定で検証します。

# 5.9. jest configファイルをjs、jsonにする
[JestでTypeScriptを高速化する](https://miyauchi.dev/ja/posts/speeding-up-jest/)
こちらの記事でconfigファイルをtsからjs,json形式にした方が速いと記載されていました。

トランスパイルする時間がconfigファイル分のみ短縮されるのであまり大きな効果は見込めないとは思いますが、検証します。

# 5.10. esbuild-jest
最近のバージョンアップ履歴が3年前なのも考慮して、esbuild-jestは**不採用**とします。
- [Jestを使ったテスト高速化のため、ts-jestではなく、@swc/jestを使ってみたら予想以上に速かった話](https://qiita.com/Kodak_tmo/items/f0ced5da16b45992a4c6)
- [npm esbuild-jest](https://www.npmjs.com/package/esbuild-jest)

# 6.検証結果
## 6.1. runInBand
ローカル
||1回目|2回目|3回目|
| :----------| :----------| :----------| :--
|runInBand|30.187s|30.028s|30.293s|
|defalut|7.919s|7.562s|7.535s|

|平均|
| :----------|
| 30.169s
| 7.672s

むしろ実行時間が増えたので runInBand は**不採用** とします。

## 6.2. max-workers

### ローカル --maxWorkers=49%
||1回目|2回目|3回目|
| :----------| :----------| :----------| :----------
maxWorkers=49%|8.201s|8.382s|8.308s|
defalut|7.919s|7.562s|7.535s|

||平均|
| :----------| :----------
maxWorkers=49%|8.297s 
defalut|7.672s

むしろ実行時間が増えたので--maxWorkers=49% は**不採用** とします。

:::note
### github-actions
||1回目|2回目|3回目|
| :----------| :----------| :----------| :----------
maxWorkers=github-actions-cpu-cores|2m17s|2m14s|2m26s
defalut|2m35s|3m46s|3m18s|

||平均|
| :----------| :----------
maxWorkers=github-actions-cpu-cores|139s
defalut|193s

[jest公式documentの設定](https://jestjs.io/docs/next/troubleshooting#:~:text=If%20you%20use,count%20%7D%7D)にすると、
github-actionsでの実行時間が短縮されることを確認できました。
:::

## 6.3. CI で Jest cache の保存・リストア
:::note
### github-actions
ci全体の実行時間です。
||1回目|2回目|3回目|
| :----------| :----------| :----------| :----------
cache+maxWorkers=github-actions-cpu-cores|2m2s|1m54s|2m25s
maxWorkers=github-actions-cpu-cores|2m29s|2m27s|2m42s|

||平均|
| :----------| :----------
cache+maxWorkers=github-actions-cpu-cores|127s
maxWorkers=github-actions-cpu-cores|153s

cacheを使うことで短縮されることを確認できました。
:::

# 6.4. tsc + swc/jest
:::note
### ローカル
||1回目|2回目|3回目|
| :----------| :----------| :----------| :----------
swc/jest|5.86s|5.742s|5.591s|
defalut|7.919s|7.562s|7.535s|

||平均|
| :----------| :----------
swc/jest|4.3602s
defalut| 7.672s

短縮されました。

### github-actions
||1回目|2回目|3回目|
| :----------| :----------| :----------| :----------
maxWorkers=github-actions-cpu-cores + tsc + swc/jest|1m59s|1m29s|1m19s
maxWorkers=github-actions-cpu-cores|2m17s|2m14s|2m26s

||平均|
| :----------| :----------
maxWorkers=github-actions-cpu-cores + swc/jest| 96s
maxWorkers=github-actions-cpu-cores|139s

短縮されました。
:::


# 6.5. jest configファイルをjs、jsonにする
### ローカル
||1回目|2回目|3回目|
| :----------| :----------| :----------| :----------
js|7.404s|7.383s|7.439s
defalut|7.919s|7.562s|7.535s|

||平均|
| :----------| :----------
js|5.6382s
defalut|7.672s

### github-actions
||1回目|2回目|3回目
| :----------| :----------| :----------| :----------
maxWorkers=github-actions-cpu-cores+config-js|2m21s|2m23s|1m40s
maxWorkers=github-actions-cpu-cores|2m17s|2m14s|2m26s

||平均|
| :----------| :----------
maxWorkers=github-actions-cpu-cores+config-js|128s 
maxWorkers=github-actions-cpu-cores|139s

- 大した差はなかったです。
- configファイルをts化する方がメリットが大きい（型チェックによる設定誤りの防止）ので不採用とします。

# 7. その他の改善案
- ファイル単位で遅いテストを改善する
- 全テストケースで共通的に実行される処理の見直し
- テスト戦略の見直し
    - 例）テストはとにかく速さ重視

# 8. ts-jestが今後高速化する？
そのような記事を見つけました。
[ts-jest が esbuild/swc をトランスフォーマーに使って高速化していた](https://blog.open.tokyo.jp/2023/04/13/ts-jest-will-gradually-opt-in-adoption-of-esbuild-swc-more-to-improve-the-performance.html)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405182/a67b2b20-098f-b299-b346-c48cba9ba54a.png)
[Presets](https://kulshekhar.github.io/ts-jest/docs/getting-started/presets/)

[Support for esbuild or swc](https://github.com/kulshekhar/ts-jest/issues/2135)
以下のようなissueが上がっていて、プルリクは作成されてないのでまだ着手されてないようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405182/0c082db7-1f10-b66c-6afc-f99476cb4e4c.png)
[CHANGELOG](https://github.com/kulshekhar/ts-jest/blob/main/CHANGELOG.md)にもそのような文言は見当たりません。

# 9. 最後に
### local
- defaultの設定のまま
### github-actions
- [jest公式documentの設定](https://jestjs.io/docs/next/troubleshooting#:~:text=If%20you%20use,count%20%7D%7D)にする
- jestのcacheを使用する

### swc/jestをtransformerに設定するのは以下を満たせば良いかなと思いました。
- テスト戦略的に速さを重視するのか
- swc/jestにすることでjestで使えない機能が出てしまうことによる工数の増加、テスト実装の柔軟性が失われるのか
- 本番環境と異なるトランスパイラを使用することによるテスト漏れ、バグの検証で時間がかかる可能性が低いのか
- トランスパイラを複数使うことによる運用工数があまりかからないのか

弊社は本番でvite(esbuild)、テストでts-jest(tsc)を採用しています。
swc/jest、ts-jestによるテストコードの書き換えが特にないのであれば、テストでswc/jestを採用しても問題なさそうです。
また、使用する際は **tsc --noEmitを実行してからswcでトランスパイル**する方法が型チェックもできて安全かなと思います。
### ts-jestが高速化したら、ts-jestに戻すのもありだなと思いました。

### vitestに乗り換えるメリットが大きいかは次回調査します。

# 参考になる記事を書いてくださった皆様に感謝致します！

# 参考
- [Jestでテストを書こう](https://typescriptbook.jp/tutorials/jest#:~:text=ts%2Djest%20%E3%81%AF%E3%80%81Jest%E3%82%92,%E3%81%A7%E3%81%8D%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82)
- [preset: ts-jest とは](https://blog.ojisan.io/ts-jest/)
- [jest transform](https://jestjs.io/ja/docs/configuration#transform-objectstring-pathtotransformer--pathtotransformer-object)
- [No speed difference after replacing ts-jest with @swc/jest?](https://www.reddit.com/r/typescript/comments/v8cc5t/no_speed_difference_after_replacing_tsjest_with/)
- [環境の準備とテストの実行](https://www.codegrid.net/articles/2017-jest-1/)
- [Monorepo下におけるJest実行方法のちょっとした改善](https://zenn.dev/tkiryu/articles/a6a43bd9d043b0)
- [jestのテストが遅い場合に確認すべきこと](https://ishikawa-pro.hatenablog.com/entry/2020/10/19/100000)
- https://www.quora.com/Are-logical-cores-always-double-that-of-physical-cores
- https://betterprogramming.pub/how-to-improve-the-jest-performance-in-ci-environments-when-using-typescript-66a186cb5cd4
- https://kazumaxneo.hatenablog.com/entry/2020/06/12/233000
- https://www.mankier.com/1/hyperfine
- [Make your Jest Tests upto 10x Faster](https://blog.devgenius.io/make-your-jest-tests-upto-10x-faster-d751b3428ded)
- [CI/CD — Improve The Testing Time in Jest and GitHub Action with 90% Effectiveness](https://didikmulyadi.medium.com/reducing-jest-execution-time-by-shard-parameters-and-github-matrix-from-90-120-minutes-to-5-7-ee86e91d7a99)
- [Improve Jest Runner Performance](https://blog.developer.adobe.com/improve-jest-runner-performance-a8f56708ba94)
- [How we sharded our test suite for 10x faster runs on GitHub Actions](https://www.edgedb.com/blog/how-we-sharded-our-test-suite-for-10x-faster-runs-on-github-actions)
- [CI 環境でのユニットテストの実行時間を2倍速くした話 (Jest + Mongo DB + Circle CI)](https://engineering.meetsmore.com/entry/2021/01/21/134930#:~:text=%E3%81%93%E3%81%AE%E6%96%B9%E6%B3%95%E3%81%A0%E3%81%A8%E4%BF%AE%E6%AD%A3%E6%95%B0%E3%81%AB%E5%BF%9C%E3%81%98%E3%81%A6%E3%83%86%E3%82%B9%E3%83%88%E6%99%82%E9%96%93%E3%81%AB%E3%81%B0%E3%82%89%E3%81%A4%E3%81%8D%E3%81%8C%E3%81%A7%E3%81%9F%E3%82%8A%E3%80%81%20%E5%A4%9A%E3%81%8F%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AB%E4%BE%9D%E5%AD%98%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E7%B7%A8%E9%9B%86%E3%81%99%E3%82%8B%E3%81%A8%E3%81%BB%E3%81%A8%E3%82%93%E3%81%A9%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%8C%E5%AE%9F%E8%A1%8C%E3%81%95%E3%82%8C%E3%81%9F%E3%82%8A%E3%80%81%20%E3%81%9D%E3%81%97%E3%81%A6%E3%81%94%E3%81%8F%E7%A8%80%E3%81%AB%E7%9B%B4%E6%8E%A5%E4%BE%9D%E5%AD%98%E3%81%97%E3%81%AA%E3%81%84%E3%83%86%E3%82%B9%E3%83%88%E3%81%A7%E4%B8%8D%E5%85%B7%E5%90%88%E3%81%8C%E8%A6%8B%E3%81%A4%E3%81%8B%E3%81%A3%E3%81%9F%E3%82%8A%E3%81%97%E3%81%9F%E3%81%93%E3%81%A8%E3%82%82%E3%81%82%E3%81%A3%E3%81%9F%EF%BC%88%E4%BE%8B%3A%20node%20%E3%81%AE%20version%20up%20%E3%81%A7%E3%81%86%E3%81%BE%E3%81%8F%E5%8B%95%E3%81%8B%E3%81%AA%E3%81%8F%E3%81%AA%E3%81%A3%E3%81%9F%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AA%E3%81%A9%EF%BC%89%E3%81%9F%E3%82%81%E3%80%81%20%E7%8F%BE%E5%9C%A8%E3%81%A7%E3%81%AF%E3%81%93%E3%81%AE%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AF%E5%88%A9%E7%94%A8%E3%81%9B%E3%81%9A%E5%85%A8%E5%AE%9F%E8%A1%8C%E3%81%95%E3%81%9B%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%97%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99)
- [Github Actions のテスト実行時間を速くするためにやったこと](https://tech.uzabase.com/entry/2022/12/18/143642)
- [Jestテストの並行実行と逐次実行をちゃんと理解する](https://qiita.com/noriaki/items/5d800ea1813c465a0a11)
- [テストCI実行時間を半分にした話](https://qiita.com/shippokun/items/2a4be572e6185e4f1d60)
- [JestでTypeScriptを高速化する](https://miyauchi.dev/ja/posts/speeding-up-jest/)
- [CircleCI上のフロントエンドテストの実行時間を30分から10分に短縮した話](https://note.com/show_kanamaru/n/nc9557b41f441)
- [自動テスト速度改善 - 自動テストが品質のボトルネックとならないために](https://developers.freee.co.jp/entry/improving-ci-testing-for-next-quality)
- [Jest v28 shard オプションを使い、CI でカバレッジを計測できるようにする](https://tech.classi.jp/entry/2022/08/25/095240)
- [NestJS 製のプロジェクトのテストを@swc/jest で高速化する](https://tech.mobilefactory.jp/entry/2021/12/17/000000)
- [A practical guide to removing frustration with Jest and Jenkins](https://medium.com/stuart-engineering/a-practical-guide-to-removing-frustration-with-jest-and-jenkins-cc73dd332152)
- [Write Parameterized Tests In Jest](https://vhudyma-blog.eu/write-parameterized-tests-in-jest/)
- [GitHub Actionsをローカルでテストする方法](https://book.st-hakky.com/docs/github-actions-act/)
- [GitHubActionsで自動ビルドする際、Tokenのスコープでつまづいた話](https://zenn.dev/urasaku77/articles/dd94110dd1041a)
- [How to speed up Jest tests](https://medium.com/@major_piotr/how-to-speed-up-jest-tests-fe2f6eba7f90)
- [JestのcacheをCIでも利用して高速化するメモ](https://madogiwa0124.hatenablog.com/entry/2022/10/01/143839)
- [github actionsのjobを高速にするために取った対策](https://qiita.com/itouoti/items/37e0420b232a1c694288)
- [Should you use jest as a testing library?](https://backend.cafe/should-you-use-jest-as-a-testing-library)
- [jest-light-runner](https://www.npmjs.com/package/jest-light-runner)
- [TypeScript + SWC + Jestでexport方法別のspyOnするパターンを書いた](https://blog.lycolia.info/typescript-swc-jest%E3%81%A7export%E6%96%B9%E6%B3%95%E5%88%A5%E3%81%AEspyon%E3%81%99%E3%82%8B%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E3%82%92%E6%9B%B8%E3%81%84%E3%81%9F/)
- [tsconfig.jsonの主要オプションを理解する](https://qiita.com/ryokkkke/items/390647a7c26933940470#noemit)
- [Jestを使ったテスト高速化のため、ts-jestではなく、@swc/jestを使ってみたら予想以上に速かった話](https://qiita.com/Kodak_tmo/items/f0ced5da16b45992a4c6)
- [GitHub Actionsをローカルでテストする方法を理解する](https://qiita.com/yamatai12/items/a74b68bbe60e1ed8bc2d)