使用 Elasticsearch 进行集成测试初始化​​数据时的注意事项

作者:来自 Elastic piotrprz

在创建应该使用 Elasticsearch 进行搜索、数据聚合或 BM25/vector/search 的软件时,创建至少少量的集成测试至关重要。虽然 “模拟索引” 看起来很诱人,因为测试甚至可以在几分之一秒内运行,但它们实际测试的不是与真实 Elasticsearch 的交互,而是我们对 Elasticsearch 的想象。这可能会在生产中得到严格的验证,特别是在集群更新之后 :wink:

为了减轻集成测试最明显的缺点,至关重要的是使用数据初始化 Elasticsearch,这种方式对于日常生产场景来说可能不是最佳的,但对于测试设置来说却非常有效。

更多有关测试的文章:

  • 使用真实 Elasticsearch 进行更快的集成测试

  • 使用模拟和真实的 Elasticsearch 来测试你的 Java 代码

不要重新创建容器

依赖 Elasticsearch 测试你的功能可能只需要很少的时间,比如几分之一秒。那么在测试之间重新启动 Elasticsearch 并不是一个明智的想法,因为你将额外花费几十秒钟来等待 ES 启动。

只需在测试之前启动一次 Elasticsearch,在每次测试后进行清理,并在每次测试之前初始化数据。

提示:如果您在 Java 等语言中使用 Elasticsearch 的 Testcontainers 模块,请确保该字段是 @Container static 或至少在 @BeforeAll 中启动。

测试之前,cURL 是你的好朋友

在生产代码(我们正在测试)中使用客户端库是一个明智的选择。然而,在准备测试环境时,采用更为复杂的方法可能会有好处,因为生产用例和测试数据设置的需求并不 100% 相同。使用 cURL 管理 Elasticsearch 中的数据并不是什么难事,正如我们在之前的文章中看到的那样:如何使用 cURL Elasticsearch:进入 Shell。

另一个好处是 cURL 与编程语言无关,因此来自不同技术栈的人可以更容易理解测试。
从 Testcontainers 使用 cURL 并不比 Bash 困难多少,例如,如果你需要删除书籍索引,可以这样做:

elasticsearch.execInContainer("curl", "https://localhost:9200/books", "-u", "elastic:changeme","--cacert", "/usr/share/elasticsearch/config/certs/http_ca.crt","-X", "DELETE"
)

尽可能批量

在很多情况下,索引单个文档是有意义的,但加载测试数据不是其中之一。无需发出 1000 个请求来索引每个文档,只需运行一个包含 1000 个文档的 _bulk 请求即可。即使使用测试容器也不是什么难事:

elasticsearch.execInContainer("curl", "https://localhost:9200/_bulk?refresh=true", "-u", "elastic:changeme","--cacert", "/usr/share/elasticsearch/config/certs/http_ca.crt","-X", "POST","-H", "Content-Type: application/x-ndjson","--data-binary", "@/tmp/books.ndjson"
)

通过这种方法,您甚至可以在一次调用中将文档添加到许多线索中!

尽量本地化

CPU缓存比内存快得多,本地存储通常比网络快。如果你有十个用例都依赖同一份数据集,那就没有必要每次都把同样的数据发送到同一个容器里(毕竟我们不会每次测试都创建新容器,对吧?)

因此,在创建容器时,加上 .withCopyToContainer(...),这样你就可以把文件一次性复制到容器,然后像上面那样直接用 _bulk 处理。这大概是这样的:

static ElasticsearchContainer elasticsearch =new ElasticsearchContainer(ELASTICSEARCH_IMAGE).withCopyToContainer(MountableFile.forHostPath("src/test/resources/books.ndjson"), "/tmp/books.ndjson");

这在设置(如 CI)中尤其有意义,其中容器运行时不是本地的,而是从不同的机器注入的。

回顾

这里提出的想法提醒我们,永恒的 IT 口头禅 “不要重复自己” 也适用于初始化测试数据。将数据批量保存在本地,这样你就可以节省执行集成测试所需的大量时间。欲了解更多见解,请随意探索 Github repo,其中包含更多示例和分支。

