Действительно ли это - плохая практика к случайным образом - генерируют данные тестирования?

Разница в производительности не может быть IN по сравнению с = ANY, потому что PostgreSQL преобразует IN в = ANY во время оптимизации запросов.

Разница должна быть подвыбор. Если вы используете unnest, PostgreSQL всегда будет оценивать, что подзапрос возвращает 100 строк, потому что именно так определено unnest.

Должно быть, оценка 100 как-то дает другой план выполнения, который работает лучше.

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

6
задан Franklin Yu 10 September 2016 в 06:37
поделиться

11 ответов

Это - ответ на Вашу вторую точку:

(2) Я использую тестирование для как форма документации для кода. Если я трудно кодировал значения приспособления, трудно показать то, что конкретный тест пытается продемонстрировать.

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

Из-за этого многие пользователи RSpec прекратили использовать приспособления в целом. Вместо этого создайте необходимые объекты в самом примере спецификации.

describe Item, "#most_expensive" do
  it 'should return the most expensive item' do
    items = [
      Item.create!(:price => 100),
      Item.create!(:price => 50)
    ]

    Item.most_expensive.price.should == 100
  end
end

Если Ваш конец с большим количеством шаблона кодирует для создания объекта, необходимо смотреть на некоторые из многих тестовых библиотек фабрики объекта, таких как factory_girl, Машинист или FixtureReplacement.

5
ответ дан 8 December 2019 в 03:28
поделиться

Я удивлен никто в этой теме или в той Jason Baker, связанный с упомянутым Тестированием Монте-Карло. Это - единственное время, я экстенсивно использовал рандомизированные тестовые исходные данные. Однако было очень важно сделать тест восстанавливаемым при наличии постоянного семени для генератора случайных чисел для каждого тестового сценария.

14
ответ дан 8 December 2019 в 03:28
поделиться

Мы думали об этом много на недавнем моем проекте. В конце мы обосновались на двух точках:

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

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

5
ответ дан 8 December 2019 в 03:28
поделиться

Большая хорошая информация была уже размещена, но видит также: Тестирование Пуха. Word на улице - то, что Microsoft использует этот подход к большому количеству их проектов.

2
ответ дан 8 December 2019 в 03:28
поделиться

Мой опыт с тестированием главным образом с простыми программами, записанными в C/Python/Java, таким образом, я не уверен, совершенно ли это применимо, но каждый раз, когда у меня есть программа, которая может принять любой вид ввода данных пользователем, я всегда включаю тест со случайными входными данными или по крайней мере входными данными, сгенерированными компьютером непредсказуемым способом, потому что Вы никогда не можете делать предположения о том, что введут пользователи. Или, ну, в общем, Вы можете, но если Вы делаете затем некоторого хакера, который не делает то предположение, может найти ошибку, которую Вы полностью пропустили. Сгенерированный машиной вход является лучшим (только?) путь я знаю о не допустить субъективную систематическую ошибку полностью в процедуры тестирования. Конечно, для репродуцирования проваленного теста, необходимо сделать что-то как сохранение тестового входа в файл или распечатывание он (если это - текст) прежде, чем запустить тест.

1
ответ дан 8 December 2019 в 03:28
поделиться

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

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

Вы затем переключаетесь от случайного тестирования до статистического тестирования.

if (a > 0)
    // Do Foo
else (if b < 0)
    // Do Bar
else
    // Do Foobar

Если Вы выбираете a и b случайным образом в int диапазон, Вы тренируетесь Foo 50% времени, Bar 25% времени и Foobar 25% времени. Вероятно, что Вы найдете больше ошибок в Foo чем в Bar или Foobar.

Если Вы выбираете a таким образом, что это - отрицательный 66,66% времени, Bar и Foobar будьте осуществлены больше, чем с Вашим первым распределением. Действительно три ответвления осуществлены каждый 33,33% времени.

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

1
ответ дан 8 December 2019 в 03:28
поделиться

Я предложил бы взглянуть на Машиниста:

http://github.com/notahat/machinist/tree/master

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

Вы могли сделать что-то подобное отбором генератор случайных чисел последовательно.

1
ответ дан 8 December 2019 в 03:28
поделиться
0
ответ дан 8 December 2019 в 03:28
поделиться

Одна проблема со случайным образом сгенерированными тестовыми сценариями состоит в том, что проверка ответа должна быть вычислена кодом, и Вы не можете быть уверены, что это не имеет ошибок :)

0
ответ дан 8 December 2019 в 03:28
поделиться

Эффективность такого тестирования в основном зависит от качества генератора случайных чисел, который Вы используете и от того, насколько корректный код, который переводит вывод RNG в данные тестирования.

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

Как Вы протестируете на это?

0
ответ дан 8 December 2019 в 03:28
поделиться

Проблема со случайностью в тестовых сценариях состоит в том, что вывод, ну, в общем, случаен.

Идея позади тестов (особенно регрессионные тесты) состоит в том, чтобы проверить, что ничто не повреждается.

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

Другими словами, если у Вас есть тест, который использует случайные данные, сгенерированные на лету, я думаю, что это - плохая идея. Однако, при использовании ряда случайных данных КОТОРЫЕ ВЫ ЗАТЕМ ХРАНИТЕ И ПОВТОРНОЕ ИСПОЛЬЗОВАНИЕ, это может быть хорошей идеей. Это могло принять форму ряда семян для генератора случайных чисел.

Это хранение сгенерированных данных позволяет Вам находить 'корректный' ответ на эти данные.

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

0
ответ дан 8 December 2019 в 03:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: