使用 jest-search 实现 Elasticsearch 集成测试

🏡 微信公众号:极客范

开源社区-极客范:www.geekfun.club/zh/

⛳️ 欢迎关注 🐳 点赞 🎒 收藏 ✏️ 留言

本系列主要输出极客范社区开源项目

DocKit:dockit.geekfun.club/

jest-search: github.com/geek-fun/je... serverlessInsight:serverlessinsight.geekfun.club/

jest-search GitHub Elasticsearch 已经成为现代应用程序的一个重要组成部分,特别是那些需要处理大量数据并且需要高效搜索能力的应用程序。在开发使用 Elasticsearch 的应用程序时,确保应用程序与 Elasticsearch 的集成正常运作非常重要。通过集成测试是实现这一目标的一种有效方式。

集成测试

集成测试涉及对应用程序不同组件之间的交互进行测试,以确保它们按预期一起工作。在 Elasticsearch 的上下文中,集成测试确保您的应用程序能够正确地与 Elasticsearch 实例通信,并执行诸如索引文档、搜索和聚合等各种操作。

设置 Elasticsearch 集成测试

有几种实现 Elasticsearch 集成测试的方法,您可以启动一个容器来运行 Elasticsearch 服务器,或者配置一个专门用于测试目的的远程 Elasticsearch 服务器。在本文中,我将介绍另一种使用 jest-search 来实现 Elasticsearch 集成测试的方法,它会为您启动一个本地服务器。

jest-search 是一个 jest-preset,它可以帮助您在本地启动 Elasticsearch、OpenSearch 和 ZincSearch,它会在测试开始前自动下载和启动服务器,并在测试结束后关闭服务器。

先决条件:

ElasticSearch 和 OpenSearch 依赖于 Java,请确保您已安装 Java 并设置了 JAVA_HOME

jest-search 提供两种设置的方式,一种是全局设置,另一种是仅在特定测试中运行。

要开始使用 jest-search 进行集成测试,首先需要安装该包。您可以使用 npm 进行安装:

bash 复制代码
npm install --save-dev @geek-fun/jest-search

2. 配置服务器

您可以在 readme 中找到所有可配置的项目和详细的说明。

javascript 复制代码
module.exports = () => {
  return {
    engine: 'elasticsearch', // 或 'opensearch' 或 'zincsearch'
    version: '8.8.2',
    port: 9200,
    binaryLocation: '', // 可选
    clusterName: 'jest-search-local',
    nodeName: 'jest-search-local',
    zincAdmin: 'admin',
    zincPassword: 'Complexpass#123',
    indexes: [
      {
        name: 'index-name',
        body: {
          settings: {
            number_of_shards: '1',
            number_of_replicas: '1'
          },
          aliases: {
            'your-alias': {}
          },
          mappings: {
            dynamic: false,
            properties: {
              id: {
                type: 'keyword'
              }
            }
          }
        }
      }
    ]
  };
};

3. 创建 jest-global-setup.js

javascript 复制代码
const { globalSetup } = require('@geek-fun/jest-search');
module.exports = async () => {
  await Promise.all([globalSetup()]);
};

4. 创建 jest-global-teardown.js

javascript 复制代码
const { globalTeardown } = require('@geek-fun/jest-search');
module.exports = async () => {
  await Promise.all([globalTeardown()]);
};

5. 修改 jest-config.js

javascript 复制代码
module.exports = {
      ...
      globalSetup: '<rootDir>/jest-global-setup.js',
      globalTeardown: '<rootDir>/jest-global-teardown.js',
    };

6. 编写您的测试

javascript 复制代码
// tests/utils/helper.ts 示例工具函数用于添加测试项
    export const saveBook = async (bookDoc: { name: string; author: string }) => {
      await esClient.index({ index, body: bookDoc, refresh: true });
    };
    ​
    // tests/book.test.ts 示例测试
    beforeAll(async () => {
      await saveBook(mockBook);
    });

仅运行特定测试

上述步骤将在运行 npm run test 时启动服务器。如果您只想在运行特定文件时启动服务器,您可以使用 beforeAllafterAll 进行控制。以下是具体步骤:

步骤 1 和 2 与上述步骤相同,jest-search 导出了两个方法 startEnginestopEngine,用于启动和停止搜索引擎,您可以在测试文件中手动调用它们,startEngine 接受与 jest-search-config.js 文件中定义的相同参数对象。

javascript 复制代码
    import { startEngine, stopEngine } from '@geek-fun/jest-search';
    // eslint-disable-next-line @typescript-eslint/ban-ts-comment
    // @ts-ignore
    import loadConfig from '../jest-search-config.js';
    ​
    ​
    describe('Elasticsearch 集成测试', () => {
      beforeAll(async () => {
        await startEngine(loadConfig());
        await saveBook(mockBook);
      });
      afterAll(async () => {
        await stopEngine();
      });
      it('应该在使用有效书名搜索时得到书籍', async () => {
        // ...
      });
    });
    ​

运行集成测试

要运行集成测试,您可以使用 Jest 测试运行器:

bash 复制代码
    npm run test

结论

集成测试对于验证应用程序与 Elasticsearch 的交互非常重要。使用 jest-search,您可以轻松地编写集成测试,以确保您的应用程序在与 Elasticsearch/OpenSearch 和 ZincSearch 通信时行为正确。

以下是一个示例存储库供您参考:event-search

相关推荐
成长的小牛2332 小时前
es使用knn向量检索中numCandidates和k应该如何配比更合适
大数据·elasticsearch·搜索引擎
Elastic 中国社区官方博客3 小时前
Elasticsearch:什么是查询语言?
大数据·数据库·elasticsearch·搜索引擎·oracle
启明真纳4 小时前
elasticache备份
运维·elasticsearch·云原生·kubernetes
幽弥千月14 小时前
【ELK】ES单节点升级为集群并开启https【亲测可用】
elk·elasticsearch·https
运维&陈同学14 小时前
【Elasticsearch05】企业级日志分析系统ELK之集群工作原理
运维·开发语言·后端·python·elasticsearch·自动化·jenkins·哈希算法
Y编程小白1 天前
Git版本控制工具--基础命令和分支管理
大数据·git·elasticsearch
酱学编程1 天前
ES搜索原理
大数据·elasticsearch·搜索引擎
龙少95431 天前
【SpringBoot中怎么使用ElasticSearch】
spring boot·elasticsearch·jenkins
liupenglove1 天前
Kibana8.17.0在mac上的安装
elasticsearch·macos·kibana
Aliano2171 天前
ES对比Hbase
elasticsearch·信息可视化·hbase