私はかつてこの目的のためにテスターを作成しました。これは、Web デバッグ ツールバー (sfWebDebugPanelDoctrine クラス) での方法に基づいています。
同じように動作するように sfTesterDoctrine を拡張しました。クエリ数を確認するアサーション メソッドのみが追加されます。
debug() メソッドを上書きして、クエリ統計を表示することもできます。
<?php
/*
* (c) 2010 Jakub Zalas
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
/**
* @package zTestPlugin
* @subpackage test
* @author Jakub Zalas <jakub@zalas.pl>
*/
class zTesterDoctrine extends sfTesterDoctrine
{
/**
* @param integer $limit
* @return sfTestFunctionalBase|sfTester
*/
public function assertSqlCountLessThan($limit)
{
$queryCount = $this->countDoctrineEvents();
$this->tester->cmp_ok($queryCount, '<', (int) $limit, sprintf('There are less than "%d" SQL queries performed', $limit));
return $this->getObjectToReturn();
}
/**
* @return integer
*/
protected function countDoctrineEvents()
{
return count($this->getDoctrineEvents());
}
/**
* @return array
*/
protected function getDoctrineEvents()
{
if (!$databaseManager = $this->browser->getContext()->getDatabaseManager())
{
throw new LogicConnection('The current context does not include a database manager.');
}
$events = array();
foreach ($databaseManager->getNames() as $name)
{
$database = $databaseManager->getDatabase($name);
if ($database instanceof sfDoctrineDatabase && $profiler = $database->getProfiler())
{
foreach ($profiler->getQueryExecutionEvents() as $event)
{
$events[$event->getSequence()] = $event;
}
}
}
ksort($events);
return $events;
}
}
使用例:
$browser = new sfTestFunctional(new sfBrowser());
$browser->setTester('doctrine', 'zTesterDoctrine');
$browser
->get('/some/page')
->with('response')->begin()
->isStatusCode(200)
->end()
->with('doctrine')->begin()
->assertSqlCountLessThan(20) // imagine how cool :)
->end()
->end();