2016-05-20 26 views
5

Tôi có một bài kiểm tra giao tiếp qua một cổng TCP nơi tôi mong đợi máy chủ không phản hồi trong một khung thời gian đã định khi tôi gửi một thông báo nhất định.Thử nghiệm JUnit cho thời gian chờ mong đợi

Hành vi của máy chủ không phải là điều tôi có thể kiểm soát.

Tôi biết nóng để không thể kiểm tra nếu nó chưa hoàn thành trong một khung thời gian đã định. Nhưng làm thế nào tôi có thể làm ngược lại, làm cho nó vượt qua cho không hoàn thành trong khung thời gian?

Tôi có thể sử dụng @Test (timeout=1000) để thực hiện phép thử nếu không hoàn thành trong vòng một giây.

Nhưng, sử dụng Junit 4, có chức năng nào để kiểm tra thời gian chờ dự kiến ​​là kết quả tích cực không? I E. Bài kiểm tra sẽ thất bại nếu hoàn thành trong khung thời gian và vượt qua nếu không?

+0

Có timeout ném một ngoại lệ không? Nếu có, bạn có thể kiểm tra ngoại lệ thời gian chờ đó. – Compass

+0

Hãy cẩn thận với điều này, tôi không nghĩ rằng bạn có thể 'mong đợi' ngoại lệ được ném bởi 'timeout'. Bạn có thể sử dụng một bộ đếm thời gian hoặc chỉ cần kiểm tra thời gian hoạt động sau đó, nếu vượt quá thời gian mong muốn của bạn, hãy ném một ngoại lệ mà bạn mong đợi. Không có vẻ rất hiệu quả mặc dù. – Zircon

+2

Ngoài ra, mục đích của thử nghiệm chính xác là gì? Nếu nó đi ra khỏi phạm vi mã của bạn hạ lưu đến máy chủ, tôi không chắc chắn làm thế nào mang lại lợi ích là để kiểm tra kết thúc của bạn. Nếu bạn đang mong đợi mã của bạn để xử lý thời gian chờ, sau đó bạn chỉ nên giả lập các ổ cắm và ném ngoại lệ trở lại. – Compass

Trả lời

4

Câu hỏi hay. Trên thực tế, bạn có thể thực hiện việc này bằng cách chỉ sử dụng các công cụ junit. Ý tưởng của tôi là đảo ngược hành vi quy tắc Timeout + sử dụng expected thuộc tính của chú thích Test. Giới hạn duy nhất: bạn phải đặt bài kiểm tra của mình trong lớp riêng biệt, bởi vì Rule áp dụng cho tất cả các bài kiểm tra bên trong nó:

public class Q37355035 { 

    private static final int MIN_TIMEOUT = 100; 

    @Rule 
    public Timeout timeout = new Timeout(MIN_TIMEOUT) { 
     public Statement apply(Statement base, Description description) { 
      return new FailOnTimeout(base, MIN_TIMEOUT) { 
       @Override 
       public void evaluate() throws Throwable { 
        try { 
         super.evaluate(); 
         throw new TimeoutException(); 
        } catch (Exception e) {} 
       } 
      }; 
     } 
    }; 

    @Test(expected = TimeoutException.class) 
    public void givesTimeout() throws InterruptedException { 
     Thread.sleep(1000); 
    } 
} 
Các vấn đề liên quan