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

时间:2010-07-29 19:35:22

标签: 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的ram,
  • 2.2ghz Core 2 Duo处理器,
  • PHP 5.2,
  • Apache 2.2.14,没有任何操作码缓存, Mysql 5.1.42(Innodb表是我的默认值)
  • 5400转的笔记本电脑硬盘

据我所知,在上面的例子中我每次都在引导Drupal,这是一个非常昂贵的操作,但这对于其他框架来说并不是闻所未闻,比如Ruby on Rails或Django,我不明白为什么它在这个项目中每个测试用例的平均值超过一分钟。

有一个decent list of tricks here for speeding up Drupal 7,其中许多看起来也适用于Drupal 6,但我还没有机会尝试它们,听听这些有什么感觉会很棒我犯了更多盲目的小巷,为其他人努力,

在这种情况下,当您使用Drupal 6时,什么对您有用,以及的快速获胜?

每个测试用例一分钟,当我预计容易超过一百个测试用例时感到疯狂。

3 个答案:

答案 0 :(得分:8)

基于Performance tuning tips for Drupal 7 testing on qa.drupal.org

上的这篇文章,看起来速度的最大增加来自于在ram磁盘上运行测试数据库
  

DamZ在Debian 5上为/etc/init.d/mysql写了一个修改过的mysql init.d脚本,它完全用tmpfs运行MySQL数据库。它位于http://drupal.org/files/mysql-tmpfs.txt,附加到http://drupal.org/node/466972

     

它允许捐赠的双四核机器从50分钟的测试和InnoDB的巨大磁盘I / O转移到每次测试不到3分钟的时间。它现在正在PIFR v1上以#32的形式进行测试。这当然是唯一的出路。

     

如果有人想省略下面的skip-innodb上的步骤并在tmpfs上尝试,我还没有也不会很快在InnoDB上尝试它。

还有some instructions here for creating a ram disk on OS X,虽然这是为了将整个mysql数据库库存转移到ram磁盘而不是只有一个数据库:

更新 - 我现在尝试使用OS X这种方法,并记录了我发现的内容

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

创建ram磁盘

我选择了一个千兆字节,主要是因为我有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磁盘作为我们的数据目录,而不是默认位置。 / p>

  /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

添加数据库以进行测试

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

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

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

创建符号链接 - 这是因为默认情况下mysql命令查找/tmp/mysql.sock,并且将其与我们的短期ram磁盘进行符号链接比不断更改php.ini文件更简单

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

创建数据库(在mysql提示符下的comamnd行)

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一起使用的统计数据,别的告诉我,

答案 1 :(得分:5)

Drupal SimpleTests最大的问题是安装Drupal需要很长时间,并且每个测试用例都已完成。

所以使用simpletest_clone - 基本上,在安装后将数据库转储为新的,它允许您将该转储用作每个测试用例的起点,而不是运行整个安装程序。

答案 2 :(得分:2)

我感觉到你的痛苦,你的观察结果也很明显。一个需要几分钟才能运行的套件是一个抑制TDD的套件。我已经在命令行上运行了普通的PHPUnit测试,它的运行速度和你预期的Rails环境一样快。真正的关键是远离打击数据库;使用模拟和存根。