php - 您应该采取哪些步骤来加速 SimpleTest?

标签 php mysql performance drupal testing

我正在为 Drupal 6 项目编写一些测试代码,在使用其他语言和框架(如 Ruby on Rails 或 Django)之后,我无法相信这些测试运行起来有多慢。

Drupal.org 认为这个问题是垃圾邮件,不会给我一种证明我是人类的方法,所以我认为 SO 是下一个问这样的问题的基地,并且对我的问题进行健全性检查测试方法。

此要点中的以下测试代码相对简单。

http://gist.github.com/498656

简而言之,我是:

  • 创建几个内容类型,
  • 创建一些角色,
  • 创建用户,
  • 以用户的身份创建内容,
  • 检查他们是否可以编辑内容
  • 检查它是否对匿名用户可见

这是我从命令行运行这些测试时的输出:



Drupal test run
---------------

Tests to be run:
 -  (ClientProjectTestCase)

Test run started: Thu, 29/07/2010 - 19:29

Test summary:
-------------

ClientProject feature 52 passes, 0 fails, and 0 exceptions

Test run duration: 2 min 9 sec

在我每次将代码推送到中央存储库之前,我都尝试运行这样的测试,但是如果在项目的早期就花了这么长时间,我害怕在我们进行更多测试时进一步考虑它例。

我该怎么做才能加快速度?

我正在使用 MacbookPro:

  • 4gb 内存,
  • 2.2ghz 酷睿 2 双核处理器,
  • PHP 5.2,
  • Apache 2.2.14,没有任何操作码缓存, Mysql 5.1.42(Innodb 表是我的默认表)
  • 5400 RPM 笔记本电脑硬盘

我知道在上面的示例中我每次都在引导 Drupal,这是一个非常昂贵的操作,但这在其他框架中并非闻所未闻,例如 Ruby on Rails 或 Django,我不明白为什么这个项目的每个测试用例平均花费一分钟多一点。

有一个 decent list of tricks here for speeding up Drupal 7 ,其中许多看起来也适用于 Drupal 6,但我还没有机会尝试它们,很高兴听到这些对其他人来说是如何解决的,因为我犯了进一步的错误小巷,

当您在这种情况下使用 Drupal 6 时,什么对您有用?快速取胜的方法在哪里

当我期望轻松地超过一百个测试用例时,每个测试用例一分钟感觉很疯狂。

最佳答案

根据此处 Performance tuning tips for Drupal 7 testing on qa.drupal.org 上的这篇帖子,看起来最大的速度提升将来自在 ram 磁盘中运行测试数据库。

DamZ wrote a modified mysql init.d script for /etc/init.d/mysql on Debian 5 that runs MySQL databases entirely out of tmpfs. It's at http://drupal.org/files/mysql-tmpfs.txt, attached to http://drupal.org/node/466972.

It allowed the dual quad core machine donated to move from a 50 minute test and huge disk I/O with InnoDB to somewhere under 3 minutes per test. It's live as #32 on PIFR v1 for testing.d.o right now. It is certainly the only way to go.

I have not and won't be trying it on InnoDB anytime soon if anyone wants to omit the step on skip-innodb below and try it on tmpfs.

还有some instructions here for creating a ram disk on OS X ,尽管这是为了将您的全部 mysql 数据库存量移动到 ram 磁盘中,而不仅仅是一个数据库:

更新 - 我已经在 OS X 上尝试过这种方法,并记录了我的发现

通过切换到 ram 磁盘,我已经能够将测试时间缩短 30-50%。以下是我采取的步骤:

创建内存盘

我选择 GB 主要是因为我有 4GB 的 RAM,而且我不确定我可能需要多少空间,所以我谨慎行事:

    diskutil erasevolume HFS+ "ramdisk" `hdiutil attach -nomount ram://2048000`

设置mysql

接下来我运行 mysql 安装脚本以在新的 ramdisk 上安装 mysql

    /usr/local/mysql/scripts/mysql_install_db \
        --basedir=/usr/local/mysql \
        --datadir=/Volumes/ramdisk

然后,我采取了以下步骤:我确保之前的 mysqld 不再运行,然后启动 mysql 守护进程,确保我们告诉它使用 ram 磁盘作为我们的数据目录,而不是默认位置。

  /usr/local/mysql/bin/mysqld \
      --basedir=/usr/local/mysql \
      --datadir=/Volumes/ramdisk \
      --log-error=/Volumes/ramdisk/mysql.ramdisk.err \
      --pid-file=/Volumes/ramdisk/mysql.ramdisk.pid \
      --port=3306 \
      --socket=/tmp/mysql_ram.sock

添加测试用的数据库

然后我在更新 settings.php 指向它的位置之前使用 drush 在我们的暂存站点上拉下了最新的数据库转储:

drush sql-dump > staging.project.database.dump.sql

下一步是将此数据放入 ram 磁盘上的本地测试设置中。这涉及创建到 ramdisk 数据库套接字的符号链接(symbolic link),创建数据库,向 drupal 安装中指定的 mysql 用户授予权限,然后加载数据库以开始运行测试。一步一步:

创建符号链接(symbolic link) - 这是因为 mysql 命令默认查找 /tmp/mysql.sock,并将其符号链接(symbolic link)到我们的短期 ram 磁盘比不断更改 php.ini 文件更简单

ln -s /tmp/mysql_ram.sock /tmp/mysql.sock

创建数据库(从 mysql 提示符下的命令行)

CREATE DATABASE project_name;
GRANT ALL PRIVILEGES ON project_name.* to db_user@localhost IDENTIFIED BY 'db_password';

正在将内容加载到新数据库中...

mysql project_database < staging.project.database.dump.sql  

在命令行上运行测试

...最后从命令行运行测试,并在测试完成时使用 growlnotify 告诉我

php ./scripts/run-tests.sh --verbose --class ClientFeatureTestCase testFeaturesCreateNewsItem ; growlnotify -w -m "Tests have finished."

两个测试用例仍然需要大约一分半钟,仍然慢得无法使用 - 比我以前可能使用过的其他框架慢几个数量级。

我在这里做错了什么?

不能是使用 Drupal 运行测试的标准方式,但我无法找到任何关于我应该期望测试套件使用 Drupal 花费多长时间的统计数据,以否则告诉我,

关于php - 您应该采取哪些步骤来加速 SimpleTest?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3366286/

相关文章:

php - 在投票系统上每人只允许投一票

php - 将 subview Blade 部分动态添加到 View 中

php - CodeIgniter/胖模型/瘦 Controller

mysql - 使用 Group By 子句选择查询时为 "No data - zero rows fetched, selected, or processed"

php - 使用数据列填充下拉列表并获取用户选择的项目

javascript - "obj != null"与 "! (obj == null)"?

python - 向量化稀疏矩阵的 hellinger - NumPy/Python

php - SQL : Match IN operator with anything

mysql - 计算 mysql 数据库行中的值

使用 ROWNUM 优化 Oracle 查询