CakePHP UnitTest耗时太长~37分钟

时间:2014-01-31 12:32:20

标签: cakephp ssh phpunit fixtures phpseclib

我正在处理CakePHP项目。最近我在项目中添加了UnitTests。我的系统配置是:

  • PHPUnit 3.7.24。
  • Cake Versio 2.4.2。
  • 具有4核Intel(R)Xeon(R)CPU E5-2609 v2 @ 2.50GHz的VM服务器
  • 9.1-RC3 FreeBSD。

但我的一项测试运行速度非常慢。它需要约37分钟才能完成。我在这个测试中使用了10个灯具,但我没有从其他数据库加载记录, 因此我的Fixture类只包含这一行:

public $import = array('model' => 'Model', 'records' => false);

测试包含三个testAction() - 调用。其中两个跑得快,第三个没跑。第三个调用运行控制器操作,执行以下操作:

  • 对包含~2个条目的表运行两个查询查询
  • 使用ifconfig
  • 获取webvserver ip
  • 连接到每个ssh的另一个vm(使用phpseclib)
  • 将带有scp的3,6 MB文件从webserver复制到vm
  • 运行python脚本
  • 将它的json输出复制回webserver
  • 将json信息保存在网络服务器的数据库中(< 40 table entries)
  • 删除vm上的python脚本结果

当我通过单击Web界面中的图标来运行相同的控制器操作时,它会在< 1毫升。但是在单元测试中按testAction()运行它 我告诉你需要大约37分钟。

  • 我已经尝试设置Configure :: write('debug',0);,没有任何影响。
  • 我按照“cake test”命令在控制台中运行测试,没有任何性能提升。
  • 我尽可能地推断了Model->递归以获取所有信息

知道如何固定UnitTest吗?我的其他UnitTests只采取< 1分钟。

2 个答案:

答案 0 :(得分:1)

您需要在日志文件中对该测试中的每个操作进行概要分析,以便了解问题所在。

使用PHP的microtime()函数精确测量事物。

使用日志文件来监控正在进行的操作以及粗略估计操作所需的数量也是一种非常好的做法。这样的日志文件会立即向您显示瓶颈所在......

因此,我建议您设置日志记录,如果需要精确计时,请使用microtime()功能。

答案 1 :(得分:-1)

NOT 单元测试。您正在测试网络连接,bash(或其他)解释器和数据库。 UnitTest 必须只测试一个单元代码 - 通常是类。您不得使用网络或数据库。如果你测试动作类的应该采取 - 使用模拟对象和方法类的期望。