有没有办法只为特定的PHPUnit测试加载特定的灯具?

时间:2015-07-13 20:02:27

标签: php unit-testing yii phpunit fixtures

我们正在使用Yii 1.1,但我怀疑这个问题适用于任何使用PHPUnit的人。

我们的一些单元测试依赖于数据库中的特定数据,因此我们使用了固定装置。不幸的是,你define fixtures基于每个测试类,而不是每个测试函数。

示例:

class AccountTest extends CDbTestCase
{
    public $fixtures = array(
        'users' => 'User',
        'email_accounts' => 'EmailAccount',
        'histories' => 'History',
        'email_queue' => 'EmailQueue',
        'org_unit' => 'OrgUnit',
    );

    // ...

    public function testIsValid_preventsWhiteSpaceAroundNumber()
    {
        // ... (test logic)...
    }

    // ... (more tests)...
}

我们的帐户模型的一些测试需要更新几个不同的表以匹配定义的灯具,但同一类的其他测试根本不依赖于任何灯具。不幸的是,我们的AccountTest.php文件中的所有测试(包含我们的帐户模型的测试)都会为数据库中的这五个表重新加载灯具带来额外的延迟。

作为一个具体的例子,Account->isValid()函数现在有七个单元测试来确认它做什么或不认为有效的各种事情。我测试了使用和不使用灯具运行testIsValid单元测试(这些测试不需要):使用灯具需要2.95秒,不需要0.068秒。

我们已经尝试(尝试解决不同的问题)创建两个不同的AccountTest.php文件(在不同的文件夹中),以将我们的单元测试分成不同的组,但这导致了比解决更多的问题。

我的最终目标是能够为特定测试定义 是否需要加载任何数据库夹具(如果是,那么哪些),以便不依赖于的测试灯具可以更快地运行,而不会等待(不必要地)更新数据库。

因此我的问题:有没有办法只为特定的PHPUnit测试加载特定的灯具?

2 个答案:

答案 0 :(得分:3)

这个怎么样?假设您的测试类扩展了\ CDbTestCase ...

  • 将$ fixtures的名称更改为$ optionalFixtures
  • 添加以下内容......

    public function loadFixtures($fixtures=null)
    {
        if ($fixtures === null) {
            $fixtures = $this->optionalFixtures;
        }
    
        if(is_array($fixtures))
            $this->getFixtureManager()->load($fixtures);
        $this->fixtures = $fixtures;
    }
    

然后,在所有需要加载灯具的测试中,添加对该方法的调用(使用可选数组)。没有调用的测试最终应该在没有加载灯具的情况下运行,尽管灯具可能仍然存在于先前测试的数据库中。

答案 1 :(得分:0)

你可以这样试试:

 protected $fixtures = array();

    /**
    * @return array
    */
    public function fixturesProvider()
    {
       return array(
               array(
                   array(
                     'id' => 1,
                )
            ),
        );
   } 
    /**
    *@dataProvider fixturesProvider
    */
    public function testMethodName($fixtures)
    {
        $x = $this->service->method($fixtures['id]);
        $this->assertInternalType('type',$x);
    }

你在那里模拟你的灯具,我喜欢这里我有几个不同的数据库我使用setUp()函数通过路由获取服务并使用其中的方法来获取自定义变量的对象。 但是不要知道它在这个框架中是如何运作的