2016-08-24 6 views
1

依存関係にあるデータセットでエラーが発生した場合、PHPUnitでテストをスキップするにはどうすればよいですか?PHPUnitでエラーのテストをスキップするには?


作品

私のデータプロバイダが唯一のエラーを引き起こすものを持っている場合、それは適切に依存テストをスキップします。私は、その後に起因するエラーが発生しても、プロバイダに良いデータを1つ追加した場合Skipped: 1

class DataProviderDependsTest extends PHPUnit_Framework_TestCase 
{ 
    public function getDataProvider(){ 
     return [ 
     ['non-existent_file.txt'], 
     ]; 
    } 

    /** 
    * @dataProvider getDataProvider 
    */ 
    public function testCanBeDependedOn($data){ 
     $actual = file_get_contents($data); 
     $this->assertSame('expected',$actual); 
    } 

    /** 
    * @dataProvider getDataProvider 
    * @depends testCanBeDependedOn 
    */ 
    public function testCanDepend($data){ 
     $this->assertTrue(false); 
    } 
} 
PHPUnit 5.5.0 by Sebastian Bergmann and contributors. 

ES                 2/2 (100%) 

Time: 28 ms, Memory: 4.00MB 

There was 1 error: 

1) DataProviderDependsTest::testCanBeDependedOn with data set #0 ('non-existent_file.txt') 
file_get_contents(non-existent_file.txt): failed to open stream: No such file or directory 

/home/xenial/phpunittest/test.php:16 

ERRORS! 
Tests: 1, Assertions: 0, Errors: 1, Skipped: 1. 

は、しかし

機能しません残り、PHPUnitは実行を開始しますすべて dとにかく独立したテスト(エラーのある対応するデータセットでさえ)。何もスキップしません。 注:データプロバイダに['real_file.txt'],が追加されました。

class DataProviderDependsTest extends PHPUnit_Framework_TestCase 
{ 
    public function getDataProvider(){ 
     return [ 
     ['real_file.txt'], 
     ['non-existent_file.txt'], 
     ]; 
    } 

    /** 
    * @dataProvider getDataProvider 
    */ 
    public function testCanBeDependedOn($data){ 
     $actual = file_get_contents($data); 
     $this->assertSame('expected',$actual); 
    } 

    /** 
    * @dataProvider getDataProvider 
    * @depends testCanBeDependedOn 
    */ 
    public function testCanDepend($data){ 
     $this->assertTrue(false); 
    } 
} 
PHPUnit 5.5.0 by Sebastian Bergmann and contributors. 

.EFF                4/4 (100%) 

Time: 19 ms, Memory: 4.00MB 

There was 1 error: 

1) DataProviderDependsTest::testCanBeDependedOn with data set #1 ('non-existent_file.txt') 
file_get_contents(non-existent_file.txt): failed to open stream: No such file or directory 

/home/xenial/phpunittest/test.php:16 

-- 

There were 2 failures: 

1) DataProviderDependsTest::testCanDepend with data set #0 ('real_file.txt') 
Failed asserting that false is true. 

/home/xenial/phpunittest/test.php:25 

2) DataProviderDependsTest::testCanDepend with data set #1 ('non-existent_file.txt') 
Failed asserting that false is true. 

/home/xenial/phpunittest/test.php:25 

ERRORS! 
Tests: 4, Assertions: 3, Errors: 1, Failures: 2. 

their docsから@dataProvider

を使用した場合、PHPUnitがエラーに@dependsテストをスキップしません:

ときTES tは、データプロバイダを使用するテストに依存します。依存するテストが少なくとも1つのデータセットで成功した場合、依存テストが実行されます。

私は依存元のテストで提供されたデータのどの部分でエラーが発生した場合、すべて一緒にいくつかのテストをスキップしたいと思います。この制限を回避する方法はありますか?


あなたは簡単なテストのためのfork these filesあなたがしたい場合、あるいは単にクローンすることができます:あなたがデータに少なくとも一つの通過記録が必要なのかと

git clone https://github.com/admonkey/phpunittest.git 
+0

面白いアイデア。問題は、彼が '@ depends'を無視しているということではなく、単にデータのテストの一つが成功したことに満足しているということです... – iRaS

答えて

2

多分これはあなたが期待する動作です:

<?php 

class DataProviderDependsTest extends PHPUnit_Framework_TestCase 
{ 
    protected static $failed = false; 

    public function getDataProvider() { 
     return [ 
      ['real_file.txt'], 
      ['non-existent_file.txt'], 
     ]; 
    } 

    /** 
    * @dataProvider getDataProvider 
    */ 
    public function testCanBeDependedOn($data) { 
     try { 
      $actual = file_get_contents($data); 
      self::assertSame('expected', $actual); 
     } catch(Exception $e) { 
      self::$failed = true; 
      throw $e; 
     } 
    } 

    /** 
    * @dataProvider getDataProvider 
    * @depends testCanBeDependedOn 
    */ 
    public function testCanDepend($data) { 
     if (self::$failed) { 
      self::markTestSkipped('testCanBeDependedOn failed'); 
     } 
     self::assertTrue(true); 
    } 
} 
+1

素晴らしい、うまくいく! –

0

申し訳ありませんが、この答えは本当にあなたの質問には対応していません。 @dependsベースのテストを実行するためのプロバイダ。 @iRasの答えは、あなたが望むかもしれないことをしています。

それはまだ他の人にいくつかの情報を提供することができるように私はこの回答を削除しませんでした。

@dependsは、期待する機能を実行しません。もう一方が失敗した場合は、テストを実行しないという意味ではありません。

From the Manual for @depends

PHPUnitは、テストメソッド間の明示的な依存関係の宣言をサポートしています。このような依存関係は、テストメソッドが実行される順序を定義するのではなく、プロデューサがテストフィクスチャのインスタンスを返し、それを依存するコンシューマに渡すことを許可します。例2.2では、@dependsアノテーションを使用してテストメソッド間の依存関係を表現する方法を示しています。

詳細は、「テストの依存関係」を参照してください。

これは、他のテストが失敗した場合に1組のテストが実行されないことを保証するためではなく、テスト機能間でデータを渡すためにより多く使用されます。テストでは

Sample Test in Documentation

<?php 
use PHPUnit\Framework\TestCase; 

class StackTest extends TestCase 
{ 
    public function testEmpty() 
    { 
     $stack = []; 
     $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); 
    } 
} 
?> 

、testEmpty(から$スタック)が返され、それはtestPushに渡されます。これは、testPushの$ stackが定義されており、未定義ではなく空の配列であることを意味します。

理想的には、テストは、どちらか一方のテストに依存してはならず、機能が動作するかどうかを示すためにアトミックにして、コード内の問題を見つけるのに役立ちます。テストの合格に基づいた依存関係が増えると、期待しない方法でデータを変更した場合にエラーが発生し、データをチェックする後続のすべてのテストが失敗する可能性があります。良い条件をテストし、失敗をテストしますが、合格と失敗のテストの間に強い依存関係はありません。

+0

しかし、従属テストが失敗した場合にテストをスキップします。 PHPUnitは依存テストが失敗したときにテストの実行をスキップする理由です」 – iRaS

関連する問題