giant-rabbit/mysql-concentrator

用PHP编写的MySQL代理服务器

1.0.4 2013-12-10 18:58 UTC

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等...