ウェブエンジニア問題集

単体テストの構造

学習者学習者

テストコードってどういう順番で書けばいいの?なんとなく書くと、すぐ散らかっちゃう…。

AAAパターンについて考えていく

単体テストの記述はAAAパターンで記述するのが基本です。

AAAパターンとは、Arrange-Act-Assertの略で、単体テストを書くときの3つのステップを表しています。

  1. Arrange テストを実行するための準備
  2. Act テストを実行
  3. 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);
  });
});