2

我想知道 Solr 3.6 的 junit 测试是否有任何最佳实践。我想自动化 Solr 模式的测试。之前的帖子提到了 EmbeddedSolrServer。此类似乎已从 1.4 到 3.6 之间的任何版本中被放弃。我在项目中使用 Spring 3.0.x 和 Maven。我考虑的选项是:

  1. 编写一个 Junit 测试运行器
  2. 将码头启动代码放在@Before 或@BeforeClass 方法中
  3. 在 maven 中启动一个 solr 服务器(可能不是一个好的选择)
  4. 在 spring 测试上下文中添加一些代码
4

3 回答 3

2

我使用了类似于页面上的内容来运行这些类型的测试,所有这些都是使用 Solr 3.4.0 上的 EmbeddedSolrServer 完成的。这是一种简单的方法,但如果您想自动化 Solr 模式测试,这可能就足够了,而且实现起来并不难。
它基本上归结为:
添加对junitsolr-core和您的slf4j-simple引用: servlet-apipom.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,但我认为这仍然是一个很好的起点。

于 2012-05-29T21:05:27.480 回答
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 事务不完整并且新文档将不可见。

于 2014-04-16T07:36:02.143 回答
0

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

于 2012-10-15T19:14:54.607 回答