如何使用php单元测试多组数据?

Posted

技术标签:

【中文标题】如何使用php单元测试多组数据?【英文标题】:how to test multiple sets of data using php unit? 【发布时间】:2011-02-27 07:11:06 【问题描述】:

我有一个类和几个函数需要针对多组数据进行测试。我从平面文件中加载这些数据。我知道我可以在 setUp() 方法中加载文件并运行我的测试,但是如何加载多组数据并针对这些数据测试相同的函数?

【问题讨论】:

这些数据是什么样的?您打算执行什么样的测试? 它是一个对象,有很多属性...我已经将对象序列化为一个文件,并从中读取它。我有多个包含不同数据集的文件。我需要一一阅读这些文件,并执行测试。这些函数对这些对象进行一些计算,主要是一些加法。 使用随机数据进行测试打破了单元测试的实际目标,即覆盖特定代码在运行时可能暴露的所有可能场景。这是通过显式测试具有不同可能输入的代码单元并将输出与预期结果(断言)进行比较来实现的。如果您的测试方法需要几个完整的对象来做出这些断言,那么您做错了什么,或者至少它超出了单元测试的范围。 我不明白你的意思。假设你写了一个函数来添加两个数字——你不会用多组数据来测试它吗?在这种情况下,这很容易,因为您会将所有数据作为参数传递给 add() 函数。如果您需要从文件中加载数据怎么办?每个文件都包含两个数字,需要传递给您的 add 函数并测试求和?我的情况与此类似,只是比简单的加法复杂一点。我不认为我做错了什么,编码明智..只是我想弄清楚如何测试它的用例。 好的,如果我对情况有误解,请原谅。我想说单元测试应该尽可能明确,这包括避免依赖外部资源/大型数据集,除非它们实际上代表持久层。无论如何,我已经发布了一些示例测试用例。这种方法适用吗? 【参考方案1】:
class MyTestCase extends phpUnit_Framework_TestCase 

    private $_testObjects = array();

    public function setUp() 
    
        // load the files, unserialize the objects 
        // and store them in the $_testObjects array
    

    public function getTestObjects()
    
        return $this->_testObjects;
    

    public function testA()
                 
         foreach ($this->getTestObjects() as $obj) 
             // execute assertion/s
         
    

    public function testB()
                 
         foreach ($this->getTestObjects() as $obj) 
             // execute assertion/s
         
    

    // ...

【讨论】:

我已经做了类似的事情,谢谢你的回答 :) 它几乎是一样的,但是我不是在 setUp() 函数中的所有文件,而是在我的每个函数中单独加载它们。我的物体相当重,所以不想一次性加载所有物体。再次感谢。 6 六打。我真的认为您应该尝试一次测试加载它们。你到底想测试什么?反序列化/一些逻辑/重新序列化?您实际上没有最初创建对象的源代码文件吗?我会用原始的源代码文件进行测试。【参考方案2】:

您可以利用@dataProvider annotation。这样,您就不需要自己循环测试数据数组。

class MyTestCase extends PHPUnit_Framework_TestCase 

    private $_testObjects = array();

    public function setUp() 
    
        // load the files, unserialize the objects 
        // and store them in the $_testObjects array
    

    public function getTestObjects()
    
        return $this->_testObjects;
    

    /**
     *
     * @dataProvider getTestObjects
     *
     */
    public function testA($obj)
                 
         // execute assertion/s
    

    /**
     *
     * @dataProvider getTestObjects
     *
     */
    public function testB($obj)
                 
         // execute assertion/s
    

    // ...

【讨论】:

以上是关于如何使用php单元测试多组数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Doctrine Fixture 加载测试数据库进行 PHP 单元测试?

Python单元测试框架之unittest参数化(paramunittest)

如何使用程序代码库在 PHP 中编写单元测试?

PHP单元,使用单元测试测试laravel日志消息

如何使用 PHP 单元测试避免竞争条件

使用闭包进行 PHP 单元测试