开发者

Test that each page doesn't exceed allowed SQL count in Symfony?

开发者 https://www.devze.com 2023-01-07 15:54 出处:网络
I wish I could have an isSQLCountLessThan() function or something. $browser = new sfTestFunctional(new sfBrowser());

I wish I could have an isSQLCountLessThan() function or something.

$browser = new sfTestFunctional(new sfBrowser());
$browser
  ->get('/some/page')
  ->with('response')->begin()
    ->isStatusCode(200)
    // ...
    ->isSQLCountLessThan(20) // imagine how cool :)
  -&g开发者_StackOverflow社区t;end();

Is there a way to have such?


I once created tester for this purpose. It's based on how it's done in web debug toolbar (sfWebDebugPanelDoctrine class).

I extended sfTesterDoctrine so it behaves the same. Only assertion method is added to check query count.

You could also overwrite debug() method to show query statistics.

<?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;
  }
}

Example usage:

$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();
0

精彩评论

暂无评论...
验证码 换一张
取 消