Rails: интеграционное тестирование think_sphinx с огурцом и webrat - как мне индексировать транзакционные фикстуры? - PullRequest
2 голосов
/ 20 мая 2009

Я хотел бы провести несколько интеграционных тестов Cucumber / webrat для моих функций поиска, использующих thinking_sphinx & sphinx, но проблема в том, что данные загружаются и затем откатываются в транзакции во время типичного теста на огурец, поэтому нет никакого способа для think_sphinx, чтобы проиндексировать его. В качестве альтернативы, есть ли способ отключить транзакции только для подмножества тестов?

Вы решили эту проблему?

[править - не предлагайте выводить результаты поиска. Я хочу, чтобы интеграционный тест проверял интеграцию всех функций, включая think_sphinx].

Ответы [ 7 ]

2 голосов
/ 30 июня 2009

Мы смогли заставить наши тесты на огурец успешно работать с мыслящим сфинксом, используя плагин для очистки базы данных и изменив наши функции / 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 и specs без конфликтов) - поэтому вам нужно будет добавить запись 'cucumber:' в ваш файл database.yml. и sphinx.yml, если вы хотите это сделать.

2 голосов
/ 27 мая 2009

Я вижу проблему в этом утверждении:

данные загружаются, а затем откатываются в транзакции во время типичного теста на огурец, поэтому для think_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: ...
1 голос
/ 12 августа 2009

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

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

self.use_transactional_fixtures = false

Помните, что вам нужно будет очистить все данные в конце теста.

0 голосов
/ 04 сентября 2009

Другой пример использования тегов для разделения тестов сфинкса на мышление огурца с использованием тегов огурца здесь .

0 голосов
/ 11 июня 2009

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

ОШИБКА: индекс 'document_core': sql_query_pre [0]: превышено время ожидания блокировки; попробуйте перезапустить транзакцию

0 голосов
/ 27 мая 2009

это, вероятно, больше хлопот, чем стоит, но вы пытались включить дельта-индексы?

0 голосов
/ 26 мая 2009

Я бы не рекомендовал вам тестировать компонент, который вам не принадлежит. Это будет довольно хрупкий тест, поскольку он будет зависеть от конкретного алгоритма ранжирования в той конкретной версии сфинкса, который может измениться позже и, таким образом, вернуть непредсказуемые результаты в будущем.

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

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

...