首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何减少PHPUnit和ZF3测试中数据库连接的数量?

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

Stack Overflow用户
提问于 2018-03-20 23:39:48
回答 2查看 0关注 0票数 0

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

  • zendframework / zend-test 3.1.0
  • phpunit / phpunit 6.2.2
  • PHPUnit的/ DbUnit的 3.0.0

我的测试因失败而失败

代码语言:javascript
复制
Connect Error: SQLSTATE[HY000] [1040] Too many connections

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

代码语言:javascript
复制
SHOW STATUS WHERE `variable_name` = 'Threads_connected';

我已经看到了100打开的连接。

我已经通过在以下方面断开连接来减少它们tearDown()

代码语言:javascript
复制
protected function tearDown()
{
    parent::tearDown();
    if ($this->dbAdapter && $this->dbAdapter instanceof Adapter) {
        $this->dbAdapter->getDriver()->getConnection()->disconnect();
    }
}

但我仍然80打开了连接。

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

EN

Stack Overflow用户

发布于 2018-03-21 07:58:19

简洁和适当的方法

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

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

所以,主要的解决方案是 - 你的代码不好,但你可以清理它。

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

这样你的测试可以转向使用各种模拟和存根,这有助于你隔离测试结构。

在数据库绑定逻辑和gremlins的情况下

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

如果你切换到使用SQLite作为“测试数据库”,你将能够有一个定义良好的数据库状态(多个),你可以测试你的代码。

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

代码语言:javascript
复制
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

}

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

当发现新的错误时,你还可以准备任意数量的测试数据库并添加新的测试数据库。这种方法可以让你在数据库中重新创建更复杂的场景,甚至模拟数据损坏。

票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100007696

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档