2016-10-04 74 views
2

在一个使用相同@dataProvider的两个或多个测试的PHPUnit测试用例中,我希望提供程序找出它正在向哪个测试提供数据。我已经完成了这个使用debug_backtrace(),但这感觉不对。 PHPUnit是否提供了另一种更标准的方法来实现这一点?如果是,如何?如何找到数据提供者正在提供数据的测试?

<?php 

class MyTest extends \PHPUnit_Framework_TestCase { 

    /** @dataProvider dataProvider */ 
    public function testA() {} 

    /** @dataProvider dataProvider */ 
    public function testB() {} 

    public function dataProvider() { 

     $trace = debug_backtrace(false, 3); 
     $caller = $trace[2]['args'][2]; 

     // $caller === 'testA' or $caller === 'testB' 
    } 
} 
+0

为什么你需要那个?如果您需要不同的测试数据,请使用不同的提供商。如果数据之间有很多相似之处,请将它们提取到另一种方法中。 –

+0

我想自动化测试数据管理,我需要一个入口点来从文件中检索数据。数据提供者不会保留测试用例的一部分,而是驻留在一个特征中,该特征旨在根据测试用例和正在执行的实际测试从文件系统获取测试数据。 – hielsnoppe

+0

然后创建多个包装器方法。 –

回答

2

创建调用基础数据提供者的各个数据提供者。这样您就知道调用者是什么,并且仍然可以拥有一个入口点。

<?php 

class MyTest extends \PHPUnit_Framework_TestCase { 

    /** @dataProvider dataProviderA */ 
    public function testA() {} 

    /** @dataProvider dataProviderB */ 
    public function testB() {} 

    public function dataProviderA() 
    { 
     $dataProvider = $this->getProviderData(); 
     // Caller is A ... 
     // Mutate base provider data as necessary... 
    } 

    public function dataProviderB() 
    { 
     $dataProvider = $this->getProviderData(); 
     // Caller is B ... 
     // Mutate base provider data as necessary... 
    } 

    public function getProviderData() 
    { 
     // ... 
    } 
}