phpunitテストフレームワーク

19274 ワード

PHPUnit学習ノート
PHPUnitは軽量レベルのPHPテストフレームワークです.それはPHP 5の下でJUnit 3シリーズのバージョンの完全な移植で、xUnitテストフレームワークの家族の一員です(それらはすべてモードの先鋒Kent Beckの設計に基づいています)
PHPUnit作成テストの基本的な慣例と手順
クラスクラスクラスに対するテストはクラスクラスクラスTestに書きます.
ClassTest(通常)PHPUnit_から継承Framework_TestCase.
テストはtest*という名前の共通の方法です.
メソッドのドキュメントアノテーションブロック(docblock)で@test寸法を使用してテストメソッドとしてマークすることもできます.
テストメソッドでは、assertEquals()のような断言メソッドを使用して、実際の値と予想値の一致を断言します.
例:PHPUnitで配列操作をテストする

class StackTest extends PHPUnit_Framework_TestCase
{
    public function testPushAndPop()
    {
        $stack = array();
        $this->assertEquals(0, count($stack));
        array_push($stack, 'foo');
        $this->assertEquals('foo', $stack[count($stack)-1]);
        $this->assertEquals(1, count($stack));
        $this->assertEquals('foo', array_pop($stack));
        $this->assertEquals(0, count($stack));
    }
    /**
     *   test            
     * @test
     */
    public function indexEquals()
    {
        $stack = array(1,2,3,4);
        $this->assertEquals(2,$stack[0]);  //  
    }
}
?>
  • 一般的には、ユニットテストは、テスト例クラスで、プログラム内の関連関数、クラス、インタフェース、プロセスの実行結果が予想通りかどうかをテストするために断言(assert)を使用する一連のテスト方法を定義することである.
  • ある部分の実行結果があなたの期待した結果と同じでなければ、PHPUnitはあなたに問題を報告して、あなたも報告によってプログラムのBugを確認して修復することができます.あなたのプログラムに対して詳しい完全なユニットテストを書くと、新しい機能を完成するたびにソフトウェアのすべての機能を一つ一つテストする必要はありません.また、プログラムが発表される前に、少なくともテストを通じて内部論理Bugと欠陥の大部分を消滅することができます.
  • と同様に、その後のメンテナンス開発で、ある機能の修正で関連する他のモジュールを誤って変更した場合、以前の完全なユニットテストでも関連する問題を報告し、問題をタイムリーに発見し、修復することができます.

  • メソッド間の依存関係のテスト
    テスト方法は、必ずしもパッケージされた独立したエンティティではないわけではありません.テスト方法の間には、テストの実装スキームに隠された依存関係が常に隠されている.
    依存関係はコメント@dependsで定義する.この特性は一般的にコードの論理過程を検査するために用いられ、1つの論理の実行前提は別の論理の実行結果である.
    例:@depends寸法で依存関係を表す
    
    class StackTest extends PHPUnit_Framework_TestCase
    {
        public function testEmpty()
        {
            $stack = array();
            $this->assertEmpty($stack);
            return $stack;
        }
        /**
         * @depends testEmpty
         */
        public function testPush(array $stack)
        {
            array_push($stack, 'foo');
            $this->assertEquals('foo', $stack[count($stack)-1]);
            $this->assertNotEmpty($stack);
            return $stack;
        }
        /**
         * @depends testPush
         */
        public function testPop(array $stack)
        {
            $this->assertEquals('foo', array_pop($stack));
            $this->assertEmpty($stack);
        }
    }
    ?>

    チェックに異常がないと断言すれば、PHPUnitは依存関係が終了するまで依存関係に従って依存のテスト方法を順次実行する.
    問題の所在を迅速に特定するために、ある試験方法に依存する方法の試験が成功しなかった場合、PHPUnitは自動的に後のすべての依存試験をスキップする.
    複数の@depends寸法を持つテストで、最初のパラメータは最初の生産者が提供するベースラインであり、2番目のパラメータは2番目の生産者が提供するベースラインであり、このように推定されます.
    
    class MultipleDependenciesTest extends PHPUnit_Framework_TestCase
    {
        public function testProducerFirst()
        {
            $this->assertTrue(true);
            return 'first';
        }
        public function testProducerSecond()
        {
            $this->assertTrue(true);
            return 'second';
        }
        /**      
         * @depends testProducerFirst
         * @depends testProducerSecond
         */
        public function testConsumer()
        {
            $this->assertEquals(
                array('first', 'second'),
                func_get_args()
            );
        }
    }
    ?>

    データ供給器
    あるテスト方法に依存する方法はありません.どうやってパラメータを入力してテストしますか?PHPUnitは私たちにデータ提供者の方法を提供して、テスト方法のためにデータを伝達する.試験方法は任意のパラメータを受け入れることができる.これらのパラメータは、データ供給方法によって提供される.@dataProviderタグを使用して、どのデータプロバイダメソッドを使用するかを指定します.
    データプロバイダメソッドはデータのフォーマットを返します:返す必要があるのは2次元の配列で、第2次元の配列の値の位置、対応するテストメソッドのパラメータの位置、パラメータの個数と配列の長さは等しくて、さもなくばPHPUnitはを間違えます
    例:戻り配列の配列を用いたデータ供給器
    
    class DataTest extends PHPUnit_Framework_TestCase
    {
        /**
         *@dataProvider additionProvider
         */
        public function testAdd($a, $b, $expected)
        {
            $this->assertEquals($expected, $a + $b);
        }
        public function additionProvider()
        {
            return array(
              array(0, 0, 0),
              array(0, 1, 1),
              array(1, 0, 1),
              array(1, 1, 3)
            );
        }
    }
    ?>

    テストが@dataProviderメソッドと1つ以上の@dependsテストから同時にデータを受信する場合、データ供給器からのパラメータは依存するテストよりも先になります.依存するテストからのパラメータは、データセットごとに同じです.
    例:
    
    class DependencyAndDataProviderComboTest extends PHPUnit_Framework_TestCase
    {    
        public function provider()
        {
            return array(
                        array('provider1'), 
                        array('provider2'));
        }    
        public function testProducerFirst()
        {
            $this->assertTrue(true);
            return 'first';
        }
        public function testProducerSecond()
        {
            $this->assertTrue(true);
            return 'second';
        }
        /**
         * @depends testProducerFirst
         * @depends testProducerSecond
         * @dataProvider provider
         */
        public function testConsumer()
        {
            $this->assertEquals(
                array('provider1', 'first', 'second'),
                func_get_args()
            );
        }
    }
    ?>

    結果:Tests:4,Assertions:4,Failures:1. 
    @depends @dataProvider
    @dataProviderは2次元配列で、2番目の緯度の配列が何個あるかを何回テストし、2番目の緯度の配列とパラメータが一致します.
    @depends生産者(producer)は、テストベースのインスタンスを返し、それに依存する消費者(consumer)たちに渡します.両者が同時に存在する場合は@dataProviderを行います
    ###異常をテストする###
    例:
    class ExceptionTest extends PHPUnit_Framework_TestCase
    {
        public function testException()
        {
            $this->expectException(InvalidArgumentException::class);
        }
    }
    ?>

    @expectedExceptionタグ
    class ExceptionTest extends PHPUnit_Framework_TestCase
    {
      /**
       * @expectedException InvalidArgumentException
       */
      public function testException()
      {
      }
    }
    ?>
    を使用
    出力のテスト
    エラー関連情報の出力
    エッジの状況
    ベース(fixture)
    PHPUnitは、ベースラインを構築するコードを共有することをサポートします.テストメソッドを実行する前に、setup()というテンプレートメソッドが呼び出されます.setUp()は、テストに使用するオブジェクトを作成する場所です.テストメソッドの実行が完了すると、成功しても失敗しても、tearDown()という別のテンプレートメソッドが呼び出されます.tearDown()は、テストに使用するオブジェクトをクリーンアップする場所です.
    テスト用例を作成するのに最も時間がかかるのは、プログラムを使用状態に設定し、テストが完了した後に初期状態に戻すコードを作成することです.PHPUnitはこの問題を解決するためにsetupとtearDownの2つの方法を提供してくれた.
    テストクラスの各テストメソッドは、setup()とtearDown()テンプレートメソッドを1回実行します(同時に、各テストメソッドは新しいテストクラスインスタンスで実行されます).
    setuUpBeforeClass()とtearDownAfterClass()テンプレートメソッドは、それぞれ、テストインスタンスクラスの最初のテスト実行前とテストインスタンスクラスの最後のテスト実行後に呼び出されます.
    組織テスト
    ファイルシステムでテストキットを編成する
    XML構成によるテストキットの編成