2012-05-22 17 views
8

Tôi có một lớp thử nghiệm trong đó một thử nghiệm chạy nhiều lần qua @dataProvider và một thử nghiệm khác là @depends trên phương pháp đầu tiên. Tuy nhiên, khi tôi được gọi là var_dump về những gì cần được thông qua cho các thử nghiệm thứ hai, nó mang lại cho tôi một rắn NULL, mà tôi đã không mong đợi.Tôi có thể sử dụng @depends để phụ thuộc vào thử nghiệm bằng cách sử dụng @dataProvider không?

Nói cách khác: điều này nên làm:

<?php 
class DevicesTest extends PHPUnit_Framework_TestCase 
{ 
    /** 
    * @dataProvider registerDataProvider 
    */ 
    public function testRegister($device, $supposedResult) 
    { 
     //do a bunch of tests 
     return array($device, $supposedResult); 
    } 

    public function registerDataProvider() 
    { 
     return array(array("foo", "foo")); 
    } 

    /** 
    * @depends testRegister 
    */ 
    public function testSaveDevicePreferences($deviceArr) 
    { 
     $this->assertNotEmpty($deviceArr); 
    } 
} 
?> 

Trả lời

5

thường @dataProvider được sử dụng khi bạn muốn chạy thử nghiệm nhiều lần với các tập dữ liệu khác nhau cho mỗi lần. Nó tồn tại để giúp bạn tiết kiệm từ việc viết mã vòng lặp trong thử nghiệm và cho phép các tập dữ liệu khác nhau truyền hoặc không riêng lẻ.

Như tôi đã nói trong ý kiến ​​của tôi, tôi tin rằng PHPUnit sẽ sử dụng một trong hai @dependshoặc@dataProvider, và từ ví dụ của bạn tôi đoán là thứ hai thắng ra. Một khả năng khác là các thử nghiệm với các nhà cung cấp dữ liệu không thể được sử dụng như các phụ thuộc vì PHPUnit không biết kiểm tra-cộng-bộ dữ liệu nào để chọn.

registerDataProvider trả về một tập dữ liệu duy nhất, bạn có thể dễ dàng gọi nó từ bản thân kiểm tra. Điều này sẽ cho phép @depends hoạt động trong thử nghiệm thứ hai mà không cần @dataProvider. Giả sử rằng testRegister cần phải sửa đổi $device và/hoặc $supposedResult, điều này sẽ làm việc:

class DevicesTest extends PHPUnit_Framework_TestCase { 
    public function testRegister() { 
     list($device, $supposedResult) = $this->registerDataProvider(); 
     //do a bunch of tests 
     //register a device in the DB 
     return array($device, $supposedResult); 
    } 

    public function registerDataProvider() { 
     return array("foo", "foo"); 
    } 

    /** 
    * @depends testRegister 
    */ 
    public function testSaveDevicePreferences($data) { 
     list($device, $supposedResult) = $data; 
     // do stuff dependent on testRegister() 
     $this->assertEquals($device, $supposedResult); 
    } 
} 

Nếu các biến không cần phải được sửa đổi bởi các thử nghiệm đầu tiên, bạn chỉ có thể gọi registerDataProvider từ cả hai bài kiểm tra. Lưu ý rằng PHPUnit sẽ không tách một mảng được trả lại từ một phụ thuộc khi thử nghiệm thành các đối số cho phép thử phụ thuộc như cơ chế cung cấp dữ liệu. Điều này là bởi vì nó không biết rằng mảng được trả về là nhiều đối số so với một đối số duy nhất.

+0

Xem https://github.com/sebastianbergmann/phpunit/issues/183#issuecomment-816066 để được giải thích về hành vi này – pedromanoel

+0

Dữ liệu từ '@ dataProvider' đến trước, hơn là dữ liệu đến từ '@ phụ thuộc'. Đó là cách nó hoạt động cho tôi. –

-1

tôi phát hiện ra rằng không có, điều này là không thể. Tuy nhiên, bằng một chút thích ứng TestClass, tôi đã đạt được về cơ bản cùng một kết quả, tuy nhiên, mối quan hệ phụ thuộc dường như bị mất ở chỗ nếu thử nghiệm đầu tiên thất bại, thứ hai vui vẻ chạy:

