我的测试运行得很慢......我的测试不到100次,但在快速机器上运行仍需要10秒钟。我尝试禁用代码覆盖,并使用缓存来处理远程服务器(例如LDAP)所做的几件事。
在PHPUnit运行时分析测试产生:
完全10%的运行时间 - 包括收集信息和生成大量代码覆盖页面的时间 - 花费在mysqli->prepare
上。不幸的是,我不能在这里抽象数据库。我不仅有效地测试数据库访问层本身,还在测试代码中的JOIN
内实现了许多逻辑。
我是否可以更改任何配置设置或其他任何性质以使其更快? prepare
是否需要调用mysql服务器(因此设置本地mysql服务器进行测试可能有帮助吗?)
答案 0 :(得分:6)
是的,prepare()
语句将调用MySQL服务器。准备好的语句在服务器端通过两个呼叫执行:PREPARE
呼叫和EXECUTE
呼叫。
每个例子:
mysql> PREPARE stmt1 FROM 'SELECT * FROM mysql.user';
mysql> EXECUTE stmt1;
对于任何驱动程序都是如此,无论它是JDBC驱动程序的PHP驱动程序。为了进一步证明它确实进行了调用,请执行以下代码:
$mysqli->prepare('SELECT * FROM mysql.user');
...你可以在MySQL中看到以下内容:
mysql> show processlist;
+-----+------+-----------+------+---------+------+-------+--------------------------+
| Id | User | Host | db | Command | Time | State | Info |
+-----+------+-----------+------+---------+------+-------+--------------------------+
| 564 | root | localhost | NULL | Query | 0 | NULL | show processlist |
| 565 | root | localhost | NULL | Prepare | 0 | NULL | SELECT * FROM mysql.user |
+-----+------+-----------+------+---------+------+-------+--------------------------+
2 rows in set (0.00 sec)
要加速这一点,您可以在本地计算机上使用 UNIX域套接字(假设您有POSIX OS)。这消除了TCP握手和纠错的开销,以及因本地执行而导致的网络延迟。
然而,最好的解决方案是使用模拟对象抽象数据库连接,但您已经知道了。如果必须连接到数据库,则单元测试不是单元测试:它是集成测试。