• 作者:老汪软件技巧
  • 发表时间:2024-10-14 04:01
  • 浏览量:

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

DocKit:dockit.geekfun.club/

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

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

集成测试

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

设置 Elasticsearch 集成测试

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

jest-search

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

先决条件:

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

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

1. 安装 jest-search

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

npm install --save-dev @geek-fun/jest-search

2. 配置服务器

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

集成测试的具体方法__集成测试实例

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

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

4. 创建 jest-global-teardown.js

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

5. 修改 jest-config.js

module.exports = {
      ...
      globalSetup: '/jest-global-setup.js',
      globalTeardown: '/jest-global-teardown.js',
    };

6. 编写您的测试

// 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 时启动服务器。如果您只想在运行特定文件时启动服务器,您可以使用 beforeAll 和 afterAll 进行控制。以下是具体步骤:

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

    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 测试运行器:

    npm run test

结论

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

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