热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何在PHPUnit和ZF3中减少测试中的数据库连接数?

如何解决《如何在PHPUnit和ZF3中减少测试中的数据库连接数?》经验,为你挑选了1个好方法。

我正在使用.编写Zend Framework 3应用程序的集成/数据库测试

zendframework/zend-test 3.1.0,

phpunit/phpunit 6.2.2,和

PHPUnit的/ DbUnit的 3.0.0

我的测试由于失败而失败

Connect Error: SQLSTATE[HY000] [1040] Too many connections

我设置了一些断点并查看了数据库:

SHOW STATUS WHERE `variable_name` = 'Threads_connected';

我实际上已经看到了100打开的连接.

我通过断开连接来减少它们tearDown():

protected function tearDown()
{
    parent::tearDown();
    if ($this->dbAdapter && $this->dbAdapter instanceof Adapter) {
        $this->dbAdapter->getDriver()->getConnection()->disconnect();
    }
}

但我仍然有过度80开放的联系.

如何将测试中的数据库连接数减少到可能的最小值?


更多信息

(1)我有很多测试,其中我dispatch是一个URI.每个此类请求都会导致至少一个数据库请求,从而导致新的数据库连接.这些连接似乎没有关闭.这可能会导致最多的连接.(但是我还没有找到一种方法让应用程序在处理请求后关闭连接.)

(2)其中一个问题可能是我对数据库的测试:

protected function retrieveActualData($table, $idColumn, $idValue)
{
    $sql = new Sql($this->dbAdapter);
    $select = $sql->select($table);
    $select->where([$table . '.' . $idColumn . ' = ?' => $idValue]);
    $statement = $sql->prepareStatementForSqlObject($select);
    $result = $statement->execute();
    $data = $result->current();
    return $data;
}

$this->dbAdapter->getDriver()->getConnection()->disconnect()之前的呼唤return没有给予任何东西.

测试方法中的用法示例:

public function testInputDataActionSaving()
{
    // The getFormParams(...) returns an array with the needed input.
    $formParams = $this->getFormParams(self::FORM_CREATE_CLUSTER);

    $createWhateverUrl = '/whatever/create';
    $this->dispatch($createWhateverUrl, Request::METHOD_POST, $formParams);

    $this->assertEquals(
        $formParams['whatever']['some_param'],
        $this->retrieveActualData('whatever', 'id', 2)['some_param']
    );
}

(3)另一个问题可能出在PHPUnit(或我的配置?)中.(Striken,因为"PHPUnit没有做任何与数据库连接相关的事情.",请参阅此评论.)无论如何,即使它不是PHPUnit问题,事实是,在行之后

$testSuite = $configuration->getTestSuiteConfiguration($this->arguments['testsuite'] ?? null);

PHPUnit\TextUI\Command我得到31新的联系.



1> tereško..:

干净和正确的方法

如果"您的代码以难以测试的方式编写",这似乎是一个问题.数据库连接应该由DIC处理或(在某些连接池的情况下)一些specialize类.基本上,包含的类retrieveActualData()应该将Sql实例作为构造函数中的依赖项传递.

相反,看起来您的Sql类是一个有害的PDO包装器,它(很可能)在您创建实例时建立了数据库连接.相反,您应该在多个类之间共享相同的PDO实例.这样,您既可以控制已建立的连接数量,又可以在(某些)隔离中测试代码.

因此,主要的解决方案是 - 您的代码很糟糕,但您可以清理它.

不要将new片段放在执行树的深处,而是将连接作为依赖项传递并共享.

通过这种方式,您可以使用各种模拟和存根来帮助您隔离测试结构.

在DB绑定逻辑和gremlins的情况下

但是你应该考虑一个更实际的方面.在集成测试中使用SQLite而不是真实数据库.PDO支持该选项(您只需为测试代码提供不同的DSN).

如果您切换到使用SQLite作为"测试数据库",您将能够拥有一个定义良好的数据库状态(多个),您可以使用它来测试代码.

你有类似文件的东西integration-002.db,它包含准备好的数据库状态.在集成测试的引导程序中,您只需将准备好的sqlite数据库文件复制integration-0902.dblive-002.db并运行所有测试.

use PHPUnit\Framework\TestCase;

final class CombinedTest extends TestCase
{
    public static function setUpBeforeClass()
    {
        copy(FIXTURE_PATH . '/integration-02.db', FIXTURE_PATH . '/live-02.db');
    }


    // your test go here

}

这样您就可以更好地控制持久性状态,并且测试运行速度会快得多,因为不涉及网络堆栈.

当发现新错误时,您还可以准备任意数量的测试数据库并添加新数据库.此方法将允许您在数据库中重新创建更复杂的方案,甚至模拟数据损坏.

您可以在此项目中实际看到此方法.


PS来自个人经验 - 在集成测试中使用SQLite还可以提高SQL代码的一般质量(如果您不使用查询构建器,而是编写自定义数据映射器).因为它迫使您考虑SQLite中针对MariaDB或PostgreSQL的可用功能之间的差异.但这是"你的里程可能会有所不同"之一.

PPS可以同时使用两种建议的方法,因为它们只会相互增强.


推荐阅读
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • Ihavethefollowingonhtml我在html上有以下内容<html><head><scriptsrc..3003_Tes ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • 本文讨论了如何在codeigniter中识别来自angularjs的请求,并提供了两种方法的代码示例。作者尝试了$this->input->is_ajax_request()和自定义函数is_ajax(),但都没有成功。最后,作者展示了一个ajax请求的示例代码。 ... [详细]
  • React项目中运用React技巧解决实际问题的总结
    本文总结了在React项目中如何运用React技巧解决一些实际问题,包括取消请求和页面卸载的关联,利用useEffect和AbortController等技术实现请求的取消。文章中的代码是简化后的例子,但思想是相通的。 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 【shell】网络处理:判断IP是否在网段、两个ip是否同网段、IP地址范围、网段包含关系
    本文介绍了使用shell脚本判断IP是否在同一网段、判断IP地址是否在某个范围内、计算IP地址范围、判断网段之间的包含关系的方法和原理。通过对IP和掩码进行与计算,可以判断两个IP是否在同一网段。同时,还提供了一段用于验证IP地址的正则表达式和判断特殊IP地址的方法。 ... [详细]
  • PDO MySQL
    PDOMySQL如果文章有成千上万篇,该怎样保存?数据保存有多种方式,比如单机文件、单机数据库(SQLite)、网络数据库(MySQL、MariaDB)等等。根据项目来选择,做We ... [详细]
author-avatar
AD社团
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有