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

Chr*_*ams 6 php mysql testing performance drupal

我正在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

Run Code Online (Sandbox Code Playgroud)

我试图在每次将代码推送到中央仓库之前运行这样的测试,但是如果它在项目的早期就花了这么长时间,那么当我们有更多的测试用例时,我会害怕进一步思考它.

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

我正在使用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,这是闻所未闻的,我不明白为什么它是平均的在这个项目的每个测试用例上花一点多时间.

这里有一个很好的技巧列表来加速Drupal 7,其中许多看起来也适用于Drupal 6,但我还没有机会尝试它们,听听如何这些已经为其他人解决了,因为我犯了更多盲目的小巷,

当你在这种情况下使用Drupal 6时,对你有用的是什么,以及快速获胜的地方在哪里

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

Chr*_*ams 8

看起来速度的最大增加将来自在ram磁盘上运行测试数据库,基于这篇文章,关于qa.drupal.org上Drupal 7测试的性能调优技巧

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上尝试它.

此外还有一些说明用于在OS X上创建ram磁盘,尽管这是用于将整个mysql数据库库存移动到ram磁盘而不是仅仅是一个数据库:

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

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

创建一个ram磁盘

我选择了一个千兆字节,主要是因为我有4GB的RAM,而且我不确定我可能需要多少空间,所以我正在安全地玩它:

    diskutil erasevolume HFS+ "ramdisk" `hdiutil attach -nomount ram://2048000`
Run Code Online (Sandbox Code Playgroud)

设置mysql

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

    /usr/local/mysql/scripts/mysql_install_db \
        --basedir=/usr/local/mysql \
        --datadir=/Volumes/ramdisk
Run Code Online (Sandbox Code Playgroud)

然后,我采取了以下步骤:我确保先前的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
Run Code Online (Sandbox Code Playgroud)

添加数据库以进行测试

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

drush sql-dump > staging.project.database.dump.sql
Run Code Online (Sandbox Code Playgroud)

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

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

ln -s /tmp/mysql_ram.sock /tmp/mysql.sock
Run Code Online (Sandbox Code Playgroud)

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

CREATE DATABASE project_name;
GRANT ALL PRIVILEGES ON project_name.* to db_user@localhost IDENTIFIED BY 'db_password';
Run Code Online (Sandbox Code Playgroud)

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

mysql project_database < staging.project.database.dump.sql  
Run Code Online (Sandbox Code Playgroud)

在命令行上运行测试

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

php ./scripts/run-tests.sh --verbose --class ClientFeatureTestCase testFeaturesCreateNewsItem ; growlnotify -w -m "Tests have finished."
Run Code Online (Sandbox Code Playgroud)

两个测试用例大约需要一分半钟,仍然非常缓慢 - 比我之前使用的其他框架慢几个数量级.

我在这做错了什么?

不能成为使用Drupal运行测试的标准方法,但是我无法找到关于Drupal需要测试套件多长时间的任何统计信息,否则告诉我,


Ada*_*rlo 5

Drupal SimpleTests最大的问题是安装Drupal需要很长时间,而且每个测试用例都可以完成.

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