この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
こんにちは、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()
で実施するようにしよう。
参考
以上