2016-08-24 83 views
1

如何讓PHPUnit在相關人員出現數據集錯誤時跳過測試?如何在PHPUnit中跳過錯誤測試?


作品

如果我的數據提供者只有東西導致的錯誤,那麼它會適當地跳過了相關測試。 注意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'],給數據提供者。使用@dataProvider

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. 

的PHPUnit沒有跳過錯誤@depends測試從their docs

當TES t取決於使用數據提供者的測試,依賴測試將在測試取決於成功時執行,至少有一個數據集爲

我想跳過一些測試放在一起,如果在依賴測試所提供的資料的任何部分,都會導致錯誤。有什麼辦法可以解決這個限制嗎?


可以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註解來表達測試方法之間的依賴關係。

有關更多詳細信息,請參閱「測試相關性」一節。

這更多地用於在測試功能之間傳遞數據,而不是用於確保在其他測試失敗時不會運行一組測試。

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被定義並且是一個空數組,而不是undefined。

理想情況下,您的測試不應該依賴於其中一個或另一個傳遞,並且是原子來指示功能是否有效,以幫助在您的代碼中查找問題。如果一個測試以不是預期的方式更改數據,那麼基於測試傳遞的更多依賴性可能會導致很多錯誤,然後所有後續測試都會檢查數據將會失敗,這實際上不應該如何構造測試。測試良好的條件,測試失敗,但在通過和失敗的測試之間沒有硬性依賴關係。

+0

但是它會跳過測試依賴測試是否失敗......並且可能會這樣做正如它所說的「這就是爲什麼PHPUnit在依賴測試失敗時跳過測試執行的原因。」 – iRaS