Разница в производительности не может быть IN
по сравнению с = ANY
, потому что PostgreSQL преобразует IN
в = ANY
во время оптимизации запросов.
Разница должна быть подвыбор. Если вы используете unnest
, PostgreSQL всегда будет оценивать, что подзапрос возвращает 100 строк, потому что именно так определено unnest
.
Должно быть, оценка 100 как-то дает другой план выполнения, который работает лучше.
Нам нужны полные планы выполнения, чтобы сказать что-то менее неопределенное.
Это - ответ на Вашу вторую точку:
(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.
Я удивлен никто в этой теме или в той Jason Baker, связанный с упомянутым Тестированием Монте-Карло. Это - единственное время, я экстенсивно использовал рандомизированные тестовые исходные данные. Однако было очень важно сделать тест восстанавливаемым при наличии постоянного семени для генератора случайных чисел для каждого тестового сценария.
Мы думали об этом много на недавнем моем проекте. В конце мы обосновались на двух точках:
В сумме случайность может часто быть большей проблемой, чем это стоит. Рассмотрите тщательно, собираетесь ли Вы быть использованием его правильно, прежде чем Вы нажмете на курок. Мы в конечном счете решили, что случайные тестовые сценарии были плохой идеей в целом и использоваться экономно, если вообще.
Большая хорошая информация была уже размещена, но видит также: Тестирование Пуха. Word на улице - то, что Microsoft использует этот подход к большому количеству их проектов.
Мой опыт с тестированием главным образом с простыми программами, записанными в C/Python/Java, таким образом, я не уверен, совершенно ли это применимо, но каждый раз, когда у меня есть программа, которая может принять любой вид ввода данных пользователем, я всегда включаю тест со случайными входными данными или по крайней мере входными данными, сгенерированными компьютером непредсказуемым способом, потому что Вы никогда не можете делать предположения о том, что введут пользователи. Или, ну, в общем, Вы можете, но если Вы делаете затем некоторого хакера, который не делает то предположение, может найти ошибку, которую Вы полностью пропустили. Сгенерированный машиной вход является лучшим (только?) путь я знаю о не допустить субъективную систематическую ошибку полностью в процедуры тестирования. Конечно, для репродуцирования проваленного теста, необходимо сделать что-то как сохранение тестового входа в файл или распечатывание он (если это - текст) прежде, чем запустить тест.
Случайное тестирование является плохой практикой длинное, поскольку у Вас нет решения для проблемы оракула, т.е. определения, которое является ожидаемым результатом Вашего программного обеспечения, учитывая его вход.
При решении проблемы оракула можно получить один шаг вперед, чем простое случайное входное поколение. Можно выбрать входные дистрибутивы, таким образом, что определенные части программного обеспечения осуществлены больше, чем со случайным простым.
Вы затем переключаетесь от случайного тестирования до статистического тестирования.
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% времени.
Конечно, если Ваш наблюдаемый результат отличается, чем Ваш ожидаемый результат, необходимо зарегистрировать все, что может быть полезно для репродуцирования ошибки.
Я предложил бы взглянуть на Машиниста:
Машинист генерирует данные для Вас, но это повторяемо, таким образом, каждый тестовый прогон имеет те же случайные данные.
Вы могли сделать что-то подобное отбором генератор случайных чисел последовательно.
Вы могли бы также видеть эту тему: Тестирование со случайными лучшими практиками исходных данных.
Одна проблема со случайным образом сгенерированными тестовыми сценариями состоит в том, что проверка ответа должна быть вычислена кодом, и Вы не можете быть уверены, что это не имеет ошибок :)
Эффективность такого тестирования в основном зависит от качества генератора случайных чисел, который Вы используете и от того, насколько корректный код, который переводит вывод RNG в данные тестирования.
Если RNG никогда не произведет значения, заставляющие Ваш код войти в некоторое условие пограничного случая, то Вам не покроют этот случай. Если Ваш код, который переводит вывод RNG во вход кода, который Вы тестируете, является дефектным, это может произойти, что даже с хорошим генератором Вы все еще не поражаете все пограничные случаи.
Как Вы протестируете на это?
Проблема со случайностью в тестовых сценариях состоит в том, что вывод, ну, в общем, случаен.
Идея позади тестов (особенно регрессионные тесты) состоит в том, чтобы проверить, что ничто не повреждается.
При нахождении чего-то, что повреждается, необходимо включать тот тест каждый раз с тех пор, иначе у Вас не будет непротиворечивого множества тестов. Кроме того, если Вы запускаете случайный тест, который работает, затем необходимо включать тот тест, потому что его возможное, что можно взломать код так, чтобы тест перестал работать.
Другими словами, если у Вас есть тест, который использует случайные данные, сгенерированные на лету, я думаю, что это - плохая идея. Однако, при использовании ряда случайных данных КОТОРЫЕ ВЫ ЗАТЕМ ХРАНИТЕ И ПОВТОРНОЕ ИСПОЛЬЗОВАНИЕ, это может быть хорошей идеей. Это могло принять форму ряда семян для генератора случайных чисел.
Это хранение сгенерированных данных позволяет Вам находить 'корректный' ответ на эти данные.
Так, я рекомендовал бы использовать случайные данные для исследования системы, но использование определило данные в тестах (который, возможно, первоначально был случайным образом сгенерированными данными),