JUnit - 使用可重复使用的功能进行测试;合法性

时间:2014-02-11 20:29:25

标签: java junit

我想要做的是测试我编写的一些Lucene代码,并希望在使用JUnit进行测试时获得有关最佳实践的一些信息。 Lucene,BTW,是一个搜索引擎,您可以使用它来创建一个平面文件来索引一堆数据。

所以我想测试的是创建这个倒排索引,然后搜索索引以验证是否存在某些数据。

我的问题在于代码:

public class IndexTest {

    @Test
    public void testWriteIndexFromDB() {
        //run test
        assertTrue(something in this test); // some test for this method    
        // Is using a function like so a proper way of writing a test? 
        checkSomeDataIsReturned(); 
    }

    @Test
    public void testWriteIndexFromExcelFile() {
        //run test
        assertTrue(something in this test); // some test for this method    
        // Is using a function like so a proper way of writing a test? 
        checkSomeDataIsReturned(); 
    }

    @Test
    public void testRefreshIndexWithNewData() {
        //run test
        assertTrue(something in this test); // some test for this method    
        // Is using a function like so a proper way of writing a test? 
        checkSomeDataIsReturned(); 
    }

    // this function checks that data is returned after writing an index 
    public void checkSomeDataIsReturned(){  // not a test but does a check anyways
         results = myIndex.searchForStuff(some input);
         assertTrue(results.length > 0); // if length is zero, there is no data and something went wrong 
    }
}

总而言之,我有三个选项来编写索引,我正在测试它们每个都写入。可重复使用的功能是不是测试正确的编写测试方法吗?还是有更好的做法?

2 个答案:

答案 0 :(得分:1)

嗯,在单元测试中也可以使用可重用代码等良好实践。

但是,请注意,如果您需要在单元测试中重复代码,可能(并且经常)意味着您的测试方法承担了太多责任。

我不知道是否真的是你的情况,但考虑重构你的代码(这里将你测试的方法分成更小的方法),所以你觉得不需要重复它全面测试。

当每个方法只承担一个责任,并将共享代码委托给另一个方法/类时,您可以在其他地方测试此功能,这里只是测试(使用模拟和间谍),如果您的方法调用相应的方法/对象。 / p>

答案 1 :(得分:1)

在测试中编写可重用代码当然是一件好事,但更重要的是编写易于理解的代码。一般来说,断言是在测试方法本身,将断言移动到辅助方法可能会使您的测试难以理解。

编写可重用代码以检查期望的一种方法是使用Hamcrest(https://code.google.com/p/hamcrest/wiki/Tutorial)并构建匹配器(该库还附带了一些非常有用的集合匹配器和类似的东西)。

例如,您可以编写类似的内容:

public void
test_can_index_from_database() {
    // create your index from database

    assertThat(myIndex, containsWord('expected_word_in_index'));
}

匹配器“containsWord(String)”是您使用hamcrest编写的匹配器,您可以在所有测试中重复使用此逻辑。使用hamcrest,您可以编写非常容易理解的测试。