Рельсы:Интеграционное тестирование thinking_sphinx с cucumber и webrat - как мне проиндексировать транзакционные привязки?
-
23-08-2019 - |
Вопрос
Я хотел бы провести несколько интеграционных тестов Cucumber / webrat моих функций поиска, которые используют thinking_sphinx & sphinx
но проблема в том, что данные загружаются, а затем откатываются в транзакции во время обычного теста cucumber, поэтому у thinking_sphinx нет возможности их проиндексировать.В качестве альтернативы, есть ли способ отключить транзакции только для подмножества тестов?
Вы решили эту проблему?
[редактировать - пожалуйста, не предлагайте высмеивать результаты поиска.Я хочу, чтобы интеграционный тест проверял интеграцию всех функций, включая thinking_sphinx].
Решение
Я вижу проблему в этом утверждении:
данные загружаются, а затем откатываются в транзакции во время обычного теста cucumber, поэтому у thinking_sphinx нет возможности их проиндексировать
Этого может и не быть быстро чтобы thinking_sphinx индексировал результаты, но это, безусловно, возможно в рамках транзакции.Поскольку это единый интеграционный тест, а не выполняемый для каждого из ваших (многих) модульных тестов, я бы воспользовался снижением скорости.
Итак, теперь вам нужно выяснить, как запустить эту переиндексацию во время транзакции.
# somewhere in /features/support:
before('@reindexing') do
require 'Rake'
class MyModel
after_save :force_reindex!
def force_reindex!
# in case multiple runs of this block cause the hook
# to get added multiple times, let's check to make sure
# we haven't already reindexed for this save
return if @__reindexed
Rake["thinking_sphinx:rebuild"].execute
@__reindexed = true
end
end
end
after('@reindexing') do
class MyModel
def force_reindex!
# do nothing; the hook still gets called, but that's ok
end
end
end
В /features/integration.feature
(или что бы то ни было), у вас было бы
@reindexing
Feature: The whole shebang, altogether
Scenario: ...
Другие советы
Мы смогли заставить наши тесты cucumber успешно работать с thinking sphinx, используя плагин для очистки базы данных и изменив наши функции / support /env.rb следующим образом:
# Sets up the Rails environment for Cucumber
ENV["RAILS_ENV"] ||= "cucumber"
...
# http://github.com/bmabey/database_cleaner
require 'database_cleaner'
DatabaseCleaner.strategy = :truncation
Before do
DatabaseCleaner.clean
end
ThinkingSphinx::Configuration.instance.build
ThinkingSphinx::Configuration.instance.controller.start
at_exit do
ThinkingSphinx::Configuration.instance.controller.stop
end
ThinkingSphinx.deltas_enabled = true
ThinkingSphinx.updates_enabled = true
ThinkingSphinx.suppress_delta_output = true
# Re-generate the index before each Scenario
Before do
ThinkingSphinx::Configuration.instance.controller.index
end
Как вы можете видеть, мы также создали среду 'cucumber' и отдельную базу данных (чтобы запускать cucumber и спецификации одновременно без конфликтов) - поэтому вам нужно будет добавить запись 'cucumber:' в ваши database.yml и sphinx.yml, если вы хотите сделать это также.
Связанное предложение не сработает, потому что задача Rake вызывает индексатор в отдельном процессе и поэтому находится за пределами тестовой транзакции.
Я не знаю, есть ли какой-либо способ обойти это, кроме отключения тестовых транзакций, чтобы процесс индексирования sphinx мог видеть новые и обновленные записи.Чтобы сделать это, в вашем TestCase
, просто добавьте строку
self.use_transactional_fixtures = false
Имейте в виду, что вам нужно будет управлять очисткой любых данных в конце вашего теста.
Я бы не рекомендовал вам тестировать компонент, которым вы не владеете.Это будет довольно хрупкий тест, поскольку он будет зависеть от конкретного алгоритма ранжирования в этой конкретной версии sphinx, который может измениться позже и, таким образом, вернуть непредсказуемые результаты в будущем.
однако, если вы хотите это сделать, я бы предложил запустить отдельный индекс для тестирования либо с использованием тестовой базы данных через адаптер mysql, либо с помощью опции xmlpipe2 (очевидно, что xml2pipe позволяет вам изменять ваш набор данных без необходимости изменять параметры индексации в вашем файле sphinx).Вероятно, для этого потребуется сразу настроить тестовые данные по отдельности, удалить индексы (используя команды оболочки ruby), а затем принудительно выполнить переиндексацию (ожидая, пока общее количество проиндексированных документов не станет таким же, как известное количество записей базы данных) и запустить тесты с данными.
Я бы действительно предостерег от тестирования индекса, как я уже сказал, возможно, вам просто придется иметь дело с постоянно прерывающимся тестированием или медленным временем выполнения теста (в зависимости от объема данных, которые вы индексируете)
вероятно, это доставляет больше хлопот, чем того стоит, но вы пробовали включить дельта-индексы?
Я попробовал предложенное решение, но время ожидания sphinx истекло со следующей ошибкой.Я не думаю, что возможно переиндексировать sphinx, пока включены транзакционные приспособления.
ОШИБКА:индекс 'document_core':sql_query_pre[0]:Превышен тайм-аут ожидания блокировки;попробуйте перезапустить транзакцию
Другой пример использования тегов для разделения тестов cucumber thinking sphinx с использованием тегов cucumber здесь.