SolrをUnitTestで動かす
Solr4.4をJUnit4でテストする方法
たまには技術ネタ。個人の趣味でAWS関係ないネタだからこっちw
mavenあたりにsolr-test-frameworkをtestで追加して
↓こんなコードを書く
public class SolrTest extends AbstractSolrTestCase { private SolrServer server; @Override public String getSolrHome() { return System.getProperty("user.dir") + "/solr"; } @BeforeClass public static void beforeClass() throws Exception { initCore("solr/solrconfig.xml" , "solr/schema.xml" , "solr"); } @AfterClass public static void tearDownClass() throws Exception { deleteCore(); } @Before @Override public void setUp() throws Exception { super.setUp(); server = new EmbeddedSolrServer(h.getCoreContainer(), h.getCore().getName()); } @After public void tearDown2() throws Exception { //server.shutdown(); server.deleteByQuery("*:*"); server.commit(); super.tearDown(); } @Test public void testThatNoResultsAreReturned() throws SolrServerException { SolrParams params = new SolrQuery("*:*"); QueryResponse response = server.query(params); assertEquals(0L, response.getResults().getNumFound()); } @Test public void testThatDocumentIsFound() throws SolrServerException, IOException { SolrInputDocument document = new SolrInputDocument(); document.addField("id", "1"); document.addField("name", "my name"); server.add(document); server.commit(); SolrParams params = new SolrQuery("name"); QueryResponse response = server.query(params); assertEquals(1L, response.getResults().getNumFound()); assertEquals("1", response.getResults().get(0).get("id")); } }
動きを見てると、
initCoreでテンポラリのcollectionを作ってそこにindexを新規に作成
deleteCoreでそのテンポラリのcollectionを丸ごと削除
んで、継承元のクラスでテストの順番をランダムに走らせるのでserver.deleteByQuery("*:*");が無いと結果が毎回変わるぞと。
テンポラリのディレクトリをramディスクにすれば爆速でテストが動きそうだなぁ〜って思った。
つーことでこのテストはDBアクセスしてるテストより数段遅いかもしれない
ググりにググった数日間
サンプル見つけたけどそのままだとバージョン違いで動かないとかw
結局ソース読んでたしw
って事で、このコードも4.5とか5あたりになるとまた動かなくなりそうな悪寒
でも、複数collectionを使う方法は見つけられず。
まぁとりあえず使わないから良いかな
複数collectionに対応しようと、本当はSolrをJettyで動かしてそこにアクセスするテストケースも作ったんだけど似てるしまぁ良いかw