<?php 
class DevicesTest extends PHPUnit_Framework_TestCase 
{ 
    /** 
    * @dataProvider registerDataProvider 
    */ 
    public function testRegister($device, $supposedResult) 
    { 
     //do a bunch of tests 
     //register a device in the DB 
     return array($device, $supposedResult); 
    } 

    public function registerDataProvider() 
    { 
     return array(array("foo", "foo")); 
    } 

    /** 
    * @depends testRegister 
    * @dataProvider registerDataProvider 
    */ 
    public function testSaveDevicePreferences($device, $supposedResult) 
    { 
     // do stuff dependent on testRegister() 
     $this->assertEquals($device, $supposedResult); 
    } 
} 
?> 
+0

Tôi muốn được tò mò cách này cư xử khi các phương pháp cung cấp dữ liệu trả về một mảng với nhiều hơn một mảng các tham số. Phương thức thử nghiệm nên được gọi một lần cho mỗi mảng tham số, nhưng các phụ thuộc thử nghiệm được thiết kế để phụ thuộc vào một lời gọi phương thức thử nghiệm duy nhất. –

+0

Nó hoạt động một cách chính xác, tuy nhiên, như tôi đã chỉnh sửa, kiểm tra thứ hai không bị bỏ qua nếu thử nghiệm đầu tiên không thành công. Hơn nữa, kiểm tra thứ hai phụ thuộc vào một số thứ có mặt trong cơ sở dữ liệu, được đặt ở đó bằng phép thử đầu tiên.Thực tế là họ đang có nghĩa là thử nghiệm đầu tiên không chạy trước lần thử thứ hai. – Zsub

+0

Các thử nghiệm được chạy theo thứ tự chúng được khai báo. PHPUnit không sắp xếp lại chúng dựa trên biểu đồ phụ thuộc. Vì thử nghiệm thứ hai sử dụng cùng một nhà cung cấp dữ liệu, nó sẽ nhận dữ liệu của nó từ phương thức đó chứ không phải kiểm thử mà nó phụ thuộc vào nó. Đặt cược của tôi là PHPUnit tìm kiếm '@ dataProvider' trước' @ depends' và do đó bạn có thể loại bỏ sự phụ thuộc không có hiệu lực. –

9

Trong phiên bản hiện tại của PHPUnit (5.4 kể từ hôm nay), có thể.

Theo documentation:

Khi một bài kiểm tra nhận được thông tin từ cả một phương pháp @dataProvider và từ một hoặc nhiều xét nghiệm nó @depends trên, các đối số từ nhà cung cấp dữ liệu sẽ đến trước khi những người từ phụ thuộc kiểm tra -upon. Các đối số từ các thử nghiệm phụ thuộc sẽ giống nhau đối với mỗi tập dữ liệu.

Đây là cách nó sẽ trông thực tế:

<?php 

class DataProviderAndDependsCombinationTest extends AbstractUnittest{ 

    public function dataProviderForSomething() 
    { 
     return array(
      array(
       'someProvidedValue', 
       'someOtherProvidedValue' 
      ) 
     ); 
    } 

    public function testToDependOn() 
    { 
     $this->assertTrue(true); 
     return 'someDependedValue'; 
    } 

    /** 
    * @dataProvider dataProviderForSomething 
    * @depends testToDependOn 
    */ 
    public function testSomething($someProvidedValue, $someOtherProvidedValue, $someDependedValue) 
    { 
     $this->assertSame('someProvidedValue', $someProvidedValue); 
     $this->assertSame('someOtherProvidedValue', $someOtherProvidedValue); 
     $this->assertSame('someDependedValue', $someDependedValue); 
    } 
} 
+0

Chính xác. Điều này nên được chấp nhận cho trạng thái hiện tại. –

+0

Không thực sự những gì câu hỏi đã được hỏi về mặc dù. OP có '@ dataProvider' trong bài kiểm tra đang phụ thuộc vào, chứ không phải trên bài kiểm tra phụ thuộc vào bài kiểm tra khác (như bạn có ở đây). – Luke

Các vấn đề liên quan