【问题标题】:CakePHP UnitTest takes too long ~ 37 minutesCakePHP UnitTest 耗时太长 ~ 37 分钟
【发布时间】:2014-02-24 03:41:56
【问题描述】:

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

  • PHP 单元 3.7.24。
  • 蛋糕版本 2.4.2。
  • 具有 4 核 Intel(R) Xeon(R) CPU E5-2609 v2 @ 2.50GHz 的 VM 服务器
  • 9.1-RC3 FreeBSD。

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

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

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

  • 对包含 ~ 2 个条目的表运行两个查找查询
  • 使用 ifconfig 获取 webvserver ip
  • 通过 ssh 连接到另一个虚拟机(使用 phpseclib)
  • 使用 scp 将 3.6 MB 文件从网络服务器复制到 vm
  • 运行 python 脚本
  • 将它的 json 输出复制回网络服务器
  • 将json信息保存在webserver的数据库中(
  • 移除vm上的python脚本结果

当我通过单击 Web 界面中的图标来运行相同的控制器操作时,它会在

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

知道如何固定这个 UnitTest 吗?我的其他单元测试只需要

【问题讨论】:

  • 就像 Ilie Pandia 所说,最好知道脚本的哪一部分导致了速度变慢。是“运行两个查找查询”还是“使用 ifconfig 获取 webvserver ip”或其他?

标签: cakephp ssh phpunit fixtures phpseclib


【解决方案1】:

您需要在日志文件中对该测试中的每个操作进行概要分析,以便知道问题出在哪里。

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

此外,使用日志文件来监控正在发生的事情并粗略估计需要多少操作是一个很好的做法。这样的日志文件会立即告诉你瓶颈在哪里......

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

【讨论】:

  • 好的,谢谢。当然,这对我有帮助。问题是 python 脚本花费了太长时间。该脚本在虚拟机上运行。这个限制为 128 MB RAM,但脚本需要 > 750 MB。所以这个问题甚至与 cake 无关,也与 phpseclib 无关。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-07
    相关资源
    最近更新 更多