jest-fail-on-consoleを使って、テスト実行時のconsole.error/warnを撲滅した話
お疲れ様です!株式会社 CastingONEで働いているフロントエンドエンジニアの岡本です。
今回は、テスト実行時に出力されるconsole.error
やconsole.warn
を撲滅するために、npmパッケージjest-fail-on-consoleを導入した話を書きます。
はじめに
弊社のアプリケーションのフロントはjestとtesting-libraryを使ってテストを書いています。jestはテスト実行結果のログが大変見やすく、FAILしたテストの詳細も表示されるので、テストを書いているときには非常に助かります。
ですが、テスト実行時にconsole.error
やconsole.warn
が発生すると、テスト結果のログにそれらが出力され、ログが非常に見づらくなります。 console.error
やconsole.warn
が出力されても、テスト自体に問題なければPASSしてしまうため、気づかないまま放置されることが多く、結果的にこれがログのノイズとなってしまっていました。
console.error
、console.warn
が出力されるテストをStackblitzで用意したので、ターミナルを確認してみてください。
実際に弊社のアプリケーションでも以下のようなconsole.error
やconsole.warn
が散見していました。
このような状態が続いていると、いわゆる「割れ窓理論」のようにログのノイズが増えていき、どんどんテスト結果のログが読みにくくなってしまい、FAILした箇所のような 本当に確認したいログを見つけるのに時間がかかってしまいます。。
この状態を改善するために、以下の2つの目標を設定しました。
-
console.error
やconsole.warn
が出力されたテストをFAILにし、恒久的に発生しない仕組みづくり - すでにログが出力されているテストのログを撲滅
1に関して、「console.error
やconsole.warn
が出力されるテストケースをFAILにしたいなぁ」と思い、機能を自作するつもりで色々調査をしていたところ、jest-fail-on-consoleというnpmパッケージを見つけ、これが筋が良さそうだと思い、導入することにしました!
jest-fail-on-consoleについて
jest-fail-on-consoleは、jestのテスト実行時にconsole.error
やconsole.warn
のような、console系のログが出力された際にテストをFAILにすることができるnpmパッケージです。簡単な導入方法を以下に記載します。
インストール
npm install --save-dev jest-fail-on-console
セットアップ
jest.setup.ts
のような、setupFilesAfterEnv
に指定されているファイルに以下のコードを追加します。
import failOnConsole from 'jest-fail-on-console';
failOnConsole()
// 他のjestの設定....
デフォルトの設定で、console.error
とconsole.warn
をテストをFAILにしてくれます。もし、console.info
やconsole.log
などもFAILにしたい場合は、以下のようなオプションを設定することでFAILにすることができます。
import failOnConsole from 'jest-fail-on-console';
- failOnConsole()
+ failOnConsole({
+ shouldFailOnLog: true,
+ shouldFailOnInfo: true,
+ })
// 他のjestの設定....
先の章で使用したStackblitzのサンプルコードにjest-fail-on-console
を導入したものを用意したので、ターミナルを確認してみてください。
以下の画像のように、console.error
やconsole.warn
が出力された場合、テストがFAILするようになりました!
導入前 | 導入後 |
---|---|
console.error/warn撲滅活動
jest-fail-on-console
を導入することによって、console.error
やconsole.warn
が出力されるテストをFAILにすることができるようになり、1つ目の目標が完了しました!
しかし、この対応だけだと、すぐに2つ目の目標のすでにログが出力されているテストも修正しないと テストがFAILになってしまい、CIなどでテストが通らなくなり、開発に支障が出てしまいます。
そこでskipTest
というオプションを使い、以下のような対応を行いました。
すでにログが出力されているテストのFAILを回避
jest-fail-on-console
にはskipTest
というオプションがあり、特定のファイルに対してはコンソール出力があってもFAILにしない設定ができます。これを使って、すでにログが出力されているテストファイルを一時的にスキップし、FAILを回避しました。
FAILしているテストファイルの取得
jest-fail-on-console
のセットアップ後に、以下のコマンドを実行して、FAILしているテストファイルのパスを取得します。
npm run test 2>&1 | grep 'FAIL' | uniq
このコマンドはFAILというキーワードを含む行だけを抽出し、重複している行を取り除く処理を行っています。
skipTest
オプションの設定
上で取得したテストファイルのパスをignoreList
のような変数に格納し、skipTest
オプション内でチェックするようにします。
import failOnConsole from 'jest-fail-on-console';
const ignoreList = [
'src/components/Console.test.tsx',
'src/components/Console2.test.tsx',
]
failOnConsole({
skipTest({ testPath }) {
const isMatch = ignoreList.some((path) => testPath.endsWith(path))
if (isMatch) {
return true
}
return false
},
})
skipTest
のコールバック関数で、testPath
という実行されるテストのファイルパスを受け取り、そのテストがignoreList
に含まれているかどうかをチェックしています。含まれている場合はtrue
を返し、FAILにしないようにしています。
これにより、すでにログが出力されているテストファイルを指定して、FAILを回避することができました!
あとはignoreList
に格納されているテストファイルを元にログを確認しながら該当コードを修正し、console.error
やconsole.warn
を撲滅していく作業を進めていきました!
まとめ
以上が、jest-fail-on-console
を使って、テスト実行時のconsole.error
やconsole.warn
をFAILにして、ログのノイズを撲滅したお話でした。撲滅するにあたって、jest-fail-on-console
のようなツール作る必要あるなぁと思ってましたが、やりたかったこと全てを兼ね備えていた、最高のnpmパッケージでした!みなさんもぜひ導入してみてください!
Discussion