そもそもJestとは?
一番人気なJSのテストフレームワーク
https://2020.stateofjs.com/en-US/technologies/testing/
なぜ人気なのか
筆者がJestを選ぶ一番の理由は、依存が少なく高機能であることです。
↓こちら参照
https://www.codegrid.net/articles/2017-jest-1/
テストランナー、アサーション、モックが全て含まれている。
カバレッジも見ることができるらしい。
インストール方法は?
公式からパクリ
npm i jest @types/jest ts-jest -D
-
jest
- jestフレームワーク(これが普通jestと呼ばれるもの)
-
@types/jest
- https://www.npmjs.com/package/@types/jest
- テストファイルの型チェックをする場合は必要
-
ts-jest
- Jest用のTypeScriptプリプロセッサ
- Jestはその場でTypeScriptをトランスパイルすることができるようになる
- Babelを使っている場合は不要
設定方法は?
jest.config.jsファイルで設定する
module.exports = {
"roots": [
"<rootDir>/src"
],
"testMatch": [
"**/__tests__/**/*.+(ts|tsx|js)",
"**/?(*.)+(spec|test).+(ts|tsx|js)"
],
"transform": {
"^.+\\.(ts|tsx)$": "ts-jest"
},
}
- roots:
- テストファイルを配置するディレクトリ
- テストドキュメントではプロジェクトのsrcフォルダに設定することを非常におすすめしている
- デフォルトで設定されていた
<rootDir>/test
はcdkのテストファイルをおくディレクトリ
- testMatch:
- テストファイル名にマッチする正規表現文字列の配列
- transform:
- 正規表現でマッチしたファイルに対してts-jestを使うように指示
-
"^.+\\.(ts|tsx)$": "ts-jest"
これだとts/tsxファイルでts-jestを使う
実行方法は?
package.jsonのスクリプトに以下を追加すると、npm run test
で実行できる
"scripts": {
"test": "jest"
},
npm run test --watch
でwatchモードも可
テストファイルはどこにおけば良い?
大きく2パターンある
-
srcディレクトリにおく
公式がおすすめしているパターンメリット:テストがあるかすぐ確認できる?
デメリット:個人的にプロジェクトとテストのディレクトリは分けたいかも、、└──src ├── fuga ├── fuga.test ├── hoge └── hoge.test
-
testディレクトリにおく
メリット:スッキリしている気がする。
デメリット:テストファイルからテスト対象ファイルをimportするときにpathが長くなる
公式がおすすめしているパターンじゃないですけど、なにか不都合なことがあるんでしょうか?
私がよく使うLambdaの場合はsrcに入れるとテストファイルまでデプロイされるのでこっち?👀
├──src
│ ├── fuga
│ └── hoge
│
└──test
├── fuga
└── hoge
何をテストするの?テストの単位は?
まず、前提としてテストのカバレッジを100%にする必要はない。
テストの対象となるのは、大雑把に言うと
- なんかやばそうなところ
- 将来変更が入りそうなところ
- リファクタしたいところ
↓の記事が大変参考になりました。
https://qiita.com/jnchito/items/2a5d3e15761fd413657a
「テストコードがない状態だとリファクタリングできないし、リファクタリングできない状況でコードレビューしても無駄なので、まずはテストコードを書いて下さい」
肝に銘じます。
基本的にユニットテストなので、テストの単位は関数やメソッドになる。
インテグレーションテストを書くこともできる。
参考
https://typescript-jp.gitbook.io/deep-dive/intro-1/jest
https://dackdive.hateblo.jp/entry/2019/04/15/000000
https://t-yng.jp/post/tsc-and-babel