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
# 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
@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ệ:
- 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 đủ.
- 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
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.