[Elasticsearch - Java] Testing Kit
Khi các ứng dụng ngày càng phức tạp và phân tán, việc kiểm thử đóng vai trò quan trọng hơn bao giờ hết. Elasticsearch cung cấp một bộ công cụ kiểm thử mạnh mẽ để giúp các nhà phát triển dễ dàng kiểm tra các ứng dụng dựa trên khả năng search và analytics của nó.
Có hai loại kiểm thử chính mà bạn có thể cần trong dự án của mình:
- Unit tests – Kiểm thử từng đơn vị nhỏ (như class) một cách độc lập, không yêu cầu chạy Elasticsearch nodes hoặc clusters. Những loại kiểm thử này được hỗ trợ bởi
ESTestCase
vàESTokenStreamTestCase
. - Integration tests – Kiểm thử toàn bộ quy trình, thường yêu cầu ít nhất một Elasticsearch node đang chạy. Các kiểm thử này được hỗ trợ bởi
ESIntegTestCase
,ESSingleNodeTestCase
vàESBackCompatTestCase
.
Khai Báo Dependencies
Chúng ta cần khai báo các dependencies cần thiết trong Maven để sử dụng bộ kiểm thử:
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-test-framework</artifactId>
<version>6.4.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.elasticsearch.test</groupId>
<artifactId>framework</artifactId>
<version>5.2.0</version>
<scope>test</scope>
</dependency>
Ngoài ra, ta cũng cần thêm dependency cho JUnit, đảm bảo phiên bản là 4.12:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-core</artifactId>
</exclusion>
</exclusions>
</dependency>
Lưu ý: Elasticsearch test framework rất nhạy cảm với các dependency, và có thể gặp lỗi jar hell nếu có xung đột giữa các thư viện. Nếu bạn thấy kiểm thử bị lỗi trong giai đoạn khởi tạo, hãy kiểm tra và loại bỏ các dependency bị trùng lặp.
Chạy Kiểm Thử Với Elasticsearch Cluster
Một trong những tính năng quan trọng của bộ kiểm thử là khả năng chạy các kiểm thử trên một Elasticsearch cluster thực tế.
Ví dụ, để thiết lập một cluster với 3 nodes trong kiểm thử:
@ClusterScope(numDataNodes = 3)
public class ElasticsearchClusterTest extends ESIntegTestCase {
}
Chỉ với một dòng annotation, bạn đã có một cluster Elasticsearch sẵn sàng cho kiểm thử!
Thiết Lập Dữ Liệu Trước Khi Kiểm Thử
Trước khi kiểm thử, chúng ta có thể tạo một index với mapping types phù hợp:
@Before
public void setUpCatalog() throws IOException {
try (final ByteArrayOutputStream out = new ByteArrayOutputStream()) {
Streams.copy(getClass().getResourceAsStream("/catalog-index.json"), out);
final CreateIndexResponse response = admin()
.indices()
.prepareCreate("catalog")
.setSource(out.toByteArray())
.get();
assertAcked(response);
ensureGreen("catalog");
}
}
Sau khi thiết lập, chúng ta có thể thực hiện các kiểm thử như kiểm tra xem index có rỗng không:
@Test
public void testEmptyCatalogHasNoBooks() {
final SearchResponse response = client()
.prepareSearch("catalog")
.setTypes("books")
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
.setQuery(QueryBuilders.matchAllQuery())
.setFetchSource(false)
.get();
assertNoSearchHits(response);
}
Thêm Dữ Liệu Và Kiểm Tra Search
Elasticsearch hỗ trợ tạo dữ liệu kiểm thử một cách dễ dàng bằng cách sử dụng các phương thức random.
@Test
public void testInsertAndSearchForBook() throws IOException {
final XContentBuilder source = JsonXContent
.contentBuilder()
.startObject()
.field("title", randomAsciiOfLength(100))
.startArray("categories")
.startObject().field("name", "analytics").endObject()
.startObject().field("name", "search").endObject()
.startObject().field("name", "database store").endObject()
.endArray()
.field("publisher", randomAsciiOfLength(20))
.field("description", randomAsciiOfLength(200))
.field("published_date", new LocalDate(2015, 02, 07).toDate())
.field("isbn", "978-1449358549")
.field("rating", randomInt(5))
.endObject();
index("catalog", "books", "978-1449358549", source);
refresh("catalog");
final QueryBuilder query = QueryBuilders.nestedQuery(
"categories",
QueryBuilders.matchQuery("categories.name", "analytics"),
ScoreMode.Total
);
final SearchResponse response = client()
.prepareSearch("catalog")
.setTypes("books")
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
.setQuery(query)
.setFetchSource(false)
.get();
assertSearchHits(response, "978-1449358549");
}
Mô Phỏng Các Tình Huống Thực Tế Trong Cluster
Một trong những tính năng mạnh nhất của bộ kiểm thử Elasticsearch là khả năng mô phỏng lỗi trong cluster.
Ví dụ, nếu một node trong cluster bị lỗi, chúng ta có thể kiểm tra xem Elasticsearch có xử lý yêu cầu đúng không:
@Test
public void testClusterNodeIsDown() throws IOException {
internalCluster().stopRandomDataNode();
final SearchResponse response = client()
.prepareSearch("catalog")
.setTypes("books")
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
.setQuery(QueryBuilders.matchAllQuery())
.setFetchSource(false)
.get();
assertNoSearchHits(response);
}
Tóm Lược
- Elasticsearch Testing Kit hỗ trợ kiểm thử unit test và integration test.
- Unit tests giúp kiểm tra từng đơn vị nhỏ mà không cần chạy cluster.
- Integration tests có thể kiểm tra cluster thực tế và mô phỏng các tình huống lỗi.
- Mô phỏng Elasticsearch cluster giúp kiểm thử ứng dụng trong điều kiện gần với môi trường thực tế nhất.
Nếu bạn đang phát triển một ứng dụng sử dụng Elasticsearch, việc tận dụng bộ kiểm thử này có thể giúp phát hiện lỗi sớm và đảm bảo hệ thống hoạt động ổn định. 🚀
All rights reserved