0
0
Posts
Admin Team
Admin Teamtechmely

Hướng Dẫn Kiểm Thử Ứng Dụng Java Với Elasticsearch: Bộ Công Cụ Hiệu Quả

Đăng vào 1 tuần trước

• 5 phút đọc

Chủ đề:

Elasticsearch

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:

  1. 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 ESTestCaseESTokenStreamTestCase.

  2. 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, ESSingleNodeTestCaseESBackCompatTestCase.

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 Copy
<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 Copy
<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 Copy
@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 Copy
@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 Copy
@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 Copy
@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 Copy
@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 testintegration 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. 🚀

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào