2012-01-05 8 views
8

Tôi muốn không xây dựng nếu bất cứ ai viết một bài kiểm tra mất nhiều hơn 1 giây để chạy, nhưng nếu tôi chạy trong chế độ perTest phải mất nhiều, lâu hơn nữa.Cách tốt nhất để thiết lập thời gian chờ cho mỗi bài kiểm tra hoặc mỗi lớp khi sử dụng <junit> trong forkmode perBatch là gì?

Tôi có thể viết một nhiệm vụ tùy chỉnh phân tích các báo cáo junit và không xây dựng dựa trên đó, nhưng tôi đã tự hỏi nếu có ai biết hoặc có thể nghĩ ra một lựa chọn tốt hơn.

Trả lời

7

Nếu bạn sử dụng JUnit 4 và @Test, bạn có thể chỉ định tham số timeout sẽ không thực hiện được một thử nghiệm mất nhiều thời gian hơn được chỉ định. Nhược điểm cho điều đó là bạn phải thêm nó vào mọi phương pháp thử nghiệm.

Một lựa chọn tốt hơn có thể là sử dụng @Rule với org.junit.rules.Timeout. Với điều này, bạn có thể làm điều đó cho mỗi lớp (hoặc thậm chí trong một lớp học được chia sẻ).

+0

Thời gian chờ '@ Rule' rất tuyệt. Thật đáng tiếc bạn không thể làm điều này trên một '@ Suite'. Hoặc bạn có thể? – avandeursen

+0

Hmm. Thay vì thêm @Rule vào mọi lớp, tôi tự hỏi liệu có cách nào tương đối dễ dàng để thêm nó vào tất cả các lớp trong thời gian chạy không? –

+0

@ Jun-DaiBates-Kobashigawa - Bạn có thể sử dụng một lớp cơ sở kiểm tra trường hợp tùy chỉnh như bạn đã từng làm với Junit 3. Không lý tưởng nhưng là một cách giải quyết tốt. –

10

Khôi phục câu hỏi cũ vì câu trả lời không cung cấp ví dụ.

Bạn có thể chỉ định thời gian chờ

  1. mỗi phương pháp thử nghiệm:

    @Test(timeout = 100) // Exception: test timed out after 100 milliseconds 
    public void test1() throws Exception { 
        Thread.sleep(200); 
    } 
    
  2. Đối với tất cả các phương pháp trong một lớp học thử nghiệm sử dụng Timeout@Rule:

    @Rule 
    public Timeout timeout = new Timeout(100); 
    
    @Test // Exception: test timed out after 100 milliseconds 
    public void methodTimeout() throws Exception { 
        Thread.sleep(200); 
    } 
    
    @Test 
    public void methodInTime() throws Exception { 
        Thread.sleep(50); 
    } 
    
  3. toàn cầu cho tổng số thời gian để chạy tất cả các phương pháp thử s trong lớp sử dụng một tĩnh Timeout@ClassRule:

    @ClassRule 
    public static Timeout classTimeout = new Timeout(200); 
    
    @Test 
    public void test1() throws Exception { 
        Thread.sleep(150); 
    } 
    
    @Test // InterruptedException: sleep interrupted 
    public void test2() throws Exception { 
        Thread.sleep(100); 
    } 
    
  4. Và thậm chí áp dụng thời gian chờ (hoặc @Rule hoặc @ClassRule) để all classes in your entire suite:

    @RunWith(Suite.class) 
    @SuiteClasses({ Test1.class, Test2.class}) 
    public class SuiteWithTimeout { 
        @ClassRule 
        public static Timeout classTimeout = new Timeout(1000); 
    
        @Rule 
        public Timeout timeout = new Timeout(100); 
    } 
    

EDIT: timeout đã bị phản đối thời gian gần đây để sử dụng lần khởi tạo này

@Rule 
public Timeout timeout = new Timeout(120000, TimeUnit.MILLISECONDS); 

Bạn nên cung cấp Timeunit ngay bây giờ, vì điều này sẽ cung cấp chi tiết hơn cho mã của bạn.

+0

Tuyệt. Tôi đã ngừng sử dụng JUnit khá lâu rồi. Tùy chọn cuối cùng có vẻ tốt, mặc dù những gì tôi đang tìm kiếm vào thời điểm đó là một cách để hết thời gian chờ tất cả các thử nghiệm chạy từ Ant/Gradle trên toàn cầu để thực thi thời gian chờ 1 giây cho mọi thử nghiệm trong dự án. cho tất cả mọi người làm việc trong dự án 400 người này để tranh luận). –