Đây gần đây là chủ đề trên bài đăng trên blog của Gradle Dừng chạy lại bài kiểm tra của bạn . Các tác giả cho thấy một ví dụ sử dụng outputs.upToDateWhen { false }
và giải thích lý do tại sao nó là sai:
Điều này không thực sự buộc chạy lại
Điều mà tác giả của đoạn trích này có lẽ muốn nói là Luôn luôn chạy lại các bài kiểm tra của tôi. Đó không phải là những gì đoạn trích này làm. Nó sẽ chỉ đánh dấu nhiệm vụ lỗi thời, buộc Gradle phải tạo lại đầu ra. Nhưng đây là điều, nếu bộ đệm xây dựng được bật, Gradle không cần chạy tác vụ để tạo lại đầu ra. Nó sẽ tìm thấy một mục trong bộ đệm và giải nén kết quả vào thư mục đầu ra của bài kiểm tra.
Điều này cũng đúng với đoạn trích này:
test.dependsOn cleanTest
Gradle sẽ giải nén các kết quả kiểm tra từ bộ đệm xây dựng sau khi đầu ra đã được làm sạch, vì vậy sẽ không có gì được chạy lại. Nói tóm lại, những đoạn trích này đang tạo ra một no-op rất đắt tiền.
Nếu bây giờ bạn đang nghĩ về Được rồi, tôi sẽ tắt bộ nhớ cache quá, hãy để tôi nói cho bạn biết tại sao bạn không nên.
Sau đó, tác giả tiếp tục giải thích tại sao chạy lại một số bài kiểm tra là lãng phí thời gian:
Phần lớn các bài kiểm tra của bạn nên có tính xác định, tức là được cung cấp cùng một đầu vào mà chúng sẽ tạo ra cùng một kết quả.
Trong một số trường hợp bạn muốn chạy lại các bài kiểm tra mà mã không thay đổi, bạn nên mô hình hóa chúng làm đầu vào. Dưới đây là cả hai ví dụ từ bài đăng trên blog cho thấy việc thêm một đầu vào để tác vụ sẽ sử dụng nó trong quá trình kiểm tra cập nhật của nó.
task randomizedTest(type: Test) {
systemProperty "random.testing.seed", new Random().nextInt()
}
task systemIntegrationTest(type: Test) {
inputs.property "integration.date", LocalDate.now()
}
Tôi khuyên bạn nên đọc toàn bộ bài viết trên blog.