【Jest】標準出力(console.log()など)を非表示にする方法!

Jestでテストを書いているとき、標準出力(console.log()など)を使ってデバッグしたいことがあります。しかし、テストが増えると、標準出力のログが増えて、必要な情報が見づらくなってしまいます。

この記事では、『Jestのテストで標準出力(console.log()など)を非表示にする方法』をシンプルなサンプルコードを用いてわかりやすく説明します。

Jestのテストで標準出力が出る場合

まず、Jestでのテスト実行時に標準出力が出る場合について説明します。一例として、以下にテスト対象ファイル(add.js)とテストファイル(add.test.js)を示します(各ファイルには、デバッグのためにconsole.log()などの標準出力をコードに埋め込んでいます)。

add.js

function add(a, b) {
  console.log('log');
  console.info('info');
  return a + b;
}

module.exports = add;

add.test.js

const add = require('./add');

test('adds 1 + 2 to equal 3', () => {
  console.log('test log');
  console.info('test info');
  expect(add(1, 2)).toBe(3);
});

このコードをnpx jestで実行すると、標準出力にログが表示されます。テストが多くなると、このようにログが見づらくなってしまいます。

$ npx jest
  console.log
    test log

      at Object.log (add.test.js:6:11)

  console.info
    test info

      at Object.info (add.test.js:7:11)

  console.log
    log

      at log (add.js:2:11)

  console.info
    info

      at info (add.js:3:11)

 PASS  ./add.test.js
  √ adds 1 + 2 to equal 3 (29 ms)

Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        0.385 s, estimated 1 s
Ran all test suites.

標準出力(console.xxx())を非表示にする方法

標準出力(console.log()など)を非表示にする方法を以下に示します。どちらの方法でも構いません。目的に応じて使い分けましょう。

  • 方法1: --silentオプションを使う
  • 方法2: 標準出力(console.xxx())をモックする

方法1: --silentオプションを使う

Jestには--silentオプションがあり、テスト実行中の標準出力(console.log()など)を抑制できます。

--silentオプションを付けてテストをした結果を以下に示します。

$ npx jest --silent
 PASS  ./add.test.js

Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        0.362 s, estimated 1 s

上記の実行結果から分かるように--silentオプションを付けると標準出力が表示されなくなります。なお、npx jest --silent=truenpx jest --silent trueでも非表示にできます。

$ npx jest --silent=true
 PASS  ./add.test.js

Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        0.353 s, estimated 1 s

補足

package.jsonのスクリプトに--silentオプションを追加することで、npm testでテストを実行した際も標準出力を抑制できます。

"scripts": {
  "test": "jest --silent"
}

方法2: 標準出力(console.xxx())をモックする

Jestの「setupFilesオプション」または「setupFilesAfterEnvオプション」で初期設定ファイルを指定し、そのファイル内でjest.spyOnを使用してconsole.log()などの標準出力をモックする方法もあります。

あわせて読みたい

setupFilessetupFilesAfterEnvは、Jestのテストを実行する前に特定の設定や処理を行いたい場合に使用する設定項目です。各オプションで指定したファイルがテストが始まる前に実行されます。

setupFilessetupFilesAfterEnvについては下記の記事で詳しく説明しています。興味のある方は下記のリンクからぜひチェックをしてみてください。

まず、プロジェクトのルートにjest.setup.jsというファイルを作成し、以下のコードを追加します。

jest.setup.js

jest.spyOn(console, 'log').mockImplementation(() => {});
jest.spyOn(console, 'info').mockImplementation(() => {});

次に、プロジェクトのルートにjest.config.jsというファイルを作成し、以下のコードを追加します。今回はsetupFilesオプションを用いています。

jest.config.js

module.exports = {
  setupFiles: ['./jest.setup.js'],
};

これでnpx jestでテストを実行すると、標準出力が表示されなくなります。

$ npx jest
 PASS  ./add.test.js

Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        0.362 s, estimated 1 s

本記事のまとめ

この記事では『Jestのテストで標準出力(console.log()など)を非表示にする方法』について、以下の内容を説明しました。

  • 標準出力を非表示にする方法
    • --silentオプションを使う
      • npx jest --silentで実行すると、標準出力を抑制できる。
      • package.json"scripts"にも設定可能。
    • 標準出力をモックする
      • jest.setup.jsjest.spyOn(console, 'log').mockImplementation(() => {});などを追加。
      • jest.config.jssetupFilesオプションを設定する。

お読み頂きありがとうございました。