Solr: Writing Solr Test Case

It is important to write test cases to automate tests - even your company doesn't require to check in test cases, as it can save you a lot of time to rerun manual tests whenever you change something, also it's very common that you make some change, you think it is safe, so no need to test it, but in fact it breaks something. If you have automatic tests cases, you just need run your tests before check in your code.

This is especially important when you are changing Solr code, or extending Solr, as it's very time consuming to compile, package, deploy your change to server, and run manual tests.


We can use the test framework Solr provides to run tests in embedded jetty, all we need do is to write some test code, and run it every time we make some change or before we check in our code.


SolrTestCaseJ4 has many subclasses, you can pick one that best suits your need.

In our example, we will use SolrExampleTests to test our ExtNameExtractorProcessorFactory, which will guess file type from filepath, and store in a field. 
Implementation
The test case code is like below: you can review the complete code at Github.
public class EmbededTestBase extends SolrExampleTests {
  @BeforeClass
  public static void beforeClass() throws Exception {
    String solrHome = "C:/jeffery/test-environment/solr-home";
    initCore("solrconfig.xml", "schema.xml", solrHome);
  }
}
public class ExtNameExtractorProcessorFactoryTest extends EmbededTestBase {
  private String chain = "extNameExtractorChain";
  
  @Test
  public void tesExtNameExtractorChain() throws Exception {
    SolrCore core = h.getCore();
    UpdateRequestProcessorChain chained = core
        .getUpdateProcessingChain(this.chain);
    ExtNameExtractorProcessorFactory factory = ((ExtNameExtractorProcessorFactory) chained
        .getFactories()[0]);
    factory.setEnabled(true);
    assertNotNull(chained);
    
    addDoc(adoc("id", "id123", "url", "c:\\dir\\abc.txt"));
    addDoc(commit());
    
    SolrQuery query = new SolrQuery("id:id123");
    SolrServer server = getSolrServer();
    QueryResponse rsp = server.query(query);
    
    NamedList<Object> namedList = rsp.getResponse();
    SolrDocumentList docList = (SolrDocumentList) namedList.get("response");
    
    String extName = (String) docList.get(0).getFieldValue("ext_name");
    assertEquals("txt", extName);
    
    assertNumFound("ext_name:txt", 1);
    // or assertQ("Verify one ext_name:txt", req("ext_name:txt"),
    // "//result[@numFound=1]");
    
    server.deleteByQuery("*:*");// delete everything!
    server.commit();
    assertNumFound("*:*", 0); // make sure it got in
    
    addDoc(adoc("id", "id234", "url", "efg.ppt"));
    addDoc(commit());
    
    assertNumFound("ext_name:ppt", 1);
    // assertQ("Verify one ext_name:ppt", req("ext_name:ppt"),
    // "//result[@numFound=1]");
    
    factory.setEnabled(false);
  }
  
  private void addDoc(String doc) throws Exception {
    Map<String,String[]> params = new HashMap<String,String[]>();
    MultiMapSolrParams mmparams = new MultiMapSolrParams(params);
    params.put(UpdateParams.UPDATE_CHAIN, new String[] {chain});
    SolrQueryRequestBase req = new SolrQueryRequestBase(h.getCore(),
        (SolrParams) mmparams) {};
    
    UpdateRequestHandler handler = new UpdateRequestHandler();
    handler.init(null);
    ArrayList<ContentStream> streams = new ArrayList<ContentStream>(2);
    streams.add(new ContentStreamBase.StringStream(doc));
    req.setContentStreams(streams);
    handler.handleRequestBody(req, new SolrQueryResponse());
    req.close();
  }
}
Test RequestHandler
public void testRequestHandler() throws Exception {
 clearIndex();

 CVAsyncXmlUpdateRequestHandler asyncXmlHandler = new CVAsyncXmlUpdateRequestHandler();
 NamedList<Object> args = new NamedList<Object>();
 args.add("unique_field_name", "contentid");
 asyncXmlHandler.init(args);

 SolrQueryRequest req;
 req = req("param1", "param1Value");

 String xmlDoc = adoc("field1", "f1value", "commit", "true");
 ArrayList<ContentStream> streams = new ArrayList<ContentStream>();
 streams.add(new ContentStreamBase.StringStream(xmlDoc));
 ((LocalSolrQueryRequest) req).setContentStreams(streams);
 SolrQueryResponse rsp = new SolrQueryResponse();

 asyncXmlHandler.handleRequestBody(req, rsp);
 req.close();

 assertNumFound("field1:f1value", 1);
 clearIndex();
}
Post a Comment

Labels

Java (159) Lucene-Solr (110) All (58) Interview (58) J2SE (53) Algorithm (41) Soft Skills (36) Eclipse (34) Code Example (31) Linux (25) JavaScript (23) Spring (22) Windows (22) Web Development (20) Nutch2 (18) Tools (18) Bugs (17) Debug (15) Defects (14) Text Mining (14) J2EE (13) Network (13) PowerShell (11) Chrome (9) Design (9) How to (9) Learning code (9) Performance (9) UIMA (9) html (9) Continuous Integration (8) Dynamic Languages (8) Http Client (8) Maven (8) Security (8) Trouble Shooting (8) bat (8) blogger (8) Big Data (7) Google (7) Guava (7) JSON (7) Problem Solving (7) ANT (6) Coding Skills (6) Database (6) Scala (6) Shell (6) css (6) Algorithm Series (5) Cache (5) IDE (5) Lesson Learned (5) Programmer Skills (5) System Design (5) Tips (5) adsense (5) xml (5) AIX (4) Code Quality (4) GAE (4) Git (4) Good Programming Practices (4) Jackson (4) Memory Usage (4) Miscs (4) OpenNLP (4) Project Managment (4) Python (4) Spark (4) Testing (4) ads (4) regular-expression (4) Android (3) Apache Spark (3) Become a Better You (3) Concurrency (3) Eclipse RCP (3) English (3) Happy Hacking (3) IBM (3) J2SE Knowledge Series (3) JAX-RS (3) Jetty (3) Restful Web Service (3) Script (3) regex (3) seo (3) .Net (2) Android Studio (2) Apache (2) Apache Procrun (2) Architecture (2) Batch (2) Bit Operation (2) Build (2) Building Scalable Web Sites (2) C# (2) C/C++ (2) CSV (2) Career (2) Cassandra (2) Distributed (2) Fiddler (2) Firefox (2) Google Drive (2) Gson (2) Html Parser (2) Http (2) Image Tools (2) JQuery (2) Jersey (2) LDAP (2) Life (2) Logging (2) Software Issues (2) Storage (2) Text Search (2) xml parser (2) AOP (1) Application Design (1) AspectJ (1) Chrome DevTools (1) Cloud (1) Codility (1) Data Mining (1) Data Structure (1) ExceptionUtils (1) Exif (1) Feature Request (1) FindBugs (1) Greasemonkey (1) HTML5 (1) Httpd (1) I18N (1) IBM Java Thread Dump Analyzer (1) JDK Source Code (1) JDK8 (1) JMX (1) Lazy Developer (1) Mac (1) Machine Learning (1) Mobile (1) My Plan for 2010 (1) Netbeans (1) Notes (1) Operating System (1) Perl (1) Problems (1) Product Architecture (1) Programming Life (1) Quality (1) Redhat (1) Redis (1) Review (1) RxJava (1) Solutions logs (1) Team Management (1) Thread Dump Analyzer (1) Troubleshooting (1) Visualization (1) boilerpipe (1) htm (1) ongoing (1) procrun (1) rss (1)

Popular Posts