giant-rabbit / mysql-concentrator
用PHP编写的MySQL代理服务器
Requires
- giant-rabbit/php-util: >=1.0.4
This package is auto-updated.
Last update: 2024-09-11 14:23:43 UTC
README
这是一个MySQL代理服务器,可以将多个MySQL连接“集中”到单个服务器的一个连接。这可能看起来不是很实用,直到你考虑测试。在测试Web应用程序时,最令人烦恼的事情之一是您必须在每个测试之间执行大量的TRUNCATE或DROP TABLE语句,以便将数据库恢复到已知状态。这样做会真正减慢您的测试速度。
Ruby on Rails通过在每个测试中包裹事务(BEGIN ... ROLLBACK)来在一定程度上解决这个问题。这非常快,效果很好,但它只适用于Rails测试都在一个进程和一个数据库连接中运行的情况。当您引入Cucumber测试时,这种技术在Rails中就崩溃了,因为它会启动单独的Web服务器和浏览器进程,因此您不能将所有数据库调用包裹在事务中。
MySQL Concentrator有助于解决这个问题。您可以在测试套件中通过MySQL Concentrator启动到MySQL的连接,并配置您的Web应用程序也通过MySQL Concentrator运行MySQL命令。然后让您的测试套件在每个测试之前触发BEGIN命令,在每个测试之后触发ROLLBACK命令。即使您启动了大量单独的进程,MySQL Concentrator也会将这些连接引导到发送BEGIN命令的那个相同连接,因此所有的数据库活动都会在事务中发生。
安装
只需从GitHub存储库中获取它。它只需在其目录中运行。
使用方法
php mysql-concentrator.php -h <mysql server host name> -p <mysql server port>
配置您的Web应用程序连接到127.0.0.1上的端口3307,而不是其正常的主机和端口。您应该使用上述命令中的正常主机和端口。
如果您打算将其用于测试框架,只需添加一些行来启动事务。以下是我为Behat测试中的Behat Context类所做的事情的示例
/**
* @BeforeScenario
*/
public function setupDB($event)
{
$this->db = new PDO("mysql:host=127.0.0.1;port=3307;dbname=foo_test;", "foo", "foo");
$this->db->exec("DROP TABLE IF EXISTS automated_testing");
$this->db->exec("CREATE TABLE automated_testing (pristine INTEGER)");
$this->db->exec("INSERT INTO automated_testing VALUES (1)");
$this->db->exec("BEGIN");
$this->db->exec("UPDATE automated_testing SET pristine = 0");
}
/**
* @AfterScenario
*/
public function resetDB($event)
{
$this->db->exec("ROLLBACK");
}
带有“pristine”的额外内容是一种类型的黑客行为,这样我就可以检查Web应用程序是否对包裹事务进行了更改。如果事务没有正确回滚,“pristine”不会恢复到1。MySQL中的某些语句将导致隐式提交。这包括几乎所有DDL语句,如CREATE TABLE、ALTER TABLE、CREATE INDEX等...