Codeception:使用 fixtures 测试基于 Yii2 的应用程序会导致 "too many connections" 错误
Codeception: testing app based on Yii2 with fixtures causes "too many connections" error
以下示例显示了我如何在任何需要它的方法中加载和卸载夹具:
class ServiceTest extends \Codeception\Test\Unit
{
protected $tester;
protected function loadFixture()
{
$this->tester->haveFixtures(['user' => ['class' => UserFixture::class]]);
}
protected function unLoadFixture()
{
$this->tester->grabFixture('user')->db->close();
}
public function testSuccessSignin()
{
$this->loadFixture();
$form = new SigninForm([
'email' => 'brady.renner@rutherford.com',
'password' => '123456',
]);
$result = Service::signin($form, new \yii\web\User([
'identityClass' => Identity::class,
]));
$this->assertTrue($result);
$this->unLoadFixture();
}
}
但似乎 db->close()
无法正常工作,并且 SHOW PROCESSLIST
显示许多连接处于 "Sleep" 状态,当我 运行 测试如上所示时。
当我通过 _before()
或 fixture()
方法加载夹具时也会发生同样的情况(这些方法是不必要的原因,并非所有方法都需要夹具)。
您需要为您的数据库连接传递 attribute
持久连接 true
,请参阅此处非 GITHUB
的问题
'db' => array(
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=yii2_advanced_test',
'username' => 'root',
'password' => '',
'tablePrefix' => '',
'charset' => 'utf8',
'attributes'=>[
PDO::ATTR_PERSISTENT => true
]
),
EDIT
除了上面给出的解决方案,如果它不适合你,你可以尝试@Mik
评论中的建议,在codeception Suit配置中的yii2模块设置下设置cleanup:false
见here
以下示例显示了我如何在任何需要它的方法中加载和卸载夹具:
class ServiceTest extends \Codeception\Test\Unit
{
protected $tester;
protected function loadFixture()
{
$this->tester->haveFixtures(['user' => ['class' => UserFixture::class]]);
}
protected function unLoadFixture()
{
$this->tester->grabFixture('user')->db->close();
}
public function testSuccessSignin()
{
$this->loadFixture();
$form = new SigninForm([
'email' => 'brady.renner@rutherford.com',
'password' => '123456',
]);
$result = Service::signin($form, new \yii\web\User([
'identityClass' => Identity::class,
]));
$this->assertTrue($result);
$this->unLoadFixture();
}
}
但似乎 db->close()
无法正常工作,并且 SHOW PROCESSLIST
显示许多连接处于 "Sleep" 状态,当我 运行 测试如上所示时。
当我通过 _before()
或 fixture()
方法加载夹具时也会发生同样的情况(这些方法是不必要的原因,并非所有方法都需要夹具)。
您需要为您的数据库连接传递 attribute
持久连接 true
,请参阅此处非 GITHUB
'db' => array(
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=yii2_advanced_test',
'username' => 'root',
'password' => '',
'tablePrefix' => '',
'charset' => 'utf8',
'attributes'=>[
PDO::ATTR_PERSISTENT => true
]
),
EDIT
除了上面给出的解决方案,如果它不适合你,你可以尝试@Mik
评论中的建议,在codeception Suit配置中的yii2模块设置下设置cleanup:false
见here