2009-04-20 1 views
2

Я сейчас смотрю на здоровенный набор тестов Rails. Я ничего не могу описать, но время выполнения всего пакета (unit/functional/some integration) может увеличиться до 5 минут.Плюсы и минусы использования заводов в наборе тестов Rails?

Мы полностью полагаемся на светильники, и мы не издеваемся и не стучаем так, как должны.

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

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

Может ли кто-нибудь обучить меня тому, почему или почему я не должен использовать фабрики?

Спасибо!

ответ

6

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

Светильники:

  • трудно поддерживать отношения (особенно много-ко-многим);
  • Время выполнения тестового набора обычно медленнее из-за большего количества ударов БД;
  • тесты очень чувствительны к изменениям схемы.

Фабрика:

  • вы окурок, все, что вы не проверить на текущем модульный тест;
  • вы готовите объекты, которые вы тестируете на заводах. Здесь фабрики демонстрируют свое реальное преимущество - легко настроить новые тестовые примеры, так как вам не нужно поддерживать тонну YAML-файлов;
  • вы концентрируетесь на тестировании. Если тесты требуют изменения сценария, вы не смещаете свое мышление. Пока заглушки являются разумными, а фабрики легко настраиваются, вы должны быть в порядке.

Итак, заводы выглядят неплохо. Единственными возможными недостатками, которые я вижу, являются:

  • время, проведенное вами мигрированием из светильников;
  • Сохранение разумного набора сценариев может потребовать некоторых усилий.
10

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

Светильники были своего рода мальчиком побивания сообщества Rails на некоторое время. Все понимают недостатки светильников, но никто не защищает их сильные стороны. По моему опыту, сами заводы могут легко стать столь же трудными для поддержания, как приспособления (это действительно зависит от схемы, но я отвлекаюсь).Реальная сила фабрик заключается в выборочной замене боли, основанной на креплении. Давайте поговорим о парах особенностей.

Первый выпуск - характеристики. Если вы можете протестировать большую часть своего приложения, не попав в базу данных, вы увидите значительную скорость, но для большинства приложений я не думаю, что было бы разумно протестировать, не попав в базу данных полностью. В какой-то момент вы хотите протестировать весь стек. Каждый раз, когда вы издеваетесь или заглушаете, вы делаете предположение о интерфейсе, который может содержать тонкие ошибки. Итак, предполагая, что вам нужно попасть в базу данных по некоторому значимому проценту тестов, транзакционные светильники (у вас есть с использованием транзакционных светильников вправо?) Вполне может быть намного быстрее, чем создавать экземпляр всей среды для каждого теста.

Я бы сказал, с размером вашего тестового набора, который вам действительно нужно посмотреть в сторону Continuous Integration, чтобы увеличить вашу разработку до следующего уровня. Независимо от того, насколько вы ускоряете их, разработчикам еще долго ждать. Возможно, посмотрите на autotest, а также на индивидуальном уровне. Но в конечном счете CI позволит вам поддерживать тестирование дисциплины, не жертвуя гибкостью разработчика.

Место, где светильники действительно светятся, - это функциональное/интеграционное тестирование. То, как я смотрю на это, - это то, что приборы должны настроить здоровое базовое состояние для тестируемого приложения. Большинство модульных тестов действительно не нужны. Вы можете получить очень хорошее покрытие с использованием фабрик. Однако, когда дело доходит до функционального тестирования, любая страница может поражать десятки моделей. Я не хочу настраивать все эти вещи в каждом тесте. По мере того, как я строил все более сложные сценарии, я все ближе и ближе к воссозданию глобального состояния данных, которое точно, какие светильники были предназначены для работы в первую очередь.

Одно противоречивое убеждение, которое я придерживаюсь, состоит в том, что при прочих равных условиях я предпочитаю один функциональный тест для 20 модульных тестов (с использованием языка Rails). Зачем? Поскольку функциональный тест доказывает, что конечный результат, который отправляется пользователю, является правильным. Модульные тесты отлично подходят для получения нюансов функциональности, но в конце концов вы все равно можете столкнуться с ошибкой по интерфейсу, который разбивает весь ваш сайт. Функциональные тесты - вот что дает мне уверенность в развертывании без фактической загрузки страницы в моем браузере. Я знаю, что я мог бы заглушить все и проверить оба интерфейса и получить одинаковое покрытие, но если я смогу протестировать весь стек за один простой тест за счет небольшого процессора, я бы скорее сделал это.

Итак, каковы мои лучшие практики для светильников?

  • Установите несколько для каждой модели, чтобы охватить самые широкие категории данных
  • При добавлении важной новой функции, которая разрежет во многих моделях и контроллерах, добавить некоторые новые светильники представляют крупные государства
  • Избегайте редактирование старых светильников для добавления/удаления полого
  • Используйте заводов для более мелких/более локализованных вариаций
  • Используйте заводов для тестирования пагинации или другого массового создания, который необходим только для нескольких тестов, за исключением

Кроме того, позвольте мне рекомендовать Jay Fields' blog для действительно хорошего прагматического совета по тестированию. То, что мне больше всего нравится в блоге Джей, заключается в том, что он всегда признает, что тестирование очень специфично для проекта, и то, что работает для одного проекта, не обязательно работает для другого. Он не знает догмы и долго прагматизма.