📝

PHPUnitで学ぶsetUpとtearDown

2023/04/30に公開

はじめに

PHPUnitの機能に「setUp」と「tearDown」があることを知った。
が、使い方があまりピンと来なかったので公式ドキュメントを読んで勉強してみることにした。
調べていくうちに、他言語向けテストフレームワークにも存在する機能であることを知ったため、基本概念をまとめてみた。

想定読者

単体テストに慣れていない人

単体テストは「Arrange, Act, Assert」からなる

1.Arrange - 準備

テストの事前準備を行うフェーズで、「テストを実行するために必要な状態を構築すること」が目的。具体的には、テストに必要なオブジェクトの作成、モックの設定、テストデータの準備などが含まれる。これらをまとめてテストフィクスチャと呼ぶ。

2.Act - 実行

テスト対象のメソッドや機能を実行するフェーズで、「テスト対象のコードを実行し、期待結果を得ること」が目的。

3.Assert - 検証

テスト対象のメソッドや機能の実行結果が期待通りであることを検証するフェーズで、「テスト対象コードの動作検証」が目的。

期待値を用意し、テスト対象コードの実行結果との一致を確認する。

setUpとtearDown

Arrangeフェーズで用意するテストフィクスチャを共通化し、コードの重複を減らすことでテストのメンテナンスを容易にするためのメソッド。

setUpメソッド

テストケースが実行される前に、各テストケースごとに実行されるメソッド。

テストフィクスチャを初期化するために使われ、オブジェクトのインスタンス化、データベース接続、ファイルの読み込みなど、テストに必要な環境を整える処理を行う。

これにより、各テストケースは独立して実行される。他のテストケースの結果に影響を受けない。

tearDownメソッド

テストケースが実行された後に、各テストケースごとに実行されるメソッド。

テスト後の後処理やリソースの解放を行う。これには、オブジェクトの破棄、データベース接続の切断、ファイルのクローズなどが含まれる。tearDownによって、次のテストケースがクリーンな状態で実行されることが保証される。

コード例

<?php

use PHPUnit\Framework\TestCase;

require_once __DIR__ . '/../src/summary.php';

/**
 * @covers summary
 */
class SummaryTest extends TestCase
{
    protected $summary;

    protected function setUp(): void
    {
        $this->summary = new Summary();
    }

    public function testSummary()
    {
        $a = 3;
        $b = 4;
        $expectedResult = 7;

        $result = $this->summary->sum($a, $b);

        $this->assertSame($expectedResult, $result);
    }

    protected function tearDown(): void
    {
        $this->summary = null;
    }
}

このテストコードを「Arrange, Act, Assert」に当てはめると以下の通りになる。

  1. Arrange:テストを実行するために必要な状態を構築
    • setUp メソッド内で、$this->summary インスタンスを準備する。
  2. Act:テスト対象のコードを実行し、期待結果を得る
    • testSum メソッド内で、$this->summary->sum($a, $b) を実行する。
  3. Assert:テスト対象コードの動作検証
    • testSum メソッド内で、$this->assertSame($expectedResult, $result); を使って期待通りの結果が返されているか確認する。

最後に、tearDown メソッドでテスト後のクリーンアップを行う。

補足

この例のように、tearDownメソッドでインスタンスをnullにする必要はほぼない。

一般的には、setUp()で外部リソースを割り当てた場合にそれを解放する目的でtearDownメソッドを実装するらしい。

参考

Discussion