Должны ли мы использовать Faker в Rails Factory?

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

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

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

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

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


person Huw    schedule 23.01.2016    source источник
comment
Зачем вам генерировать данные динамически каждый раз, когда вы создаете тестовую модель? это просто накладные расходы   -  person Mike Szyndel    schedule 23.01.2016
comment
Согласен, это повлияет на производительность теста, но разве это не стоит того в сложном приложении, особенно с большим количеством проверок, чтобы проверить, что я не написал что-то глупое, что позволяет firstName: Michal, но не firstName: Huw, конечно, разновидность Faker приведет к более надежному тестированию?   -  person Huw    schedule 23.01.2016
comment
Это называется пограничным тестированием. По-прежнему нет необходимости в случайных данных   -  person Mike Szyndel    schedule 23.01.2016
comment
Но разве вам не нужно заранее знать все крайние случаи, которые вы, возможно, захотите протестировать?   -  person Huw    schedule 23.01.2016
comment
Конечно, вы делаете! Но смотри. Представьте, что вы используете случайные данные для тестов и хотите проверить правильность имени, присвоенного экземпляру модели Person. Если бы имя было сгенерировано Faker, как бы вы хотели это сделать? Сравните модель с собой? Это бессмысленно. Весь смысл модульного тестирования заключается в сравнении вывода кода с ИЗВЕСТНЫМИ значениями!   -  person Mike Szyndel    schedule 23.01.2016


Ответы (3)


Некоторые возражают против этого, как здесь.

НЕ ИСПОЛЬЗУЙТЕ СЛУЧАЙНЫЕ ЗНАЧЕНИЯ АТРИБУТОВ

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

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

  factory :post do
    title
  end 
end

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

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

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

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

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

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

person jrochkind    schedule 23.01.2016
comment
Спасибо, Jrochkind, тоже очень признателен за ссылку, интересно, что он перечисляет ссылку на этот Хенрик Ню пост, меня глубоко соблазнил этот подход и вклад Аэфа выше. Но я думаю, что Арьян ван дер Гааг хорошо обосновал, что использование фейкеров — плохая замена надлежащим модульным тестам, проверке кода и TDD для предотвращения этих проблем. Спасибо всем за перспективы. - person Huw; 24.01.2016
comment
В какой-то момент в растущих проектах будет так много комбинаторной сложности, что у вас всегда будут пробелы в тестовом покрытии, даже если на бумаге оно составляет 100%. И, как я сказал в своем ответе, усилия, которые вы прилагаете для создания фабрик, обычно не требуют дополнительных затрат, потому что вы все равно можете это сделать, если хотите иметь возможность легко презентовать функции клиентам с некоторыми приличными, не персонализированными демонстрационными данными. - person aef; 24.01.2016

Тебе решать.

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

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

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

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

person coorasse    schedule 07.09.2017
comment
Мне особенно нравится этот ответ, изначально он дает мне достаточно случайности, чтобы я мог проверить свои первоначальные ожидания, но повторяемость, когда мне это нужно, спасибо @coorasse :) - person Huw; 01.10.2017

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

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

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

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

  • Делает отображаемые данные обычно более понятными для человека. При создании тестовых данных вручную люди склонны к всевозможным сокращениям, чтобы избежать утомительной работы.
  • Создание фабрик с помощью Faker для тестов одновременно предоставляет вам средства для создания хороших демонстрационных данных для презентаций.
  • Вы можете случайным образом обнаружить ошибки в крайних случаях при частом выполнении тестов.
person aef    schedule 23.01.2016
comment
Спасибо, Аеф, это хорошее резюме - можете ли вы ответить на вопрос Михала выше? Считаете ли вы, что это нарушает основу тестирования с известными значениями? Кроме того, когда вы говорите, что это дает хорошие тестовые данные для демо, я думаю, вы говорите о начальных файлах? Как это влияет на использование Factory для тестов? Используете ли вы фабрики в своем начальном файле? - person Huw; 23.01.2016
comment
С чем я очень часто сталкиваюсь при написании тестов, так это с тем, что зачастую не имеет значения, каково фактическое значение, а скорее то, что то же самое значение, которое было задано где-то, проходит через некоторый код и возвращается либо точно таким же, либо измененным в специфический способ. Здесь не имеет значения, является ли значение фиксированным или случайным. Данные Faker обеспечивают дальнейшее использование, поскольку они пытаются быть ближе к реальным данным, чтобы люди могли лучше понять их при отладке тестов. Когда содержание значения имеет значение для теста, обычно вы все равно не используете для него Faker. - person aef; 23.01.2016
comment
Обычно я определяю фабрики как (возможно, необязательную) часть моей основной кодовой базы, а не связываю ее с тестовым кодом. Затем я могу создавать демо-данные где угодно, будь то в начальном файле, в живой консоли или в любом другом контексте, который я пожелаю. - person aef; 23.01.2016