Tôi đang sử dụng JUnit 4.10 để chạy bộ thử nghiệm và tôi đã thực hiện quy tắc "thử lại không thành công" sau ghi chú tuyệt vời của Matthew Farwell trong bài đăng How to Re-run failed JUnit tests immediately?. Tôi tạo ra một lớp "RetryTestRule" với đoạn mã sau:Làm thế nào để áp dụng một JUnit @Rule cho tất cả các trường hợp thử nghiệm trong một bộ
public class RetryTestRule implements TestRule {
private final int retryCount;
public RetryTestRule(int retryCount) {
this.retryCount = retryCount;
}
@Override
public Statement apply(Statement base, Description description) {
return statement(base, description);
}
private Statement statement(final Statement base, final Description description) {
return new Statement() {
@Override
public void evaluate() throws Throwable {
Throwable caughtThrowable = null;
// retry logic
for (int i = 0; i < retryCount; i++) {
try {
base.evaluate();
return;
} catch (Throwable t) {
caughtThrowable = t;
System.err.println(description.getDisplayName() + ": run " + (i + 1) + " failed");
}
}
System.err.println(description.getDisplayName() + ": Giving up after " + retryCount
+ " failures");
throw caughtThrowable;
}
};
}
}
Khi sử dụng này như một quy luật bên trong một trường hợp thử nghiệm nó hoạt động hoàn hảo, nhưng có vẻ như không tối ưu để sử dụng các ký hiệu @Rule trong mọi trường hợp thử nghiệm của một bộ thay vì một ký hiệu duy nhất trong định nghĩa Suite, vì vậy sau khi kiểm tra một chút tôi đã thử các ký hiệu @ClassRule mới trong lớp Suite của tôi:
@RunWith(Suite.class)
@SuiteClasses({
UserRegistrationTest.class,
WebLoginTest.class
})
public class UserSuite {
@ClassRule
public static RetryTestRule retry = new RetryTestRule(2);
}
vấn đề là điều này không làm việc như mong đợi: thất bại kiểm tra không được thử lại . Có ai đã thử điều này và biết một giải pháp? Giúp đỡ được nhiều đánh giá cao!
Có thể trùng lặp: http://stackoverflow.com/questions/7639353/how-to-define-junit-method-rule-in-a-suite – pholser
Bạn hoàn toàn không thấy đơn vị của mình lo lắng kiểm tra thất bại một cách ngẫu nhiên? – Tobb