我的测试运行很慢...我已经进行了100项测试,但是在快速的计算机上运行仍需要10秒钟以上。我尝试禁用代码覆盖率,并使用缓存对远程服务器(例如LDAP)执行了几项操作。
在PHPUnit运行时对测试进行性能分析会产生:
mysqli->prepare
中完全有10%的运行时间(包括收集信息并生成大量页面进行代码覆盖的时间)。不幸的是,我无法在此处抽象数据库。我不仅可以有效地测试数据库访问层本身,而且还可以根据测试代码内部的JOIN
实现许多逻辑。
是否有我可以更改的任何配置设置或任何性质的设置可以使此设置更快? prepare
是否需要调出mysql服务器(因此设置本地mysql服务器进行测试可能会有帮助?)
参考方案
是的,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握手和纠错以及网络延迟的开销。
但是,最好的解决方案实际上是使用模拟对象抽象数据库连接,但是您已经知道这一点。如果必须连接到数据库,则单元测试不是单元测试:它是集成测试。
php Singleton类实例将在多个会话中保留吗? - php举一个简单的例子,如果我想计算一个不使用磁盘存储的脚本的命中次数,我可以使用静态类成员来执行此操作吗?用户1:<?php $test = Example::singleton(); $test->visits++; ?> 用户2:<?php $test = Example::singleton(); $test->visits+…
PHP:填写数组中的“空白” - php我有一个php数组(通过表单中的复选框值获取-您知道复选框仅在未设置时显示在_POST变量中)。Array ( [2] => 0,2 [3] => 0,3 ) 我需要一种方法来“填补” 0-5之间的差距。所以上面看起来像(用'-1'填充空白。我尝试用填充有'-1'的数组array_merge(),但这没用。Array ( [0] => -1…
PHP:对数组排序 - php请如何排序以下数组Array ( 'ben' => 1.0, 'ken' => 2.0, 'sam' => 1.5 ) 至Array ( 'ken' => 2.0, 'sam' => 1.5, 'ben' =&…
PHP:检查谁看过发送的电子邮件? - php我正在向某些用户发送电子邮件,并且想知道是谁阅读的,这意味着如果有人阅读了该电子邮件,则将维护一个日志文件,其中包含该用户的电子邮件地址以及日期/时间/ IP。为此,我发送一个带有电子邮件(html模板)的javascript函数,当用户打开该电子邮件时,它仅会警告用户的电子邮件地址,例如:for($n=0; $n<sizeof($checkBox);…
我这里需要结尾的分号吗? - php例:<?php $formElement->display()?> 可以吗,还是我应该提供? ?好吧,我猜想PHP解释器足够聪明,可以看到由于结尾的?>,该行已完成并且表达式已完成。对? 参考方案 它不是必需的,但您应该放它,这是一种很好的做法。这样,您需要在这条指令之后添加另一条指令的那一天,它将很好地工作。这是回答您问题的手册页面…