solr test development

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

solr test development

Yonik Seeley-2-2
Maintaining and fixing tests in solr has been a pain - I think mostly
because in the past we probably reviewed core code well, but perhaps
not the test code.  For test code, we should really strive for
conciseness and maintainability.  Most things should be tested through
higher level requests, and not by poking around in the guts (which
makes it very hard to change how something is implemented).

I've been rewriting some broken tests... for example replacing this:

  @Test
  public void testBasics() throws Exception {
    SolrCore core = h.getCore();
    SearchComponent tvComp = core.getSearchComponent("tvComponent");
    assertTrue("tvComp is null and it shouldn't be", tvComp != null);
    ModifiableSolrParams params = new ModifiableSolrParams();
    params.add(CommonParams.Q, "id:0");
    params.add(CommonParams.QT, "tvrh");
    params.add(TermVectorParams.TF, "true");
    params.add(TermVectorComponent.COMPONENT_NAME, "true");
    SolrRequestHandler handler = core.getRequestHandler("tvrh");
    SolrQueryResponse rsp;
    rsp = new SolrQueryResponse();
    rsp.add("responseHeader", new SimpleOrderedMap());
    handler.handleRequest(new LocalSolrQueryRequest(core, params), rsp);
    NamedList values = rsp.getValues();
    NamedList termVectors = (NamedList)
values.get(TermVectorComponent.TERM_VECTORS);
    assertTrue("termVectors is null and it shouldn't be", termVectors != null);
    if (VERBOSE) System.out.println("TVs:" + termVectors);
    NamedList doc = (NamedList) termVectors.getVal(0);
    assertTrue("doc is null and it shouldn't be", doc != null);
    assertEquals(doc.size(), 5);
    NamedList field = (NamedList) doc.get("test_posofftv");
    assertTrue("field is null and it shouldn't be", field != null);
    assertTrue(field.size() + " does not equal: " + 2, field.size() == 2);
    NamedList titl = (NamedList) field.get("titl");
    assertTrue("titl is null and it shouldn't be", titl != null);
    assertTrue(titl.get("tf") + " does not equal: " + 2, ((Integer)
titl.get("tf")) == 2);
    //there should not be any positions or offsets
    NamedList positions = (NamedList) titl.get("positions");
    assertTrue("positions is not null and it should be", positions == null);
    NamedList offsets = (NamedList) titl.get("offsets");
    assertTrue("offsets is not null and it should be", offsets == null);
    String uniqueKeyFieldName = (String) termVectors.getVal(1);
    assertTrue("uniqueKeyFieldName is null and it shouldn't be",
uniqueKeyFieldName != null);
    assertTrue(uniqueKeyFieldName + " is not equal to " + "id",
uniqueKeyFieldName.equals("id") == true);
  }


With this:

  @Test
  public void testBasics() throws Exception {
    assertJQ(req("json.nl","map", "qt",tv, "q", "id:0",
TermVectorComponent.COMPONENT_NAME, "true", TermVectorParams.TF,
"true")
       ,"/termVectors=={'doc-0':{'uniqueKey':'0'," +
            " 'test_basictv':{'anoth':{'tf':1},'titl':{'tf':2}}," +
            " 'test_offtv':{'anoth':{'tf':1},'titl':{'tf':2}}," +
            " 'test_posofftv':{'anoth':{'tf':1},'titl':{'tf':2}}," +
            " 'test_postv':{'anoth':{'tf':1},'titl':{'tf':2}}}," +
            " 'uniqueKeyFieldName':'id'}"
    );
  }

I think it's clear which is more easily understandable and
maintainable, and doesn't leak resources.

-Yonik

---------------------------------------------------------------------
To unsubscribe, e-mail: [hidden email]
For additional commands, e-mail: [hidden email]

Reply | Threaded
Open this post in threaded view
|

Re: solr test development

Yonik Seeley-2-2
Related: please try and not create new solrconfig.xml or schema.xml
objects unless you need to.
And if you do, and it's a really special purpose one, try cutting it
down to the bare minimum needed to get the test to work.

Example: I just cut down solrconfig-altdirectory.xml to this:
<config>
  <requestHandler name="standard"
class="solr.StandardRequestHandler"></requestHandler>
  <directoryFactory name="DirectoryFactory"
