Hướng Dẫn Kiểm Thử Ứng Dụng Java Với Elasticsearch: Bộ Công Cụ Hiệu Quả
Khi các ứng dụng ngày càng trở nên phức tạp và phân tán, việc kiểm thử trở thành một phần không thể thiếu trong quy trình phát triển phần mềm. Elasticsearch cung cấp một bộ công cụ kiểm thử mạnh mẽ nhằm hỗ trợ các nhà phát triển trong việc kiểm tra các ứng dụng dựa trên khả năng tìm kiếm (search) và phân tích (analytics) của nó.
Các Loại Kiểm Thử Cần Thiết Trong Dự Án
Có hai loại kiểm thử chính mà các nhà phát triển cần lưu ý trong dự án của mình:
-
Kiểm thử đơn vị (Unit tests) – Đây là các bài kiểm thử tập trung vào việc kiểm tra từng phần nhỏ của ứng dụng, như các lớp (classes), một cách độc lập. Loại kiểm thử này không yêu cầu phải chạy Elasticsearch nodes hay clusters và được hỗ trợ bởi
ESTestCase
vàESTokenStreamTestCase
. -
Kiểm thử tích hợp (Integration tests) – Loại kiểm thử này kiểm tra toàn bộ quy trình của ứng dụng và 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 Các Dependencies Cần Thiết
Để sử dụng bộ kiểm thử của Elasticsearch, cần khai báo các dependencies trong Maven như sau:
xml
<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>
Đồng thời, bạn cũng cần thêm dependency cho JUnit với phiên bản 4.12:
xml
<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 ý: Bộ kiểm thử của Elasticsearch rất nhạy cảm với các dependencies và có thể gây lỗi jar hell nếu xảy ra xung đột giữa các thư viện. Nếu bạn gặp lỗi trong giai đoạn khởi tạo kiểm thử, hãy kiểm tra và loại bỏ các dependency trùng lặp.
Chạy Kiểm Thử Trong Môi Trường Elasticsearch Cluster
Một trong những tính năng nổi bật của bộ kiểm thử là khả năng thực hiện các kiểm thử trên một Elasticsearch cluster thực tế. Dưới đây là cách thiết lập một cluster với 3 nodes:
java
@ClusterScope(numDataNodes = 3)
public class ElasticsearchClusterTest extends ESIntegTestCase {
}
Chỉ bằng một dòng chú thích (annotation), bạn đã sẵn sàng để chạy kiểm thử trên cluster Elasticsearch!
Thiết Lập Dữ Liệu Trước Khi Kiểm Thử
Trước khi thực hiện kiểm thử, bạn có thể tạo một index với mapping types phù hợp. Ví dụ:
java
@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 index, bạn có thể thực hiện kiểm thử để kiểm tra xem index có rỗng không:
java
@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 Tìm Kiếm
Elasticsearch cho phép bạn tạo dữ liệu kiểm thử một cách dễ dàng với các phương thức random. Dưới đây là ví dụ kiểm thử thêm và tìm kiếm một cuốn sách:
java
@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 điểm mạnh của bộ kiểm thử Elasticsearch là khả năng mô phỏng lỗi trong môi trường cluster. Chẳng hạn, nếu một node trong cluster bị lỗi, bạn có thể kiểm tra xem Elasticsearch có xử lý yêu cầu một cách chính xác hay không:
java
@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 Tắt
- Bộ Công Cụ Kiểm Thử Elasticsearch hỗ trợ cả kiểm thử unit test và integration test.
- Unit tests cho phép kiểm tra từng phần nhỏ mà không cần đến cluster.
- Integration tests giúp kiểm tra một cluster thực tế và mô phỏng các tình huống lỗi.
- Mô phỏng môi trường Elasticsearch giúp kiểm thử ứng dụng trong điều kiện gần với 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ộ công cụ kiểm thử này sẽ giúp bạn phát hiện lỗi sớm và bảo đảm hệ thống hoạt động ổn định hơn. 🚀