我已经开发了一个自定义的Solr搜索组件,需要为其编写单元测试。正如我在其他Solr组件的代码中看到的那样,在Solr中编写单元测试是通过扩展SolrTestCaseJ4类完成的。不幸的是,SolrTestCaseJ4不处理分布式设置中的测试,而我的自定义组件仅在这样的设置中起作用。实际上,当我不在分布式设置中时,我的组件会故意返回空响应。
我正在尝试一种使用BaseDistributedSearchTestCase类测试组件的方法。BaseDistributedSearchTestCase的问题在于它的工作方式无法解决我的问题。使用BaseDistributedSearchTestCase时,您定义了一个测试方法,您可以在其中索引所有文档并执行一些查询。运行测试会在分布式设置和单个核心设置上执行请求。然后,它比较每个设置的响应以验证它们的相等性。我无法在该流程中明确声明任何内容。
如何编写Solr分布式组件的单元测试?
在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] 删除。
我来说两句