class="org.apache.solr.core.AlternateDirectoryTest$TestFSDirectoryFactory"></directoryFactory>
  <indexReaderFactory name="IndexReaderFactory"
class="org.apache.solr.core.AlternateDirectoryTest$TestIndexReaderFactory"></indexReaderFactory
>
</config>


-Yonik
http://www.lucidimagination.com



On Fri, Oct 15, 2010 at 9:48 AM, Yonik Seeley
<[hidden email]> wrote:

> Maintaining and fixing tests in solr has been a pain - I think mostly
> because in the past we probably reviewed core code well, but perhaps
> not the test code.  For test code, we should really strive for
> conciseness and maintainability.  Most things should be tested through
> higher level requests, and not by poking around in the guts (which
> makes it very hard to change how something is implemented).
>
> I've been rewriting some broken tests... for example replacing this:
>
>  @Test
>  public void testBasics() throws Exception {
>    SolrCore core = h.getCore();
>    SearchComponent tvComp = core.getSearchComponent("tvComponent");
>    assertTrue("tvComp is null and it shouldn't be", tvComp != null);
>    ModifiableSolrParams params = new ModifiableSolrParams();
>    params.add(CommonParams.Q, "id:0");
>    params.add(CommonParams.QT, "tvrh");
>    params.add(TermVectorParams.TF, "true");
>    params.add(TermVectorComponent.COMPONENT_NAME, "true");
>    SolrRequestHandler handler = core.getRequestHandler("tvrh");
>    SolrQueryResponse rsp;
>    rsp = new SolrQueryResponse();
>    rsp.add("responseHeader", new SimpleOrderedMap());
>    handler.handleRequest(new LocalSolrQueryRequest(core, params), rsp);
>    NamedList values = rsp.getValues();
>    NamedList termVectors = (NamedList)
> values.get(TermVectorComponent.TERM_VECTORS);
>    assertTrue("termVectors is null and it shouldn't be", termVectors != null);
>    if (VERBOSE) System.out.println("TVs:" + termVectors);
>    NamedList doc = (NamedList) termVectors.getVal(0);
>    assertTrue("doc is null and it shouldn't be", doc != null);
>    assertEquals(doc.size(), 5);
>    NamedList field = (NamedList) doc.get("test_posofftv");
>    assertTrue("field is null and it shouldn't be", field != null);
>    assertTrue(field.size() + " does not equal: " + 2, field.size() == 2);
>    NamedList titl = (NamedList) field.get("titl");
>    assertTrue("titl is null and it shouldn't be", titl != null);
>    assertTrue(titl.get("tf") + " does not equal: " + 2, ((Integer)
> titl.get("tf")) == 2);
>    //there should not be any positions or offsets
>    NamedList positions = (NamedList) titl.get("positions");
>    assertTrue("positions is not null and it should be", positions == null);
>    NamedList offsets = (NamedList) titl.get("offsets");
>    assertTrue("offsets is not null and it should be", offsets == null);
>    String uniqueKeyFieldName = (String) termVectors.getVal(1);
>    assertTrue("uniqueKeyFieldName is null and it shouldn't be",
> uniqueKeyFieldName != null);
>    assertTrue(uniqueKeyFieldName + " is not equal to " + "id",
> uniqueKeyFieldName.equals("id") == true);
>  }
>
>
> With this:
>
>  @Test
>  public void testBasics() throws Exception {
>    assertJQ(req("json.nl","map", "qt",tv, "q", "id:0",
> TermVectorComponent.COMPONENT_NAME, "true", TermVectorParams.TF,
> "true")
>       ,"/termVectors=={'doc-0':{'uniqueKey':'0'," +
>            " 'test_basictv':{'anoth':{'tf':1},'titl':{'tf':2}}," +
>            " 'test_offtv':{'anoth':{'tf':1},'titl':{'tf':2}}," +
>            " 'test_posofftv':{'anoth':{'tf':1},'titl':{'tf':2}}," +
>            " 'test_postv':{'anoth':{'tf':1},'titl':{'tf':2}}}," +
>            " 'uniqueKeyFieldName':'id'}"
>    );
>  }
>
> I think it's clear which is more easily understandable and
> maintainable, and doesn't leak resources.
>
> -Yonik
>

---------------------------------------------------------------------
To unsubscribe, e-mail: [hidden email]
For additional commands, e-mail: [hidden email]