【问题标题】:Rails: Integration testing thinking_sphinx with cucumber and webrat - how do I index transactional fixtures?Rails:集成测试thinking_sphinx 与黄瓜和webrat - 我如何索引事务夹具?
【发布时间】:2009-05-20 15:46:58
【问题描述】:

我想对使用 thinking_sphinx & sphinx 的搜索功能进行一些 Cucumber/webrat 集成测试,但问题是在典型的 Cucumber 测试期间数据已加载然后在事务中回滚,因此没有办法让think_sphinx 对其进行索引。或者,有没有办法只为一部分测试关闭事务?

你解决了这个问题吗?

[编辑 - 请不要建议模拟搜索结果。我想要集成测试来测试所有功能的集成,包括thinking_sphinx]。

【问题讨论】:

    标签: ruby-on-rails cucumber thinking-sphinx webrat


    【解决方案1】:

    我发现问题出在这句话中:

    在典型的黄瓜测试期间,数据被加载,然后在事务中回滚,因此 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: ...
    

    【讨论】:

    • 哦,我的代码中有一个错误! before('@reindexing') 添加了重新索引,但是没有对应的 after 删除它!如果您运行整个测试套件(集成 + 单元),这将显着地减慢您的速度。
    • 这没什么大不了的。我使用标签提取了 thinking_sphinx 依赖的测试并单独运行它们。
    【解决方案2】:

    通过使用数据库清理插件并修改我们的 features/support/env.rb,我们能够让我们的黄瓜测试成功地与 Think sphinx 一起工作:

    # 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
    

    如您所见,我们还创建了一个“黄瓜”环境和一个单独的数据库(为了同时运行黄瓜和规格而不会发生冲突) - 所以您需要在您的 database.yml 中添加一个“黄瓜:”条目如果你也想这样做,还有 sphinx.yml。

    【讨论】:

      【解决方案3】:

      链接的建议不起作用,因为 Rake 任务在单独的进程中调用索引器,因此在测试事务之外。

      我不知道有什么办法可以解决这个问题,除了关闭测试事务以便 sphinx 索引进程可以看到新的和更新的记录。为此,请在您的 TestCase 中添加以下行

      self.use_transactional_fixtures = false
      

      请记住,您需要在测试结束时清理所有数据。

      【讨论】:

        【解决方案4】:

        我不建议您测试不属于您的组件。这将是一个非常脆弱的测试,因为它取决于特定版本的 sphinx 中的特定排名算法,该算法可能会在以后发生变化,从而在未来返回不可预测的结果。

        如果你想这样做,我建议运行一个单独的索引来进行测试,或者通过 mysql 适配器或 xmlpipe2 选项使用测试数据库(xml2pipe 显然允许你更改数据集,而无需更改索引选项狮身人面像文件)。这可能需要您一次单独设置测试数据,删除索引(使用 ruby​​ shell 命令)然后强制重新索引(等待索引文档的总数与已知的数据库记录数量相同) 并针对数据运行测试。

        我真的会提醒不要像我说的那样测试索引,您可能会发现自己不得不处理不断中断的测试或缓慢的测试运行时间(取决于您要编制索引的数据量)

        【讨论】:

          【解决方案5】:

          这可能比它的价值更麻烦,但是您是否尝试过打开增量索引?

          【讨论】:

            【解决方案6】:

            我尝试了建议的解决方案,但 sphinx 超时并出现以下错误。我认为在启用事务装置时无法重新索引 sphinx。

            错误:索引'document_core':sql_query_pre[0]:超过锁定等待超时;尝试重启事务

            【讨论】:

              【解决方案7】:

              另一个使用标签分离黄瓜思维狮身人面像测试的例子使用黄瓜标签here

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2014-06-13
                • 2010-11-29
                • 1970-01-01
                • 2010-11-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多