Рельсы:Интеграционное тестирование thinking_sphinx с cucumber и webrat - как мне проиндексировать транзакционные привязки?

StackOverflow https://stackoverflow.com/questions/888744

Вопрос

Я хотел бы провести несколько интеграционных тестов 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 здесь.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top