如何将 PHPUnit 与 Zend 框架一起使用?

Posted

技术标签:

【中文标题】如何将 PHPUnit 与 Zend 框架一起使用?【英文标题】:How do I use PHPUnit with Zend Framework? 【发布时间】:2010-09-09 02:29:51 【问题描述】:

我想知道如何使用 Zend_Test 和一般的 php 编写 PHPUnit 测试。

【问题讨论】:

【参考方案1】:

我正在使用 Zend_Test 来完全测试所有控制器。设置起来非常简单,因为您只需要设置引导文件(引导文件本身不应该调度前端控制器!)。我的基本测试用例类如下所示:

abstract class Controller_TestCase extends Zend_Test_PHPUnit_ControllerTestCase

    protected function setUp()
    
        $this->bootstrap=array($this, 'appBootstrap');
        Zend_Auth::getInstance()->setStorage(new Zend_Auth_Storage_NonPersistent());
        parent::setUp();
    

    protected function tearDown()
    
        Zend_Auth::getInstance()->clearIdentity();
    

    protected function appBootstrap()
    
        Application::setup();
    

Application::setup(); 完成所有设置任务,这些任务也设置了实际应用程序。一个简单的测试如下所示:

class Controller_IndexControllerTest extends Controller_TestCase

    public function testShowist()
    
        $this->dispatch('/');
        $this->assertController('index');
        $this->assertAction('list');
        $this->assertQueryContentContains('ul li a', 'Test String');
    

就是这样……

【讨论】:

您能详细说明一下吗?我喜欢你的抽象 TestCase 类!你把你的 Controller_TestCase 放在哪里?您需要/包含任何文件吗?你如何进行测试?您是通过命令行使用 PHPUnit,还是使用 IDE 中的插件?谢谢! 我将 Controller_TestCase 放在我的 tests/Controller 目录中——这是所有控制器测试用例所在的目录。通常我在运行单元测试时不使用自动加载,但如果我进行控制器测试,我会使用 Zend_Loader::registerAutoload() 来使用自动加载,因为它非常... ...很难跟踪 MVC 运行的依赖关系。您只需要确保遵循命名约定并且 Zend_Loader 会找到您的文件(设置 include_path)。为了运行我的测试,我使用 PHPUnit 的 CLI,因为我不喜欢 Eclipse PDT 中的 PHPUnit 集成。这是…… ...实际上切换窗口开始测试没有问题——特别是如果您遵循 PHPUnit 命名约定(与 Zend Framework 的约定相同)并使用 TestSuites 对您的测试进行分组。也许你应该看看例如使用的测试结构。 Zend 框架本身。【参考方案2】:

他们在 Zend 开发者专区有一个“Introduction to the Art of Unit Testing”,涵盖 PHPUnit。

【讨论】:

链接当前已损坏【参考方案3】:

我发现this 文章非常有用。 Zend_Test 文档也有很大帮助。 在这两个资源的帮助下,我成功地在 Zend Framework 的QuickStart tutorial 中实现了单元测试,并为其编写了一些测试。

【讨论】:

【参考方案4】:

使用 ZF 1.10,我将一些引导代码放入 tests/bootstrap.php(基本上是 (public/index.php) 中的内容,直到 $application->bootstrap()。

然后我可以使用

运行测试
phpunit --bootstrap ../bootstrap.php  PersonControllerTest.php 

【讨论】:

【参考方案5】:

我没有使用 Zend_Test,但我已经使用 Zend_MVC 等针对应用程序编写了测试。最重要的部分是在测试设置中获得足够的引导代码。

【讨论】:

【参考方案6】:

另外,如果您使用数据库事务,那么最好删除所有通过单元测试完成的事务,否则您的数据库会变得一团糟。

等设置

public function setUp() 



    YOUR_ZEND_DB_INSTANCE::getInstance()->setUnitTestMode(true);



    YOUR_ZEND_DB_INSTANCE::getInstance()->query("BEGIN");

    YOUR_ZEND_DB_INSTANCE::getInstance()->getCache()->clear();

    // Manually Start a Doctrine Transaction so we can roll it back
    Doctrine_Manager::connection()->beginTransaction();

在拆卸时,您需要做的就是回滚

public function tearDown() 



    // Rollback Doctrine Transactions
    while (Doctrine_Manager::connection()->getTransactionLevel() > 0) 
        Doctrine_Manager::connection()->rollback();
    

    Doctrine_Manager::connection()->clear();



    YOUR_ZEND_DB_INSTANCE::getInstance()->query("ROLLBACK");
    while (YOUR_ZEND_DB_INSTANCE::getInstance()->getTransactionDepth() > 0) 
        YOUR_ZEND_DB_INSTANCE::getInstance()->rollback();
    
    YOUR_ZEND_DB_INSTANCE::getInstance()->setUnitTestMode(false);


【讨论】:

以上是关于如何将 PHPUnit 与 Zend 框架一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

带有 Zend Framework 2 模块的 PHPUnit

Zend 框架 PhpUnit 测试错误由于在 null 上调用成员函数

如何将 PHPUnit 的 DBUnit 与 Microsoft SQL Server 数据库一起使用?

如何配置代码-PHPUnit版本8.5.1对Zend Framework 2.4的覆盖范围?

将Zend_Service_Twitter_Search与经过身份验证的请求一起使用

应该将 phpunit 或石灰与 symfony 一起使用吗? [关闭]