makotan _at_ gmail dot com

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