我想要做的是测试我编写的一些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
}
}
总而言之,我有三个选项来编写索引,我正在测试它们每个都写入。可重复使用的功能是不是测试正确的编写测试方法吗?还是有更好的做法?
答案 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,您可以编写非常容易理解的测试。