92
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

PHPUNITのテストメソッド実行前後の処理まとめ

PHPUNITのテストメソッド実行前後の処理まとめ

概要

PHPer界隈からも割と敬遠されがちなPHPUNIT。
ただでさえ書くのが面倒なテストですが、僕は毎回PHPUnit_Framework_TestCaseが覚えられずにぐぐってしまいます・・・

DB関連やリクエスト関連のテストで良く使うのが、前処理・後処理等の下処理。
setUpとtearDownを主に使いますが、実は他にも色々な下処理やフック処理が出来たりします。

一応PHPUNITマニュアルにもあるのですが、特に僕含むPHPUNIT初心者の方の為にざっくりとまとめてみました。

メソッド名の手前に(static)がある場合、public static ~~でメソッドを追加しましょう。

一覧

各テストメソッド毎に実行

setUp

各テストメソッドの実行前に呼ばれるメソッド。
テストメソッド毎に同じ環境を用意し、メソッド内で動的に変化させて追従したい場合に便利。
(利用例)モック用オブジェクトの生成・テスト用データベースの生成・ファイルの生成

tearDown

各テストメソッドの実行後に呼ばれるメソッド。
次のテストメソッドに影響が出ない様に、データベースやファイルの破棄をするのに便利。
(利用例)テスト用データベースの破棄・ファイルの破棄

テストクラス内で一度だけ実行

(static) setUpBeforeClass

一番最初のテストメソッド実行前(setUp()よりも前)に呼ばれるメソッド。
全てのテストメソッドで同じ物を使いまわしたい、テスト内で動的に変化させて追従したい場合に便利。
(利用例)テスト用テーブルの作成等・テスト利用ファイルの生成等

(static) tearDownAfterClass

一番最後のテストメソッド実行後(tearDown()よりも後)に呼ばれるメソッド。
全てのメソッドで使いまわしたり生成したファイル等を掃除したりする場合に便利。
(利用例)テスト用テーブルの削除・ファイルの削除等

assert系メソッドのフック

assertPreConditions

assert系メソッドの実行直前に毎回実行されるメソッド。
正直、いつ使うのか分かりません・・・

assertPostConditions

assert系メソッドの実行直後に毎回実行されるメソッド。テストが落ちた場合、実行はされない。
これもいつ使うのかが想像出来ません。

assert不合格時のフック

onNotSuccessfulTest

assertメソッドのテストに合格しなかった場合、tearDown()の後に実行されるメソッド。
引数としてExceptionが投げられ、throwしたりゴニョゴニョしたり出来ます。
エラーメッセージを分かりやすくしたり、個別でログに残したりすると便利かもしれません。

まとめ

テスト実行時の処理順としては

public __construct();
public static setUpBeforeClass();

# テストメソッド繰り返し
    public setUp();
    public assertPreConditions();

    # assertメソッド実行
    if (assert() === true) {
       public assertPostConditions();
       public tearDown();

    } else {
       public tearDown();
       public onNotSuccessfulTest(Exception $e);

    }
# テストメソッド繰り返し

public static tearDownAfterClass();
public __destruct();

かなり見難いですが、こんな感じになるかと思います。
処理順については、時間があれば画像に差し替えたいと思います。

各メソッドの説明に個人的意見が含まれていますが、「こんな使い方あるよー!」という例題があればどんどん編集お願い致します!
それでは良いテスト生活を。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
92
Help us understand the problem. What are the problem?