Генерация случайных, но статических данных теста

1

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

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

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

Является ли это хорошей стратегией для тестовых данных?

Если это так, то я знаю, как достичь обеих этих целей самостоятельно. Для статических, но неслучайных данных я просто вводил что-то произвольное, например, foo. Для чего-то случайного, но не статического, я просто использую apache random utils, например randomString(5). Как я могу получить оба?

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

TL; DR: Как я могу указать тип данных, которые я хочу сгенерировать, без рандомизированных сгенерированных данных?

Теги:
testing

3 ответа

2

Используйте случайное с постоянным семенем. Вы можете использовать конструктор Random (long seed) для него.

Метод RandomStringUtils.random() может принимать источник Random, который вы могли бы создать с постоянным семенем, как описано.

Использование постоянного семени очень полезно для того, чтобы сделать эксперименты воспроизводимыми - и использование их - очень хорошая практика, ИМО.

  • 0
    Это звучит великолепно. Если бы я подозревал, что мои данные вызвали произвольное выполнение тестов, я также мог бы временно временно изменить начальное значение и снова переключить его, чтобы получить разные наборы согласованных данных. Имеет ли значение, что я выбираю для семян? 1L сделает? Есть ли какой-нибудь способ выбрать начальное число, которое не приводит к дублированию или иным образом гарантирует, что дубликаты не возникнут (должна ли быть уникальность критерием)?
  • 0
    @ RupertMadden-Abbott На самом деле не имеет значения, какое семя вы выбрали, разные семена будут давать разные псевдослучайные числа, но не имеет значения, какое семя используется.
1

То, что вы описываете, - это тестирование на основе свойств - самым известным примером является быстрый выбор Haskell.

http://www.haskell.org/haskellwiki/Introduction_to_QuickCheck1

Было несколько портов java, таких как

В философии Quickcheck подчеркивается использование случайных данных, но большинство (все?) Портов java позволяют устанавливать фиксированное семя, чтобы сгенерированные значения повторялись.

Я никогда не сталкивался с этим методом, но я бы надеялся, что это сделает ваши тесты более читабельными (а не менее читаемыми, как предлагает piotrek), отделив значения от тестов.

Если знание значений важно для понимания поведения теста /SUT, это неправильный подход.

1

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню