LoginSignup
24
18

More than 5 years have passed since last update.

PHPUnitでテストメソッド間の依存性を表現する

Last updated at Posted at 2013-07-29

PHPUnit は、テストメソッド間の依存性の明示的な宣言をサポートしています。

この依存性とは、テストメソッドが実行される順序ということではありません。
テストメソッド間の依存関係を明示的に宣言することにより、あるテストメソッドの結果を、それに依存するテストメソッドが受け取り再利用できるというものです。

テスト対象コード

sample.php
<?php

class Sample
{
    protected $id;
    protected $name;

    public function __construct($id, $name)
    {
        if (is_int($id)) {
            $this->id   = $id;
            $this->name = $name;
        } else {
            throw new InvalidArgumentException();
        }
    }

    public function getId()
    {
        return $this->id;
    }

    public function getName()
    {
        return $this->name;
    }
}
  • int型のIDにより適正にインスタンス化できることをテストしたい
  • int型のIDでない場合は例外が発生することをテストしたい
  • 適正にインスタンス化できた場合はID,Nameを取得できることをテストしたい

テストコード

sampleTest.php
<?php
require_once 'Sample.php';

class SampleTest extends PHPUnit_Framework_TestCase
{
    /**
     * @test
     */
    public function int型のIDにより適正にインスタンス化できる()
    {
        $sample = new Sample(1, 'hoge');
        $this->assertInstanceOf('Sample', $sample);

        return $sample;
    }

    /**
     * @test
     * @expectedException InvalidArgumentException
     */
    public function string型の場合は例外が発生する()
    {
        new Sample('邪王炎殺黒龍波', '邪王炎殺拳');
    }

    /**
     * @test
     * @depends int型のIDにより適正にインスタンス化できる
     */
    public function IDを取得できる($sample)
    {
        $this->assertEquals(1, $sample->getId());
    }

    /**
     * @test
     * @depends int型のIDにより適正にインスタンス化できる
     */
    public function Nameを取得できる($sample)
    {
        $this->assertEquals('hoge', $sample->getName());
    }
}

このように、@dependsアノテーションを活用することによって、テストメソッド間の依存関係を表現することができます。

今回の例では、あるテストメソッドが生成したインスタンスを使いまわし依存関係にあるテストでインスタンスのプロパティをテストしています。

これにより「インスタンス生成の検証」と「プロパティの検証」を別々に記述できるのでテスト失敗時に問題のアサーションを発見しやすくなります。また、モックオブジェクトを生成せずに、実際のソフトウェアにおける依存関係を忠実に表現したテストがシンプルに作成できます。

24
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
24
18