PHPUnitでユニットテスト④ setUp, tearDownによるテストの前後処理

PHPUnitの前処理、後処理


PHPUnitで、各テスト実行前後で共通処理を行う方法をメモします。

環境: PHPUnit 9.5.4、 PHP 7.4.8

setUpメソッドで前処理を行う

テストケースクラス内でsetUpメソッドを定義すると、毎回同じテストケースクラス内の各テストメソッドを呼び出す前に自動的に実行され、テストの前処理を行うことができます。

public function setUp(): void
{
    // 各テストメソッド実行前に行いたい処理
}

テストメソッドを実行する際に毎回行なっているテスト対象クラスのインスタンス化や、テストに使用するための※共通データの初期化などをここに記述して処理を共通化することが出来ます。

※フィクスチャという

tearDownメソッドで後処理を行う

setUpとは反対に実行したテストメソッドを終了する際に共通的に行いたい処理は、tearDownメソッドによって実現出来ます。

public function tearDown(): void
{
    // 各テストメソッド終了時に行いたい処理
}

テストメソッド内で使用する対象データやオブジェクトを毎回破棄している場合などに利用できます。

前処理、後処理は両方を必ず定義する必要はなく、テストケースの内容によって片方しか使用しない場合であっても問題ありません。

テストケース全体に対しての前後処理

テストケース単位、テストメソッドごとではなく、一つのテストケースのテスト全体に対しての前処理、後処理もそれぞれ下記の方法で行うことが出来ます。

setUpBeforeClass

setUpBeforeClassメソッドを定義し、テストケース全体の前処理、つまり最初に実行されるテストメソッドよりも前に一回だけ実行される処理を作成します。

setUpBeforeClassはstaticメソッドのため、関数名の前にstatic修飾子を付ける必要があります。

public static function setUpBeforeClass(): void
{
    // テスト全体の前処理
}

tearDownAfterClass

全体前処理のsetUpBeforeClassとは反対に全体の後処理はtearDownAfterClassメソッドを定義して行います。

全体の後処理なので、最後に実行されるテストメソッドが終了した後に一度だけ実行されます。

setUpBeforeClassと同様、関数名の前にstatic修飾子を付け、staticメソッドとして定義します。

public static function tearDownAfterClass(): void
{
    // テスト全体の後処理
}

動作例

<?php
use PHPUnit\Framework\TestCase;

class ExampleTest extends TestCase
{   
    public static function setUpBeforeClass(): void
    {
        echo "setUpBeforeClass\n";
    }

    public static function tearDownAfterClass(): void
    {
        echo "tearDownAfterClass\n";
    }
    
    public function setUp(): void
    {
        echo "setUp\n";
    }

    public function tearDown(): void
    {
        echo "tearDown\n";
    }

    // テストケース1
    public function testExample1()
    {
        // test example
    }
    
    // テストケース2
    public function testExample2()
    {
        // test example
    }
}

上記例のように、テストケースクラス内にsetUp、tearDown、setUpBeforeClass、tearDownAfterClassを全て定義した場合の動作、実行結果は以下のようになります。

.setUpBeforeClass
.setUp
tearDown
.setUp
tearDown
tearDownAfterClass

setUpBeforeClassとtearDownAfterClassが最初と最後に一回ずつ、setUp、tearDownはそれぞれテストメソッドの数だけ実行されていることがわかります。

Follow me!