10 секунд - це дуже довгий час для запуску будь-якого окремого тесту. Мені здається, що ваша ціль специфікації одночасно виконує як модульні, так і інтеграційні тести. Це типова справа, в яку потрапляють проекти, і на якомусь етапі вам потрібно буде подолати цей технічний борг, якщо ви хочете виробляти більше, швидше. Є кілька стратегій, які можуть допомогти вам зробити це ... і я порекомендую кілька, які я використовував у минулому.
1. Окремий блок від інтеграційних тестів
Перше, що я б зробив, це відокремити модуль від інтеграційних тестів. Ви можете зробити це, виконавши:
- Переміщення їх (в окремі папки в каталозі специфікацій) - і зміна цілей рейку
- Позначення їх тегами (rspec дозволяє позначити тести)
Філософія полягає в тому, що ви хочете, щоб ваші регулярні збірки були швидкими - інакше люди не будуть дуже раді їх часто запускати. Тож поверніться на цю територію. Отримайте свої регулярні тести для швидкого запуску та використовуйте сервер безперервної інтеграції для запуску більш повної збірки.
Тест інтеграції - це тест, який включає зовнішні залежності (наприклад, База даних, WebService, Черга, а деякі можуть аргументувати FileSystem). Модульний тест просто перевіряє конкретний елемент коду, який ви хочете перевірити. Він повинен працювати швидко (можливо 9000 за 45 секунд), тобто більша його частина повинна працювати в пам'яті.
2. Перетворити інтеграційні тести на модульні
Якщо основна частина модульних тестів менша, ніж набір інтеграційних тестів, у вас проблема. Це означає, що суперечності почнуть з’являтися легше. Отже, почніть створювати більше модульних тестів, щоб замінити інтеграційні тести. Ви можете допомогти в цьому процесі:
- Використовуйте глузувальну структуру замість реального ресурсу. Rspec має вбудований механізм насмішок.
- Запустіть rcov на наборі модульних тестів. Використовуйте це, щоб оцінити, наскільки ретельним є ваш набір модульних тестів.
Якщо у вас є належні модульні тести для заміни інтеграційного тесту, видаліть інтеграційний тест. Повторне тестування лише погіршує технічне обслуговування.
3. Не використовуйте світильники
Світильники - це зло. Замість цього використовуйте фабрику (машиніст чи фабричний робот). Ці системи можуть створювати більш пристосовані графіки даних, і що більш важливо, вони можуть створювати об'єкти в пам'яті, які ви можете використовувати, а не завантажувати речі із зовнішнього джерела даних.
4. Додайте перевірки, щоб зупинити одиничні тести, які стають інтеграційними
Тепер, коли у вас є швидше тестування, час перевіряти, щоб ЗУПИНИТИ це повторюватися.
Існують бібліотеки, в яких активний запис виправлення мавп видає помилку при спробі отримати доступ до бази даних (UnitRecord).
Ви також можете спробувати сполучення та TDD, що може допомогти вашій команді писати швидші тести, оскільки:
- Хтось перевіряє - щоб ніхто не лінувався
- Правильний TDD вимагає швидкого зворотного зв'язку. Повільні тести просто роблять все це болючим.
5. Використовуйте інші бібліотеки, щоб подолати проблему
Хтось згадав spork (пришвидшує час завантаження тестового набору під rails3), hydra / Паралельні тести - для паралельного запуску модульних тестів (на декількох ядрах).
Це, мабуть, слід використовувати ОСТАННІЙ. Ваша справжня проблема - це повністю на кроках 1, 2, 3. Вирішіть це, і ви зможете краще виграти додаткову інфраструктуру.