测试每个页面不超过 Symfony 中允许的 SQL 计数?

Posted

技术标签:

【中文标题】测试每个页面不超过 Symfony 中允许的 SQL 计数?【英文标题】:Test that each page doesn't exceed allowed SQL count in Symfony? 【发布时间】:2011-03-16 08:57:36 【问题描述】:

我希望我可以有一个 isSQLCountLessThan() 函数之类的。

$browser = new sfTestFunctional(new sfBrowser());
$browser
  ->get('/some/page')
  ->with('response')->begin()
    ->isStatusCode(200)
    // ...
    ->isSQLCountLessThan(20) // imagine how cool :)
  ->end();

有没有这样的方法?

【问题讨论】:

【参考方案1】:

我曾经为此目的创建了测试器。它基于它在 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();

【讨论】:

不错。它会根据每个请求重置吗? 是的。每个 get() 或 post() 请求都有一个单独的计数器。它适用于所有测试人员,不仅适用于我。 理想!谢谢你,库巴。如果有人会出错 - “Lass”必须是“Less”,并且 ->begin() 在调用之前丢失。

以上是关于测试每个页面不超过 Symfony 中允许的 SQL 计数?的主要内容,如果未能解决你的问题,请参考以下文章

奇怪的致命错误:作曲家文件中允许的内存大小

Internet Explorer 中允许的 Ajax 跨域请求

Angular 1.6.3 不允许 1.5.8 中允许的 JSONP 请求

C 中允许的静态数组的最大大小是多少?

Google ID C2DM 中允许的字符

GET 参数中允许的字符