如何将 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的覆盖范围?