是否有推荐的Solr 3.6 JUnit测试方法?

时间:2012-05-29 09:51:46

标签: solr junit junit4

我想知道对于Solr 3.6的junit测试是否有任何最佳实践。我想自动测试Solr架构。前面的帖子提到了EmbeddedSolrServer。这个类似乎已经从1.4和3.6之间的任何版本中抛弃了。我将Spring 3.0.x和Maven用于该项目。 我考虑的选项是:

  1. 撰写Junit Test Runner
  2. 将jetty启动代码放在@Before或@BeforeClass方法
  3. 在maven中启动一个solr服务器(可能不是一个好的选择)
  4. 在spring test-context
  5. 中加入了一些代码

3 个答案:

答案 0 :(得分:2)

我使用类似于this页面上的内容来运行这些类型的测试,所有这些都是在Solr 3.4.0上使用EmbeddedSolrServer完成的。这是一种简单的方法,但是如果你想自动化Solr模式测试,那就足够了,并不难实现。
它基本归结为:
junitsolr-coreslf4j-simpleservlet-api的引用添加到您的pom.xml

    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.7</version>
        <type>jar</type>
        <scope>test</scope>
    </dependency>
    <!-- dependencies needed for Solr integration test-->
    <dependency>
        <groupId>org.apache.solr</groupId>
        <artifactId>solr-core</artifactId>
        <version>1.4.1</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-simple</artifactId>
        <version>1.6.1</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>2.5</version>
        <scope>test</scope>
    </dependency>

作为一个示例测试案例,他补充说:

import java.io.IOException;
import org.apache.solr.client.solrj.embedded.EmbeddedSolrServer;
import org.apache.solr.util.AbstractSolrTestCase;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrInputDocument;
import org.apache.solr.common.params.SolrParams;
import org.junit.Before;
import org.junit.Test;

import static org.junit.Assert.assertEquals;

public class SolrSearchConfigTest extends AbstractSolrTestCase {

    private SolrServer server;

    @Override
    public String getSchemaFile() {
        return "solr/conf/schema.xml";
    }

    @Override
    public String getSolrConfigFile() {
        return "solr/conf/solrconfig.xml";
    }

    @Before
    @Override
    public void setUp() throws Exception {
        super.setUp();
        server = new EmbeddedSolrServer(h.getCoreContainer(), h.getCore().getName());
    }

    @Test
    public void testThatNoResultsAreReturned() throws SolrServerException {
        SolrParams params = new SolrQuery("text that is not found");
        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"));
    }
}

编辑:我在很长一段时间内没有使用过Solr,但我认为这仍然是一个很好的起点。

答案 1 :(得分:1)

这是我的看法。它不扩展AbstractSolrTestCase,只是一个常规测试类。

import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;

import java.io.File;
import java.io.IOException;

import org.apache.commons.io.FileUtils;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.embedded.EmbeddedSolrServer;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.client.solrj.response.UpdateResponse;
import org.apache.solr.common.SolrInputDocument;
import org.apache.solr.core.CoreContainer;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class EmbeddedSolrServerTest {

    private static final int SUCCESS = 0;
    private final String indexLocation = "tomcat7/apps/apache-solr-3.6.0";
    private EmbeddedSolrServer server;

    @Before
    public void setUp() throws Exception {
        System.setProperty("solr.solr.home", indexLocation);
        CoreContainer coreContainer = new CoreContainer.Initializer().initialize();
        server = new EmbeddedSolrServer(coreContainer, "collection1");
    }

    @After
    public void tearDown() throws Exception {
        server.shutdown();
        removeIndexDirectory();
    }

    @Test
    public void testSolrSchema01() throws Exception {
        SolrInputDocument doc1 = new SolrInputDocument();
        doc1.addField("id", "123");
        doc1.addField("something_txt", "super wombat");
        UpdateResponse ur = server.add(doc1);
        assertThat(ur.getStatus(), is(SUCCESS));
        server.commit();

        QueryResponse response1 = server.query(new SolrQuery("*:*"));
        assertThat(response1.getResults().getNumFound(), is(1L));

        QueryResponse response2 = server.query(new SolrQuery("something_txt:*wombat*"));
        assertThat(response2.getResults().getNumFound(), is(1L));
    }

    private void removeIndexDirectory() throws IOException {
        File indexDir = new File(indexLocation, "data/index");
        FileUtils.deleteDirectory(indexDir);
    }
}

我的POM具有以下依赖关系:

<properties>
    <solr.version>3.6.0</solr.version>
    <httpcomponents.version>4.3.2</httpcomponents.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.apache.solr</groupId>
        <artifactId>solr-solrj</artifactId>
        <version>${solr.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.solr</groupId>
        <artifactId>solr-core</artifactId>
        <version>${solr.version}</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>${httpcomponents.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpmime</artifactId>
        <version>${httpcomponents.version}</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.6.1</version>
    </dependency>
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.4</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.11</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.hamcrest</groupId>
        <artifactId>hamcrest-library</artifactId>
        <version>1.3</version>
        <scope>test</scope>
    </dependency>
</dependencies>

我已经设置了一个单独的项目来保留我的所有Solr配置并对其进行测试。目录结构是:

solr-test
|--src
|  |--test
|--tomcat7
`  |--apps
      |--apache-solr-3.6.0
         |--conf
         |--data
            |--index

这似乎对我有用。此设置还允许您使用HttpSolrServer编写测试来测试远程服务器的架构。

另外,请注意测试中间的server.commit()电话。这需要在那里,否则Solr交易不完整,新文件将不可见。

答案 2 :(得分:0)

我正在使用https://github.com/moliware/travis-solr进行测试,也许它对你也很有用。