Какие шаги вы должны предпринять, чтобы ускорить SimpleTest? - PullRequest
6 голосов
/ 29 июля 2010

Я пишу некоторый тестовый код для проекта Drupal 6, и я не могу поверить, насколько медленно эти тесты выполняются после работы с другими языками и средами, такими как Ruby on Rails или Django.

Drupal.org считает этот вопрос спамом и не даст мне способа доказать, что я человек, поэтому я подумал, что SO - это следующий базовый пункт, чтобы задать такой вопрос, и проверить правильность моего подхода кtesting.

Следующий тестовый код в этой сущности является относительно тривиальным.

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 с:

  • 4 ГБ оперативной памяти,
  • 2,2 ГГц процессором 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 в этой ситуации, и где быстрые победы для этого ?

Одна минута на тестовый случай, когда я ожидаю, что легко более ста тестовдела кажутся безумными.

Ответы [ 3 ]

8 голосов
/ 30 июля 2010

Похоже, что наибольшее увеличение скорости произойдет при запуске тестовой базы данных на оперативном диске, основанной на этом посте здесь Советы по настройке производительности для тестирования Drupal 7 на qa.drupal.org

DamZ написал модифицированный сценарий mysql init.d для /etc/init.d/mysql в Debian 5, который полностью запускает базы данных MySQL из tmpfs.Он находится по адресу http://drupal.org/files/mysql-tmpfs.txt, и подключен к http://drupal.org/node/466972.

. Это позволило двухъядерной машине с пожертвованием перейти от 50-минутного теста и огромного дискового ввода-вывода с InnoDB к где-то менее 3 минутам на тест.Прямо сейчас он работает под номером 32 на PIFR v1 для тестирования.Это, конечно, единственный путь.

У меня нет и не буду пробовать его на InnoDB в ближайшее время, если кто-то захочет пропустить шаг на skip-innodb ниже и попробовать его на tmpfs.

Также здесь есть некоторые инструкции для создания оперативного диска в OS X , хотя это для перемещения всего вашего набора баз данных mysql на оперативный диск, а не просто в одну базу данных:

Обновление - я попробовал этот подход сейчас с OS X и задокументировал то, что нашел

Мне удалось сократить на 30-50% отвремя тестирования путем переключения на оперативный диск.Вот шаги, которые я предпринял:

Создание оперативного диска

Я выбрал гигабайт в основном потому, что у меня 4 ГБ ОЗУ, и я не уверен, сколько местаМне может понадобиться, поэтому я играю безопасно:

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

Установка mysql

Затем я запустил скрипт установки mysql, чтобы установить mysql на новый ramdisk

    /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

Добавить базу данных для тестирования

Затем я вытащил последний дамп базы данных на нашем промежуточном сайте с помощью drush, прежде чем обновлять, куда на него указывает settings.php:

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

Затем было загрузить эти данные в локальную настройку тестирования на оперативном диске.Это включало создание символической ссылки на сокет базы данных ramdisk и создание базы данных, предоставление прав пользователю mysql, указанному в установке drupal, а затем загрузку базы данных для запуска тестов.Шаг за шагом:

Создание символической ссылки - это потому, что команда mysql по умолчанию ищет /tmp/mysql.sock, а символическая ссылка на наш краткосрочный оперативный диск была проще, чем постоянное изменение файлов php.ini

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

Создание базы данных (из строки comamnd в приглашении 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, чтобы сказать мне иначе,

5 голосов
/ 11 апреля 2011

Самая большая проблема с Drupal SimpleTests заключается в том, что установка Drupal занимает много времени, и это делается для каждого тестового случая.

Так что используйте simpletest_clone - в основном, дамп вашей базы данных свежийпосле установки и позволяет использовать этот дамп в качестве отправной точки для каждого теста, а не запускать весь установщик.

2 голосов
/ 04 февраля 2011

Я чувствую вашу боль, и ваши наблюдения точны. Набор, выполнение которого занимает несколько минут, - это набор, который запрещает TDD. Я прибег к простым тестам PHPUnit, запускаемым из командной строки, которые запускаются так быстро, как можно было бы ожидать из среды Rails. Реальный ключ заключается в том, чтобы вообще избежать попадания в базу данных; использовать насмешки и заглушки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...