2017-03-12 7 views
1

私はファイル全体の内容に対して複数のテストケースを実行したいと思います。私は自分のファイルをロードし、このようなすべてのテストで同じプロバイダを使用するために、データプロバイダを使用することができます。phpunit:reusing dataprovider

class mytest extends PHPUnit_Framework_TestCase { 

    public function contentProvider() { 
     return glob(__DIR__ . '/files/*'); 
    } 


    /** 
    * @dataProvider contentProvider 
    */ 
    public function test1($file) { 
     $content = file_get_contents($file); 
     // assert something here 
    } 
... 
    /** 
    * @dataProvider contentProvider 
    */ 
    public function test10($file) { 
     $content = file_get_contents($file); 
     // assert something here 
    } 
} 

もちろん、それは私が10のテストケースを持っている場合、各ファイルは10回ロードされることを意味します。

データプロバイダを調整してすべてのファイルをロードし、すべてのコンテンツを含む1つの大きな構造を返すようにできました。しかし、プロバイダーはテストごとに個別に呼び出されるため、各ファイルが10回読み込まれ、同時にすべてのファイルが同時にメモリに読み込まれることを意味します。

もちろん、10回のテストを10回のアサーションで1回のテストに集約することはできますが、最初のアサーションが失敗した直後に中断してしまいます。

私はデータプロバイダもイテレータを返すことができることを知っています。しかし、phpunitは各テストごとに別々にイテレータを再実行し、各ファイルを10回ロードしているようです。

phpunitをイテレータで一度だけ実行させ、各テストに結果を渡すような巧妙な方法がありますか?

答えて

0

テストの依存関係

いくつかのテストが扶養している場合は、Test dependenciesを宣言する@dependsアノテーションを使用する必要があります。依存関係によって返されたデータは、この依存関係を宣言するテストによって使用されます。

しかし、依存関係として宣言されたテストが失敗した場合、依存テストは実行されません。

静的に格納されたデータ

は、テストの間でデータを共有するには、それはsetup fixtures staticallyに一般的です。

<?php 

use PHPUnit\Framework\TestCase; 

class MyTest extends TestCase 
{ 
    private static $filesContent = NULL; 

    public function filesContentProvider() 
    { 
     if (self::$filesContent === NULL) { 
      $paths = glob(__DIR__ . '/files/*'); 

      self::$filesContent = array_map(function($path) { 
       return [file_get_contents($path)]; 
      }, $paths); 
     } 
    } 

    /** 
    * @dataProvider filesContentProvider 
    */ 
    public function test1($content) 
    { 
     $this->assertNotEmpty($content, 'File must not be empty.'); 
    } 

    /** 
    * @dataProvider filesContentProvider 
    */ 
    public function test2($content) 
    { 
     $this->assertStringStartsWith('<?php', $content, 
             'File must start with the PHP start tag.'); 
    } 
} 

あなたが見ることができるように、それは箱から出してサポートされていない: あなたは、データプロバイダと同じ方法を使用することができます。 のように、各テストメソッドの実行後にテストクラスインスタンスは破棄されます。、初期化されたデータをクラス変数に格納する必要があります。

+0

これは静的に保存されていますしかし、それは同時に私がメモリ内のすべてのファイルの内容を同時に持つことを意味します。理想的ではない。 –

+0

@AndreasGohr:あなたが望むのは、各ファイルのテストクラスのすべてのテストを実行することです。しかし、ファイルごとにファイルを作成し、テストではなく、すべてのテストに対して各ファイルに一度メモリを割り当て/解放します。これにより、各ファイルに対して1回だけメモリを割り当て/解放し、同時に1つのファイルをメモリに保存することができます。これは、テストクラス全体に適用されたデータプロバイダのようです。テスト方法だけでなく、 –

+0

@AndreasGohr:TestSuiteクラスの[createTest()メソッド](https://github.com/sebastianbergmann/phpunit/blob/218eb7494c010b6f5a6343e9bca9fa9212664b50/src/Framework/TestSuite.php#L549)に示されているように、テストが実行される前にプロバイダーが保管されます。したがって、最初のテストが実行されると、[current()](http://php.net/)の各呼び出しで現在のファイルの内容を読み取るイテレータを使用しても、プロバイダによって返されたすべてのデータが既にインスタンス化されていますmanual/en/iterator.current.php)メソッドを使用します。 PHPUnitを使用したソリューションはありません。 –

関連する問題