测试Solr分布式组件

贪吃

我已经开发了一个自定义的Solr搜索组件,需要为其编写单元测试。正如我在其他Solr组件的代码中看到的那样,在Solr中编写单元测试是通过扩展SolrTestCaseJ4类完成的。不幸的是,SolrTestCaseJ4不处理分布式设置中的测试,而我的自定义组件仅在这样的设置中起作用。实际上,当我不在分布式设置中时,我的组件会故意返回空响应。

我正在尝试一种使用BaseDistributedSearchTestCase类测试组件的方法。BaseDistributedSearchTestCase的问题在于它的工作方式无法解决我的问题。使用BaseDistributedSearchTestCase时,您定义了一个测试方法,您可以在其中索引所有文档并执行一些查询。运行测试会在分布式设置和单个核心设置上执行请求。然后,它比较每个设置的响应以验证它们的相等性。我无法在该流程中明确声明任何内容。

如何编写Solr分布式组件的单元测试?

西蒙妮·贾尼(Simone Gianni)

在Solr 4.7中添加了一个类MiniSolrCloudCluster,该类实际上在本地“部署”(如果您只想在ram或临时目录上使用ram)一个完整的solr集群,其中包含zookeeper,碎片和所有内容,用于测试。

您可以在这里找到吉拉:https : //issues.apache.org/jira/browse/SOLR-5865

我已经成功地使用它对Solr分布式组件执行了测试,以Solr测试为例,如下所示:

    私有静态MiniSolrCloudCluster miniCluster;
    私有静态CloudSolrServer cloudSolrServer; 

    @BeforeClass
    公共静态无效setup()引发异常{ 
        miniCluster = new MiniSolrCloudCluster(2,null,new File(“ src / main / solr / solr.xml”),null,null); 
        uploadConfigToZk(“ src / main / solr / content / conf /”,“内容”); 

        //覆盖solrconfig中的设置包括
        System.setProperty(“ solr.tests.maxBufferedDocs”,“ 100000”); 
        System.setProperty(“ solr.tests.maxIndexingThreads”,“ -1”); 
        System.setProperty(“ solr.tests.ramBufferSizeMB”,“ 100”); 
        System.setProperty(“ solr.tests.mergeScheduler”,“ org.apache.lucene.index.ConcurrentMergeScheduler”); 
        System.setProperty(“ solr.directoryFactory”,“ solr.RAMDirectoryFactory”);        

        cloudSolrServer = new CloudSolrServer(miniCluster.getZkServer()。getZkAddress(),false); 
        cloudSolrServer.setRequestWriter(new RequestWriter()); 
        cloudSolrServer.setParser(new XMLResponseParser()); 
        cloudSolrServer.setDefaultCollection(“ content”); 
        cloudSolrServer.setParallelUpdates(false); 
        cloudSolrServer.connect(); 

        createCollection(cloudSolrServer,“ content”,2,1,“ content”); 

    }

    受保护的静态void uploadConfigToZk(String configDir,String configName)引发异常{ 
        SolrZkClient zkClient = null; 
            zkClient = new SolrZkClient(miniCluster.getZkServer()。getZkAddress(),10000,45000,null); 
            uploadConfigFileToZk(zkClient,configName,“ solrconfig.xml”,新文件(configDir,“ solrconfig.xml”)); 
            uploadConfigFileToZk(zkClient,configName,“ schema.xml”,新文件(configDir,“ schema.xml”)); 
            uploadConfigFileToZk(zkClient,configName,“ stopwords_en.txt”,新文件(configDir,“ stopwords_en.txt”)); 
            uploadConfigFileToZk(zkClient,configName,“ stopwords_it.txt”,新File(configDir,“ stopwords_it。

            System.out.println(zkClient.getChildren(ZkController.CONFIGS_ZKNODE +“ /” + configName,null,true)); 
        }最后{
            如果(zkClient!= null)
                zkClient.close(); 
        } 
    }

    受保护的静态void uploadConfigFileToZk(SolrZkClient zkClient,字符串configName,字符串nameInZk,文件文件)引发异常{
        zkClient.makePath(ZkController.CONFIGS_ZKNODE +“ /” + configName +“ /” + nameInZk,file,false,true);
    } 

    @AfterClass
    公共静态void shutDown()引发异常{ 
        miniCluster.shutdown(); 
    }

    受保护的静态NamedList createCollection(CloudSolrServer服务器,字符串名称,int numShards,int ReplicationFactor,字符串configName)引发异常{ 
        ModifiableSolrParams modParams = new ModifiableSolrParams(); 
        modParams.set(CoreAdminParams.ACTION,CollectionAction.CREATE.name()); 
        modParams.set(“ name”,name); 
        modParams.set(“ numShards”,numShards); 
        modParams.set(“ replicationFactor”,ReplicationFactor);
        modParams.set(“ collection.configName”,configName); 
        QueryRequest请求=新的QueryRequest(modParams); 
        request.setPath(“ / admin / collections”); 
        返回server.request(request); 
    } 

    @Test 
    public void test()抛出异常{ 
      //您是否将cloudSolrServer用作常规solrServer填充在这里
    }

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章