2016-01-23 1 views
6

Я люблю Faker, я использую его в своем seeds.rb все время, чтобы заполнить среду моего приложения реальными данными.Должны ли мы использовать Faker в Rails Factory?

Я также только начал использовать Factory Girl, который также экономит много времени - но когда я провожу вокруг Интернета для примеров кода, я не вижу много доказательств того, что люди объединяют эти два.

В. Есть ли веская причина, почему люди не используют фаер на фабрике?

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

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

+0

Почему вы хотите динамически генерировать данные при создании тестовой модели? Это просто накладные расходы –

+0

Правильно согласившись, производительность теста будет затронута - но не может этого стоить в сложном приложении, особенно с загрузкой проверки, чтобы проверить, что я не написал что-то глупое, что позволяет «firstName: Michal 'но не' firstName: Huw', несомненно, разнообразие Faker приведет к более надежному тестированию? – Huw

+0

Это называется тестирование кромки. Все еще нет необходимости в случайных данных. –

ответ

5

Некоторых люди утверждают, против него, как here.

НЕ ИСПОЛЬЗОВАТЬ RANDOM ATTRIBUTE ЗНАЧЕНИЯ

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

FactoryGirl.define do 
    sequence(:title) { |n| "Example title #{n}" } 

    factory :post do 
    title 
    end 
end 

FactoryGirl.create(:post).title # => 'Example title 1' 

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

Со временем, вы откроете для себя новые атрибуты, которые вызывают тест на неудачу иногда. Это разочаровывает процесс, поскольку тесты могут потерпеть неудачу только один раз в каждые десять или сотни прогонов - в зависимости от количества атрибутов и возможных значений , и какая комбинация запускает ошибку. Вам нужно будет перечислить каждый такой случайный атрибут в каждый тест, чтобы переопределить его, что глупо. Таким образом, вы создаете неслучайные фабрики , тем самым отрицая какую-либо выгоду от первоначальной случайности. Можно было бы утверждать, что Хенрик Нюх делает, что случайные значения помогают вам обнаружить ошибки. Хотя это возможно, это означает, что у вас есть проблема с : дыры в вашем тестовом наборе. В худшем случае ошибка по-прежнему остается незамеченной; в лучшем случае вы получите критическое сообщение об ошибке , которое исчезает при следующем запуске теста, что делает трудно отлаживать. Правда, критическая ошибка лучше, чем ошибка, но рандомизированных заводов остаются плохой заменой для правильных модульных тестов, обзор кода и TDD для предотвращения этих проблем.

Рандомизированные заводы, следовательно, не только не стоят усилий, они даже дают вам ложную уверенность в ваших тестах, что хуже, чем , не имеющих никаких тестов вообще.

Но ничего не мешает вам сделать это, если хотите, просто сделайте это.

О, и есть еще более простой способ встраивать последовательность в недавний FactoryGirl, эта цитата была написана для более старой версии.

+0

Спасибо, Jrochkind, очень ценю ссылку, интересно, что он перечисляет ссылку на это сообщение [Henrik Nyh post] (http://thepugautomatic.com/2012/07/randomize-your-factories/), я нахожу себя глубоко соблазненным этим подходом и вкладом Эйфа выше. Но я думаю, что Арьян ван дер Гааг делает хороший аргумент в пользу того, что использование фейкера - «плохая замена для правильных модульных тестов, обзора кода и TDD для предотвращения этих проблем». Спасибо всем за перспективы. – Huw

+0

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

1

Мне нравится использовать Faker и обычно делайте это при работе с более крупными базами кода. Я вижу следующие преимущества и недостатки при использовании Faker с Factory Girl:

Возможные недостатки:

  • Немного сложнее воспроизвести точно такой же тестовый сценарий (по крайней мере, RSpec работает вокруг этого, показывая генератор случайных чисел семян каждый раз и позволяет воспроизводить один и тот же тест с ним)
  • отходов Генерация данных НЕМНОГО производительности

Возможные преимущества:

  • Делает данные отображаемыми обычно более по-человечески понятными. При создании тестовых данных вручную люди склонны к разным сокращениям, чтобы избежать утомительности.
  • Строительные заводы с Faker для испытаний в то же время предоставляют вам средства для создания приятных демо-данных для презентаций.
  • Вы можете случайно обнаружить тематические ошибки краев при выполнении тестов много
+0

Спасибо, Эйф, это замечательное резюме - можете ли вы поговорить с точкой Михаль выше? Считаете ли вы, что это нарушает основы тестирования с известными значениями? Также, когда вы говорите, что это дает хорошие тестовые данные для демонстраций, я думаю, что вы говорите о семенных файлах там? Как этот фактор влияет на использование заводов для испытаний? Вы используете фабрики в вашем файле семени? – Huw

+0

То, что я испытываю очень часто при написании тестов, заключается в том, что часто не имеет значения, какова фактическая стоимость, но более того, что это то же самое значение, которое было передано где-то, пересекается через некоторый код и возвращается либо точно так же, либо изменено в особым образом. Здесь не имеет значения, является ли значение фиксированным или случайным. Данные Faker обеспечивают дальнейшее использование, поскольку он пытается быть ближе к реальным данным, поэтому люди могут лучше понять это при отладке тестов. Когда содержание значения имеет значение для теста, обычно вы не используете Faker для него в любом случае. – aef

+0

Обычно я определяю фабрики как (возможно, необязательную) часть моей основной базы кода вместо того, чтобы ее связали с тестовым кодом. Затем я могу создавать демо-данные повсюду, будь то в файле семени или в живой консоли, или действительно в любом другом контексте, который я желаю. – aef

1

Это зависит от вас.

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

Я никогда не жалею иметь случайные данные. Все точки, описанные @jrochkind бы правильно (и вы должны прочитать другой ответ, прежде чем читать эту), но это также верно, что вы можете (и должны) написать, что в вашем spec_helper.rb

config.before(:all) { Faker::Config.random = Random.new(config.seed) } 

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

+0

Мне особенно нравится этот ответ, сначала я получаю достаточно случайности, чтобы убедиться, что я могу проверить свои первоначальные ожидания, но повторяемость, когда мне это нужно, спасибо @coorasse :) – Huw

Смежные вопросы