我正在Drupal 6项目上编写一些测试代码,在使用其他语言和框架(如Ruby on Rails或Django)之后,我无法相信这些测试似乎运行得有多慢。
Drupal.org认为这个问题是垃圾邮件,并且不会给我一个证明我是人的方法,所以我认为SO是下一个问这样的问题的基地,并对我的问题进行理智检查测试方法。此要点中的以下测试代码相对简单。
总之我是:
这是从命令行运行这些测试时的输出:
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:
据我所知,在上面的例子中我每次都在引导Drupal,这是一个非常昂贵的操作,但这对于其他框架来说并不是闻所未闻,比如Ruby on Rails或Django,我不明白为什么它在这个项目中每个测试用例的平均值超过一分钟。
有一个decent list of tricks here for speeding up Drupal 7,其中许多看起来也适用于Drupal 6,但我还没有机会尝试它们,听听这些有什么感觉会很棒我犯了更多盲目的小巷,为其他人努力,
在这种情况下,当您使用Drupal 6时,什么对您有用,以及的快速获胜?
每个测试用例一分钟,当我预计容易超过一百个测试用例时感到疯狂。
答案 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磁盘而不是只有一个数据库:
通过切换到ram磁盘,我已经能够从测试时间减少30-50%。以下是我采取的步骤:
我选择了一个千兆字节,主要是因为我有4GB的RAM,而且我不确定我可能需要多少空间,所以我正在安全地玩它:
diskutil erasevolume HFS+ "ramdisk" `hdiutil attach -nomount ram://2048000`
接下来,我运行了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环境一样快。真正的关键是远离打击数据库;使用模拟和存根。