Скорость запуска тестового набора в Rails - PullRequest
4 голосов
/ 29 января 2009

У меня 357 тестов (534 утверждения) для моего приложения (с использованием musta). Весь набор тестов выполняется примерно за 80 секунд. Это время хорошо? Мне просто любопытно, так как это одно из моих первых приложений, где я интенсивно пишу тесты. В моем приложении нет ничего необычного.

Кстати: я пытался использовать в памяти базу данных sqlite3, но результаты оказались на удивление хуже (около 83 секунд). Любые подсказки здесь?

Я использую Macbook с 2 ГБ оперативной памяти и 2 ГГц процессором Intel Core Duo в качестве машины для разработки.

Ответы [ 7 ]

2 голосов
/ 26 марта 2010

Вам следует попробовать этот метод http://wiki.github.com/dchelimsky/rspec/spork-autospec-pure-bdd-joy, используя spork, чтобы ускорить пару процессов, которые остаются запущенными, и выполнить пакетные тесты. Я нашел это довольно быстро.

2 голосов
/ 29 января 2009

Я не чувствую, что этот вопрос относится к конкретным рельсам, поэтому я буду вмешиваться.

Главное в тестировании - то, что оно должно быть достаточно быстрым, чтобы вы часто их запускали (как, впрочем, и все время). Кроме того, вы можете разделить свои тесты на несколько разных наборов, в частности, такие как «длительные тесты» и «модульные тесты».

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

Удачи!

1 голос
/ 29 января 2009

Если вы хотите ускорить время выполнения вашего набора тестов, я бы использовал тестовый сервер, такой как от Roman Le Négrate.

1 голос
/ 29 января 2009

Большие тестовые наборы могут занять некоторое время.

Я обычно использую "autospec -f" при разработке, он запускает только те спецификации, которые изменились со времени последнего запуска, - делает работу тестов намного более эффективной.

Конечно, если вы действительно серьезны, вы запустите настройку Непрерывной Интеграции, такую ​​как Cruise Control - это автоматизирует ваш процесс сборки и будет работать в фоновом режиме, проверяя ваше последнее здание и запуская пакет.

1 голос
/ 29 января 2009

Это действительно зависит от того, что делают ваши тесты. Тестовый код может быть написан эффективно или не так, как любой другой код.

Одной из очевидных оптимизаций во многих случаях является написание тестового кода таким образом, чтобы все (или как можно больше) выполнялось в памяти, в отличие от многих операций чтения / записи в базу данных. Однако вам может потребоваться изменить код приложения, чтобы иметь подходящие интерфейсы для достижения этой цели.

0 голосов
/ 08 июня 2010

Вы можете поэкспериментировать с предварительной загрузкой приборов, но поддерживать их будет сложнее, и, ИМХО, не стоит улучшений скорости (думаю, максимум 20%, но это зависит)

Известно, что SQLite медленнее, чем mysql / pgsql, за исключением очень маленьких, крошечных БД .

Как кто-то уже сказал, вы можете поместить файлы данных mysql (или других БД) на некоторый RAMDisk (я использую tmpfs на linux).

PS: у нас сейчас 1319 примеров Rspec, и он работает в течение 230 секунд на C2D-3Ghz-4GRam, и я думаю, что это нормально. Значит, и у тебя все хорошо.

0 голосов
/ 08 июня 2010

В отличие от SQLite в памяти, вы можете поместить базу данных MySQL в RAMDISK (в Windows) или в tmpfs в Linux.

MySQL имеет очень эффективную буферизацию, поэтому размещение базы данных в памяти мало поможет, пока вы действительно не обновите много данных.

Более важным является способ изоляции теста и подготовки данных для каждого теста.

Вы можете использовать транзакционные приспособления. Это означает, что каждый тест будет включен в транзакцию, и поэтому следующий тест начнется в начальной точке.

Это быстрее, чем очищать базу данных перед каждым тестом.

Существуют ситуации, когда вы хотите использовать как транзакции, так и явное стирание данных, вот хорошая статья об этом: http://www.3hv.co.uk/blog/2009/05/08/switching-off-transactions-for-a-single-spec-when-using-rspec/

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