単体テストの構造
学習者テストコードってどういう順番で書けばいいの?なんとなく書くと、すぐ散らかっちゃう…。
AAAパターンについて考えていく
単体テストの記述はAAAパターンで記述するのが基本です。
AAAパターンとは、Arrange-Act-Assertの略で、単体テストを書くときの3つのステップを表しています。
- Arrange テストを実行するための準備
- Act テストを実行
- Assert テストの結果を検証
具体的には、以下のようになります。
describe('Unit Test', () => {
it('should be true', () => {
// Arrange
const a = 1;
const b = 2;
const expected = 3;
// Act
const result = a + b;
// Assert
expect(result).toBe(expected);
});
});通常は準備のArrange記述から始めますが、テスト駆動開発の場合は最初からアサートを書きます。
このような書き方は直感的でないように感じるかもしれませんが、解決したい問題は何かというゴールから逆算していくという意味では自然な流れです。
テスト駆動開発ではなく、すでに実装済みのコードがある場合は、まずはそのコードをテストするために必要な準備Arrangeの記述から始めます。
AAAパターンで同じステップを複数になることは避ける
AAAパターンでは、同じステップを複数になることは避けるべきです
Act → Assert のサイクルが複数回になっている。これは統合テストの兆候であり、単体テストとしては避けるべきパターンです。
フィクスチャは「複数のテストで共通するArrangeを抽出・共有する仕組み」です
テストフィクスチャとは、テストの実行に必要な前提条件や環境のことです。 テストデータ、モックオブジェクト、DB接続、設定済みのインスタンスなど、テストが動くために必要な「お膳立て」全体を指します。
// フィクスチャ 複数のテストで共通する準備をまとめる
let user: { name: string; age: number };
beforeEach(() => {
// 各テストの前に共通のArrangeを実行
user = { name: 'Alice', age: 25 };
});
describe('User', () => {
it('名前が正しい', () => {
expect(user.name).toBe('Alice');
});
it('成人である', () => {
expect(user.age).toBeGreaterThanOrEqual(18);
});
});