Họ đang đo gì
Bạn có coi sức khoẻ của bộ test là thứ phải quản lý không, và có biết nguyên nhân phổ biến của rung.
Trả lời ngắn~30 giây
Trước hết đo: gắn nhãn mỗi lần chạy và tính tỷ lệ thất bại trên mỗi test, để có danh sách theo mức độ chứ không theo cảm giác. Rồi cách ly những test rung nhất ra khỏi luồng chặn PR — không phải để bỏ qua chúng mà để CI đỏ lại có nghĩa là hỏng thật. Sau đó sửa theo thứ tự, và đặt hạn: test rung không được sửa trong hai tuần thì xoá. Một test không ai tin là một test có chi phí mà không có giá trị.
Giải thích sâu
Nguyên nhân rung tập trung vào bốn nhóm. Thời gian: sleep cố định thay vì chờ điều kiện, hoặc test phụ thuộc vào thời điểm chạy. Thứ tự: test chia sẻ trạng thái nên chạy riêng thì xanh mà chạy cùng nhau thì đỏ — chạy bộ test theo thứ tự ngẫu nhiên sẽ phơi bày ngay. Đồng thời: hai test dùng chung một bản ghi database. Và môi trường: phụ thuộc mạng, múi giờ, locale của máy chạy.
Nhóm thời gian đáng nói riêng vì cách sửa gần như luôn giống nhau: thay sleep(500) bằng chờ có điều kiện với thời hạn (waitFor cho tới khi phần tử xuất hiện, tối đa 5 giây). Nó vừa nhanh hơn ở trường hợp thường vừa ổn định hơn khi máy CI chậm — mà máy CI thì luôn chậm hơn máy dev đúng vào lúc bạn không mong đợi.
Phần khó nhất không phải sửa mà là giữ cho nó không quay lại. Nếu không ai sở hữu sức khoẻ bộ test thì tỷ lệ rung sẽ bò lên lại trong vài tháng. Cách hiệu quả mình thấy là để nó thành một chỉ số hiển thị công khai cùng với thời gian chạy CI, và coi một test rung mới như một lỗi cần sửa chứ không phải phiền toái cần chịu đựng.
Câu hỏi tiếp theo họ sẽ hỏi
?Tự động retry test có chấp nhận được không?
Chỉ như một biện pháp tạm thời có ghi nhận, không phải giải pháp. Vấn đề là retry biến một test rung thành vô hình, nên bạn mất luôn tín hiệu để sửa. Nếu bật retry thì phải ghi lại và báo cáo số lần retry, nếu không bạn chỉ đang giấu vấn đề.
Trả lời thế này là mất điểm
- Thêm
sleepdài hơn để test hết rung. Bạn vừa làm CI chậm hơn và vấn đề vẫn còn nguyên. - Coi rung là chuyện bình thường. Từ lúc đó, mọi lần đỏ đều bị bỏ qua, kể cả lần đỏ thật.