作者:來自 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