【问题标题】:How to insert test case-specific database rows with PHPUnit如何使用 PHPUnit 插入特定于测试用例的数据库行
【发布时间】:2012-02-21 21:18:37
【问题描述】:

当使用 PHPUnit 测试依赖于数据库的类时,getDataSet() 方法提供数据作为整个测试套件的测试夹具。这很好,但是如何为特定测试提供数据?在所有测试使用的公共数据之上,每个测试都需要不同的数据库数据,这并不罕见,尤其是在使用最小化数据集时。我知道 PDO 对象是可用的,在我们的例子中,应用程序的本机 DB 对象也是可用的(意思是,我们可以运行原始查询或使用应用程序中的其他功能),但如果有一种插入数据的方法会很好它脱离了 PHPUnit 的 DataSet 容器,因此所有测试数据都以相同的方式处理,以提高清晰度和更容易维护。

有没有办法做到这一点?

【问题讨论】:

    标签: php phpunit


    【解决方案1】:

    你可以遵循这种肮脏的伎俩:

    protected function getDataSet()
    {
        if (in_array($this->getName(), array('testA', 'testB', '...'))) {
            return $this->createXMLDataSet(__DIR__ . '/_fixtures/fistureA.xml');
        }
    
        return $this->createXMLDataSet(__DIR__ . '/_fixtures/fixtureB.xml');
    }
    

    小记:$this->getName()返回当前测试方法名

    另一种方法是在测试开始时重新运行设置操作:

    public function testA()
    {
        $this->getDatabaseTester()->setDataSet($this->createFlatXMLDataSet(__DIR__ . '/_fixtures/fixtureForTestA.xml'));
        $this->getDatabaseTester()->onSetUp();
    
        /* your test code */
    }
    

    【讨论】:

    • 我认为早期版本要简单得多。他们为什么把事情搞得这么复杂?
    • 我根本不应该使用 dbunit,而是根据它的外观编写我自己的自定义准备数据集
    【解决方案2】:

    这是一个迟到的答案,但我猜它对某些人仍然有用......

    您可以通过调用IDatabaseOperationexecute 方法来完成此操作,您可以从PHPUnit_Extensions_Database_Operation_Factory 获得该方法。你基本上会使用CLEAN_INSERTINSERT

    作为zerkms' second approach,您可以在每个需要特定数据的测试开始时调用它。例如:

    public function testA() {
      PHPUnit_Extensions_Database_Operation_Factory::INSERT()
        ->execute($this->getConnection(), $this->createXMLDataSet(__DIR__.'/fixtureA.xml'));
    
      // Test code
    }
    

    但是,这种方案的优点是整个测试用例的数据集保持不变,所以:

    • 测试方法保持独立彼此(而在 zerkms 的方法中,如果您没有/忘记在另一个测试方法中指定数据集,它将重用来自以前更改数据集的(随机?)方法,恕我直言,这种方法非常丑陋且容易出错)。在这里,任何其他一开始就没有这样调用的测试将照常使用测试用例数据集。
    • 您可以在通用(测试用​​例)数据集之上构建您的测试数据集。如果您使用INSERT 操作(不是CLEAN_INSERT),它将在来自公共数据集的所有行之后插入特定于测试的行。您还可以使用 DELETE 操作从该公共数据集中删除一些不需要的行。
    • 顺便说一句,即使测试用例的设置操作已更改,不调用 onSetUp() 也可以完成这项工作。

    【讨论】:

      猜你喜欢
      • 2021-09-09
      • 2011-06-02
      • 2014-08-02
      • 2014-11-21
      • 1970-01-01
      • 2016-12-31
      • 2018-04-27
      • 1970-01-01
      • 2015-01-27
      相关资源
      最近更新 更多