【问题标题】:Java Elasticsearch database testingJava Elasticsearch 数据库测试
【发布时间】:2017-07-27 23:39:33
【问题描述】:

我目前正在一个项目中使用 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);
}

但我的同事告诉我,这种测试会破坏数据库,如果他们出现问题,则必须手动修复数据库。

这就是为什么我在这里不知所措的原因,感谢任何形式的帮助

【问题讨论】:

    标签: java unit-testing elasticsearch integration-testing elasticsearch-jest


    【解决方案1】:

    首先你不应该测试框架。你应该测试你的代码。例如:我的映射正确吗?

    第二:即使之前的测试失败,每个集成测试都应该让数据库处于已知状态。

    我通常使用 DBunit 进行数据填充和评估*。

    来自Best Practices的引用

    • 每个开发人员使用一个数据库实例
    • 良好的设置不需要清理!
    • 使用多个小型数据集
    • 为整个测试类或测试套件执行一次陈旧数据设置

    注意*:我还没有使用弹性搜索。

    【讨论】:

      猜你喜欢
      • 2023-03-15
      • 1970-01-01
      • 2022-11-22
      • 2015-01-26
      • 1970-01-01
      • 2019-04-18
      • 2022-01-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多