[Jest] テストFail時に備えて後処理はafterAll()またはafterEach()で実施する

2021.08.21

こんにちは、CX事業本部 IoT事業部の若槻です。

Jestは、JavaScriptのテスティングフレームワークです。Facebookが開発しています。

今回は、JestではテストのFail時に備えて後処理はafterAll()またはafterEach()で実施しよう、という記事です。

test()内でFailしたテスト以降の処理は実行されない

次のようなテストがあります。test()の冒頭でテストで使用するtempフォルダを作成し、末尾で後処理として削除しています。(今回はexpect(1).toBe(1)のように簡略化していますが、実際のテスト対象のコードはこちらの記事のようなファイル作成処理を伴うコードをイメージしています)

sample.test.ts

import fs from 'fs';
import path from 'path';

test('Case1', () => {
  const tempPath = path.join(__dirname, 'temp');
  fs.mkdirSync(tempPath); //前処理:フォルダ作成

  expect(1).toBe(1); //Passするテスト

  fs.rmdirSync(tempPath); //後処理:フォルダ削除
});

テスト実行すると予想通り成功します。

$ jest sample.test.ts

 PASS  sample.test.ts
  ✓ Case1 (2 ms)

tempフォルダも後処理としてちゃんと削除されています。

$ ls
sample.test.ts

続いて、次のようなテストです。同じく前処理のフォルダ作成、後処理のフォルダ削除を行いますが、テストはFailします。

sample2.test.ts

test('Case2', () => {
  const tempPath = path.join(__dirname, 'temp');
  fs.mkdirSync(tempPath); //前処理:フォルダ作成

  expect(1).toBe(2); //Failするテスト

  fs.rmdirSync(tempPath); //後処理:フォルダ削除
});

テストを実行すると失敗します。

$ jest sample.test.ts

 FAIL  sample.test.ts
  ✕ Case2 (4 ms)

  ● Case2

    expect(received).toBe(expected) // Object.is equality

    Expected: 2
    Received: 1

      6 |   fs.mkdirSync(tempPath);
      7 |
    > 8 |   expect(1).toBe(2);
         |             ^
      9 |
      10 |   fs.rmdirSync(tempPath);
      11 | });

この時、作成されたtempフォルダが削除されず残ってしまいます。これは、失敗したexpectマッチャーの箇所でテストの実行が停止し、後処理のフォルダ削除が実行されないためです。

$ ls
sample.test.ts  temp

afterAll()またはafterEach()で後処理を実施する

afterAll()またはafterEach()を使用すれば、テストの成否に関わらず後処理を実施することができます。

下記のテストはFailしますが、後処理のフォルダ削除はafterAll()により必ず実行されます。

sample.test.ts

describe('sample', () => {
  const tempPath = path.join(__dirname, 'temp');
  afterAll(() => {
    fs.rmdirSync(tempPath); //後処理:フォルダ削除
  });

  test('Case2', () => {
    fs.mkdirSync(tempPath);

    expect(1).toBe(2); //Failするテスト
  });
});

describeブロック内に複数のtest()がある場合は、afterEach()を使えば各テストの終了後に後処理が行われます。

sample.test.ts

describe('sample', () => {
  const tempPath = path.join(__dirname, 'temp');
  afterEach(() => {
    fs.rmdirSync(tempPath); //後処理:フォルダ削除
  });

  test('Case1', () => {
    fs.mkdirSync(tempPath);

    expect(1).toBe(1);
  });

  test('Case2', () => {
    fs.mkdirSync(tempPath);

    expect(1).toBe(2);
  });
});

まとめ

  • JestでテストFail時はit()ブロック内でのそれ以降の処理は実行されない。
  • テストのFail時に備えて後処理はafterAll()またはafterEach()で実施するようにしよう。

参考

以上