0
0
Lập trình
NM

Xây Dựng CodeMapRT: Cách Tiếp Cận Mới Trong Kiểm Thử Hồi Quy

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

• 5 phút đọc

Giới Thiệu

Trong các dự án phần mềm lớn, kiểm thử hồi quy thường trở thành một rào cản lớn. Mỗi lần gửi pull request đều yêu cầu chạy toàn bộ bộ kiểm thử — hàng trăm bài kiểm tra, ngay cả khi chỉ sửa một dòng mã. Điều này dẫn đến sự chậm trễ trong quy trình phát triển và gia tăng chi phí trong CI. Nhưng tại sao chúng ta lại kiểm thử mọi thứ khi chỉ một phần mã đã thay đổi?

Nguồn Gốc Vấn Đề

Qua quá trình làm việc, tôi nhận thấy một số điểm:

  • Hầu hết các commit chỉ tác động đến một vài module.
  • Nhưng bộ kiểm thử hồi quy khổng lồ vẫn được chạy đi chạy lại.
  • Phản hồi cho các nhà phát triển bị chậm trễ, làm chậm tiến độ phát hành.

Sự lãng phí là rõ ràng — chúng tôi đang xác nhận một lượng lớn mã không bao giờ thay đổi.

Bước Đột Phá

Từ những quan sát này, tôi đã nghĩ ra một ý tưởng: Thay vì chạy tất cả bài kiểm tra, hãy ánh xạ những gì thay đổi trong mã tới các bài kiểm tra thực sự quan trọng.

Đó chính là nguyên lý cốt lõi của CodeMapRT — một framework liên kết các sự khác biệt trong mã với các bài kiểm tra liên quan.

Cách Tiếp Cận Của Tôi

Bước 1: Phát Hiện Những Thay Đổi

Tôi bắt đầu bằng cách đơn giản — chỉ cần lấy các tệp đã thay đổi từ Git:

bash Copy
# Phát hiện các tệp đã thay đổi trong commit gần nhất
git diff --name-only HEAD~1 | grep ".java" > changed-files.txt

Sau đó, tôi đã thêm các chú thích nhẹ vào các bài kiểm tra để chỉ định các module mà chúng kiểm tra:

java Copy
@Test
@CoversModule({"auth", "login"})
public void loginTest() {
    // ...
}

Các bài kiểm tra không khớp với các tệp đã thay đổi sẽ bị bỏ qua. Việc ánh xạ có thể được cấu hình qua các chú thích hoặc các nguồn siêu dữ liệu khác, bao gồm cả báo cáo độ phủ.

Bước 2: Đảm Bảo An Toàn

Kiểm thử hồi quy chọn lọc luôn tiềm ẩn rủi ro về việc bỏ sót các phụ thuộc ẩn. Để giải quyết điều này, CodeMapRT cung cấp hai lớp bảo vệ:

  1. Chạy lại toàn bộ — có thể được kích hoạt cho các bản phát hành lớn hoặc bất cứ khi nào dữ liệu độ phủ có vẻ không đầy đủ.
  2. Bài kiểm tra an toàn — một bộ kiểm tra bổ sung có thể cấu hình được thêm vào các bài kiểm tra đã chọn. Bằng cách này, ngay cả khi chỉ một phần bộ kiểm thử được thực hiện, các kịch bản quan trọng vẫn được xác nhận.

Bước 3: Tích Hợp CI/CD

Để thực hiện thực tế, tôi đã xây dựng một công cụ CLI phát hiện thay đổi, ánh xạ chúng tới các bài kiểm tra liên quan, và xuất ra danh sách bài kiểm tra đã lọc.

Ví dụ với GitHub Actions:

yaml Copy
jobs:
  codemaprt:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Chạy CodeMapRT
        run: |
          ./codemaprt detect
          ./codemaprt select
          ./gradlew test --tests $(cat selected-tests.txt)

CodeMapRT có thể tích hợp với bất kỳ hệ thống CI/CD nào — GitHub Actions, Jenkins, GitLab CI, TeamCity — giúp nó mở rộng cho các quy trình làm việc trong doanh nghiệp.

Ví Dụ Về Tình Huống

Hãy tưởng tượng một ứng dụng ngân hàng di động:

  • Một nhà phát triển sửa đổi module đăng nhập.
  • Thay vì chạy lại toàn bộ bộ kiểm thử hồi quy, CodeMapRT phân tích các thay đổi mã và chỉ chọn các bài kiểm tra tự động liên quan đến module đó.
  • Kết quả: thực hiện kiểm tra có mục tiêu, tăng tốc độ pipeline, phát hành nhanh hơn, và giảm tải cho hạ tầng.

Thay Đổi Trong Thực Tế

Với CodeMapRT, kiểm thử hồi quy không còn yêu cầu thực hiện toàn bộ bộ kiểm thử cho mỗi commit. Thay vào đó:

  • Commit nhỏ chỉ kích hoạt các bài kiểm tra liên kết với các module đã thay đổi.
  • Tính năng trung bình chạy một tập hợp tập trung thay vì hàng trăm bài kiểm tra không liên quan.
  • Chạy hồi quy toàn bộ vẫn khả thi cho các bản phát hành lớn, nhưng không còn cản trở quá trình phát triển hàng ngày.

Cách tiếp cận này rút ngắn vòng phản hồi, tối ưu hóa tài nguyên CI/CD và giúp các nhà phát triển nhanh chóng tự tin vào các thay đổi của họ.

Lợi Ích Của CodeMapRT

  • Tăng tốc chu kỳ phát hành — ít thời gian hơn để chạy các bài kiểm tra không cần thiết.
  • Duy trì độ phủ — các lối đi quan trọng vẫn được xác nhận.
  • Giảm chi phí — ít tài nguyên tiêu tốn trong các lần chạy hồi quy.
  • Mở rộng cho các dự án doanh nghiệp — thích ứng với các hệ thống lớn và phức tạp.

Kết Quả: Kiểm Thử Hồi Quy Thông Minh Hơn

Sau khi xây dựng một dự án demo với 50 bài kiểm tra tự động và tích hợp CodeMapRT:

  • Không có CodeMapRT: tất cả 50 bài kiểm tra đều chạy cho mỗi commit.
  • Với CodeMapRT: framework đã chọn 28 bài kiểm tra trực tiếp liên quan đến module đã thay đổi, cộng thêm 5 bài kiểm tra an toàn bổ sung (như đã mô tả ở Bước 2) → tổng cộng 33 bài kiểm tra.
  • Kết quả: giảm khoảng 34% số lần chạy bài kiểm tra, giảm tải cho CI trong khi vẫn đảm bảo rằng các kịch bản quan trọng vẫn được xác nhận.

Demo này cho thấy sự giảm thiểu một phần ba, nhưng cách tiếp cận có thể mở rộng: trong các dự án doanh nghiệp với hàng ngàn bài kiểm tra, CodeMapRT có thể mang lại hiệu quả cao hơn nữa, vì thường chỉ một phần nhỏ của bộ kiểm thử là liên quan đến một commit nhất định.

Bạn có thể tìm thấy kết quả demo trong GitHub Actions của kho lưu trữ CodeMapRT.

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