Predictive test selection
Bài tóm tắt Meta 2018 3. Quy mô lớn Độ khó: Trung bình
Meta · 2018 · 3. Quy mô lớn · Độ khó: Trung bình — bài gốc
Bài ngoài sheet. Có bài báo đi kèm (arXiv 1810.05286). Số liệu do Facebook tự đo.
Bối cảnh
- Facebook dùng trunk-based development: thay đổi vào trunk phải hiện ngay với mọi kỹ sư, nên mỗi thay đổi phải được test hồi quy trước khi vào.
- Cách thường dùng là chọn test theo phụ thuộc build: mọi test phụ thuộc bắc cầu vào file bị sửa. Trong codebase nguyên khối, sản phẩm phụ thuộc vào nhiều thành phần dùng lại, các thành phần lại dựa vào vài thư viện tầng thấp, nên trung bình tới một phần tư toàn bộ test bị chọn cho mỗi thay đổi ở codebase mobile, phần lớn phụ thuộc bắc cầu thực ra không liên quan. Phân tích tác động tĩnh không dùng được vì codebase quá lớn và quá nhiều ngôn ngữ.
Thay đổi chính
- Đổi câu hỏi: thay vì "test nào có thể bị ảnh hưởng", hỏi "test này có khả năng bao nhiêu phát hiện hồi quy với thay đổi này". Mô hình học từ lịch sử thay đổi và kết quả test (gradient-boosted decision tree: giải thích được, dễ huấn luyện, có sẵn trong hạ tầng ML), áp lên đặc trưng trừu tượng của thay đổi mới, chấm điểm từng test trong tập phụ thuộc bắc cầu rồi chọn những test dễ fail nhất.
- Ngưỡng chất lượng ở production: đoán đúng hơn 95% kết quả test và bắt được ít nhất một test fail cho hơn 99,9% thay đổi có lỗi. Huấn luyện lại định kỳ bằng kết quả của các thay đổi gần đây để theo kịp codebase.
- Test flaky: nếu không tách lỗi flaky, mô hình học sai. Khi thu dữ liệu huấn luyện, test fail được retry mạnh tay để phân biệt fail ổn định (hồi quy thật) với fail không lặp lại được.
Kết quả (theo Facebook)
- Chạy hơn một năm: bắt hơn 99,9% hồi quy trước khi chúng lên trunk, trong khi chỉ chạy khoảng một phần ba số test phụ thuộc bắc cầu vào code bị sửa; hiệu suất hạ tầng test tăng gấp đôi. Gần như không cần chỉnh tay.
Vì sao
- Phụ thuộc build trả lời "có thể ảnh hưởng" quá rộng ở monorepo; xác suất học từ lịch sử cho phép đánh đổi tường minh giữa chi phí và tỉ lệ lỗi lọt, với một ngưỡng đặt trước.
Bài học cho SWE
- Chọn test là bài toán đánh đổi chi phí với tỉ lệ lọt; nên đặt ngưỡng lọt (ở đây 0,1% thay đổi lỗi) và đo nó liên tục.
- Dữ liệu test bẩn vì flaky sẽ làm hỏng mọi cách chọn test dựa trên lịch sử; tách flaky trước.
- Phần lọt qua cần lớp bảo vệ sau (ở Facebook còn Sapienz sinh test, Getafix đề xuất bản sửa).
Liên quan
- Stripe 2026 (chọn theo phụ thuộc, không nêu tỉ lệ lọt) · Uber 2022
- CI và build ở quy mô lớn
#Trunk-based development#Regression test selection#Build dependency#Predictive test selection#Gradient-boosted decision tree#Flaky test#Retry#Retraining#Monorepo
Được nhắc tới trong
Chủ đề (1)
Công ty (1)
Bài tóm tắt (5)