Java Elasticsearch 数据库测试
Java Elasticsearch database testing
我目前在我工作的项目中使用 ES 5 和 Jest,我被分配到 类 与数据库交互的集成和单元测试。
假设我有这样的方法:
@Override
public Aptitude save(Aptitude aptitude) {
Index index = new Index.Builder(aptitude).index(aptitudeIndexName).type(aptitudeTypeName).refresh(true).build();
try {
client.execute(index);
return aptitude;
} catch (IOException e) {
logger.error("The aptitude couldn't be saved in the data base " + e.getMessage());
throw new RuntimeException(e);
}
}
或这样的一个:
@Override
public List<Aptitude> findAll() {
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchAllQuery());
searchSourceBuilder.sort("id", SortOrder.ASC);
Search search = new Search.Builder(searchSourceBuilder.toString()).addIndex(aptitudeIndexName).build();
try {
SearchResult result = client.execute(search);
if (!result.isSucceeded()) {
return null;
}
List<Hit<Aptitude, Void>> aptitudes = result.getHits(Aptitude.class);
return aptitudes.stream().map(this::getAptitude).collect(Collectors.toList());
} catch (IOException e) {
logger.error("The search couldn't be executed" + e.getMessage());
throw new RuntimeException(e);
}
}
我的任务是编写一些测试(单元和集成)以确保我所有的 类 都正常工作并获得更好的测试覆盖率,我在网上搜索了一些 ES 测试但我完全掌握了我应该如何进行测试。
我做了一些看起来像这样的测试:
@Test
public void aptitudeSaveDelete() {
Aptitude aptitude = new Aptitude();
aptitude.setId(1993L);
aptitude.setEn("ENaptitudeEN");
aptitude.setEs("ESaptitudeES");
Aptitude aptitudeSaved = elasticsearchAptitudeRepository.save(aptitude);
assertEquals(aptitude.getEs(), aptitudeSaved.getEs());
assertEquals(aptitude.getEn(), aptitudeSaved.getEn());
assertEquals(aptitude.getId(), aptitudeSaved.getId());
Aptitude aptitudeFoundById = elasticsearchAptitudeRepository.findById(String.valueOf(aptitude.getId()));
assertEquals(aptitude.getId(), aptitudeFoundById.getId());
assertEquals(aptitude.getEn(), aptitudeFoundById.getEn());
assertEquals(aptitude.getEs(), aptitudeFoundById.getEs());
boolean wasDeleted;
wasDeleted = elasticsearchAptitudeRepository.deleteAptitudeById(String.valueOf(aptitude.getId()));
assertEquals(true, wasDeleted);
}
但我的同事告诉我,这种测试会破坏数据库,如果出现问题,则必须手动修复数据库。
这就是我在这里不知所措的原因,感谢任何帮助
首先你不应该测试框架。你应该测试你的代码。例如:我的映射正确吗?
其次:即使之前的测试失败,每个集成测试都应该让数据库处于已知状态。
我通常使用 DBunit 进行数据填充和评估*。
来自他们 Best Practices
的引用
- 每位开发人员使用一个数据库实例
- 好的设置不需要清理!
- 使用多个小数据集
- 为整个测试class或测试套件
执行一次陈旧数据设置
注*:我还没有用过elasticsearch
我目前在我工作的项目中使用 ES 5 和 Jest,我被分配到 类 与数据库交互的集成和单元测试。
假设我有这样的方法:
@Override
public Aptitude save(Aptitude aptitude) {
Index index = new Index.Builder(aptitude).index(aptitudeIndexName).type(aptitudeTypeName).refresh(true).build();
try {
client.execute(index);
return aptitude;
} catch (IOException e) {
logger.error("The aptitude couldn't be saved in the data base " + e.getMessage());
throw new RuntimeException(e);
}
}
或这样的一个:
@Override
public List<Aptitude> findAll() {
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchAllQuery());
searchSourceBuilder.sort("id", SortOrder.ASC);
Search search = new Search.Builder(searchSourceBuilder.toString()).addIndex(aptitudeIndexName).build();
try {
SearchResult result = client.execute(search);
if (!result.isSucceeded()) {
return null;
}
List<Hit<Aptitude, Void>> aptitudes = result.getHits(Aptitude.class);
return aptitudes.stream().map(this::getAptitude).collect(Collectors.toList());
} catch (IOException e) {
logger.error("The search couldn't be executed" + e.getMessage());
throw new RuntimeException(e);
}
}
我的任务是编写一些测试(单元和集成)以确保我所有的 类 都正常工作并获得更好的测试覆盖率,我在网上搜索了一些 ES 测试但我完全掌握了我应该如何进行测试。
我做了一些看起来像这样的测试:
@Test
public void aptitudeSaveDelete() {
Aptitude aptitude = new Aptitude();
aptitude.setId(1993L);
aptitude.setEn("ENaptitudeEN");
aptitude.setEs("ESaptitudeES");
Aptitude aptitudeSaved = elasticsearchAptitudeRepository.save(aptitude);
assertEquals(aptitude.getEs(), aptitudeSaved.getEs());
assertEquals(aptitude.getEn(), aptitudeSaved.getEn());
assertEquals(aptitude.getId(), aptitudeSaved.getId());
Aptitude aptitudeFoundById = elasticsearchAptitudeRepository.findById(String.valueOf(aptitude.getId()));
assertEquals(aptitude.getId(), aptitudeFoundById.getId());
assertEquals(aptitude.getEn(), aptitudeFoundById.getEn());
assertEquals(aptitude.getEs(), aptitudeFoundById.getEs());
boolean wasDeleted;
wasDeleted = elasticsearchAptitudeRepository.deleteAptitudeById(String.valueOf(aptitude.getId()));
assertEquals(true, wasDeleted);
}
但我的同事告诉我,这种测试会破坏数据库,如果出现问题,则必须手动修复数据库。
这就是我在这里不知所措的原因,感谢任何帮助
首先你不应该测试框架。你应该测试你的代码。例如:我的映射正确吗?
其次:即使之前的测试失败,每个集成测试都应该让数据库处于已知状态。
我通常使用 DBunit 进行数据填充和评估*。
来自他们 Best Practices
的引用- 每位开发人员使用一个数据库实例
- 好的设置不需要清理!
- 使用多个小数据集
- 为整个测试class或测试套件 执行一次陈旧数据设置
注*:我还没有用过elasticsearch