原文:Dec 8th, 2024: [EN] DOs and DON'Ts when initializing data for integration tests with Elasticsearch - Advent Calendar - Discuss the Elastic Stack

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/71612.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【selenium工具操作web页面中的下拉框元素 】

使用F12定位下拉框中的元素 使用F12定位下拉框中的元素 1、有一类元素不是直接显示的页面上的,而是需要点击某些其他元素后才会显示在页面上,比如这里的下拉框。 2、这类元素会有一个特点:鼠标如果移开(没在元素上),这些元素就会…

C++ set map 详解

文章目录 1. 容器2. set和multiset2.1 set2.1.1 构造函数2.1.2 insert和erase2.1.2.1 insert2.1.2.2 erase 2.1.3 查找和访问2.1.3.1 set迭代器相关2.1.3.2 find && count2.1.3.3 范围查找 2.2 multiset2.2.1 insert和erase2.2.2 find和count 2.3 set和multiset的在算法…

Unity网络开发基础 (2) 网络协议基础

本文章不作任何商业用途 仅作学习与交流 部分图片来自Unity唐老师 目录 1.虚拟模型 2.实际模型 TCP/IP 3.传输层协议 TCP/UDP TCP 协议详解 1. 核心机制 2. 头部格式(20 字节最小) UDP 协议详解 1. 核心特点 2. 头部格式(固定 8 字节…

HTML label 标签使用

点击 <label> 标签通常会使与之关联的表单控件获得焦点或被激活。 通过正确使用 <label> 标签&#xff0c;可以使表单更加友好和易于使用&#xff0c;同时提高整体的可访问性。 基本用法 <label> 标签通过 for 属性与 id 为 username 的 <input> 元素…

JDBC、MyBatis 、MyBatis-Plus面试总结(一)

以下为你整理了一些 MyBatis 和 MyBatis-Plus 中 mapper.xml 相关的常见面试问题及答案&#xff1a; 基础概念类 问题 1&#xff1a;什么是 mapper.xml 文件&#xff0c;它在 MyBatis 中有什么作用&#xff1f; 答案&#xff1a;mapper.xml 文件是 MyBatis 中用于定义 SQL 语…

GCC RISCV 后端 -- GCC Passes 注释

在前面文章提到&#xff0c;当GCC 前端完成对C源代码解析完成后&#xff0c;就会使用 处理过程&#xff08;Passes&#xff09;机制&#xff0c;通过一系列的处理过程&#xff0c;将 GENERIC IR 表示的C程序 转步转换成 目标机器的汇编语言。过程描述如下图所示&#xff1a; 此…

基于Python实现的智能旅游推荐系统(Django)

基于Python实现的智能旅游推荐系统(Django) 开发语言:Python 数据库&#xff1a;MySQL所用到的知识&#xff1a;Django框架工具&#xff1a;pycharm、Navicat 系统功能实现 总体设计 系统实现 系统首页模块 统首页页面主要包括首页&#xff0c;旅游资讯&#xff0c;景点信息…

鸿蒙全栈开发 D2

课程目标 掌握ArkTS基础语法与核心概念理解声明式UI开发范式能独立开发简单鸿蒙应用组件建立规范的代码编写习惯 第一部分&#xff1a;初识ArkTS 1.1 语言全景认知 #mermaid-svg-V5mnjQN3DAHkfoBo {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size…

【YashanDB认证】yashandb23.3.1 个人版单机部署安装实践

YCA报名链接如下: YashanDB|崖山数据库系统YashanDB学习中心-YCA认证详情 目前免费 主要参考文档&#xff1a; 单机&#xff08;主备&#xff09;部署 | YashanDB Doc 另外还参考摩天轮文章&#xff1a; YashanDB 23.2.9.101 企业版安装步骤抢先看&#xff01; - 墨天轮 …

【蓝桥杯】每天一题,理解逻辑(3/90)【Leetcode 快乐数】

闲话系列&#xff1a;每日一题&#xff0c;秃头有我&#xff0c;Hello&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;,我是IF‘Maxue&#xff0c;欢迎大佬们来参观我写的蓝桥杯系列&#xff0c;我好久没有更新博客了&#xff0c;因为up猪我寒假用自己的劳动换了…

爬虫Incapsula reese84加密案例:Etihad航空

声明: 该文章为学习使用,严禁用于商业用途和非法用途,违者后果自负,由此产生的一切后果均与作者无关 一、找出需要加密的参数 1.js运行 atob(‘aHR0cHM6Ly93d3cuZXRpaGFkLmNvbS96aC1jbi8=’) 拿到网址,F12打开调试工具,随便搜索航班,切换到network搜索一个时间点可以找…

缓存雪崩 缓存击穿 缓存穿透

1. redis使用场景-缓存-缓存穿透 在实际开发中&#xff0c;Redis 被广泛应用于缓存&#xff0c;以提高系统性能和响应速度。然而&#xff0c;在使用缓存时&#xff0c;需要注意一些问题&#xff0c;其中 缓存穿透 是一个常见且需要重点关注的场景。 什么是缓存穿透 ● 缓存穿…

【YOLOv12改进trick】多尺度大核注意力机制MLKA模块引入YOLOv12,实现多尺度目标检测涨点,含创新点Python代码,方便发论文

🍋改进模块🍋:多尺度大核注意力机制(MLKA) 🍋解决问题🍋:MLKA模块结合多尺度、门控机制和空间注意力,显著增强卷积网络的模型表示能力。 🍋改进优势🍋:超分辨的MLKA模块对小目标和模糊目标涨点很明显 🍋适用场景🍋:小目标检测、模糊目标检测等 🍋思路…

better-sqlite3之exec方法

在 better-sqlite3 中&#xff0c;.exec() 方法用于执行包含多个 SQL 语句的字符串。与预编译语句相比&#xff0c;这种方法性能较差且安全性较低&#xff0c;但有时它是必要的&#xff0c;特别是当你需要从外部文件&#xff08;如 SQL 脚本&#xff09;中执行多个 SQL 语句时。…

电路基础:【1】PN结二极管制作电桥点亮LED灯

第一章&#xff1a;PN结二极管制作电桥点亮LED灯 文章目录 第一章&#xff1a;PN结二极管制作电桥点亮LED灯前言一、电路原理二、电路图与元器件1.电路图 做实验总结 前言 在本章中&#xff0c;我们将探讨如何通过PN结二极管制作电桥电路&#xff0c;并利用该电路点亮LED灯。L…

XHR请求解密:抓取动态生成数据的方法

在如今动态页面大行其道的时代&#xff0c;传统的静态页面爬虫已无法满足数据采集需求。尤其是在目标网站通过XHR&#xff08;XMLHttpRequest&#xff09;动态加载数据的情况下&#xff0c;如何精准解密XHR请求、捕获动态生成的数据成为关键技术难题。本文将深入剖析XHR请求解密…

机器学习数学基础:42.AMOS 结构方程模型(SEM)分析的系统流程

该流程图完整呈现了 AMOS 结构方程模型&#xff08;SEM&#xff09;分析的系统流程&#xff0c;具体步骤及内涵如下&#xff1a; 1. 模型设定 基于理论基础或研究假设&#xff0c;构建结构方程模型的初始框架&#xff0c;明确潜变量与显变量的关系、测量模型&#xff08;因子…

以太网通讯

接口开发笔记-WebApi-CSDN博客 以太网常用通讯协议 1、modbus tcp using EasyModbus; using System;class Program {static void Main(string[] args){// 创建Modbus客户端实例ModbusClient modbusClient new ModbusClient("192.168.1.100"); // IP地址modbusCli…

Arcgis中添加脚本工具箱

文章目录 准备资料1、打开arcmap2、找到目录窗口3、复制粘贴工具箱的路径4、添加或者确认python脚本路径准备资料 (1)工具箱 (2)python脚本 1、打开arcmap 2、找到目录窗口 3、复制粘贴工具箱的路径 4、添加或者确认python脚本路径 脚本上右键属性(注意:脚本内容和路径…

TDengine SQL查询语法

简介 TDengine 中的查询 SQL 基本遵循 MYSQL 的查询语法&#xff0c;大部分查询都是通过超级表按时间维度进行的各种查询。 TDengine 时序数据库以时间为主索引列进行数据组织排序及存储&#xff0c;同时按存储块做了预计算&#xff0c;所以在无普通列过滤的 SQL 查询语句中聚…