2010-10-26 39 views
6

Tôi đang cố gắng kiểm tra java.util.concurrent.ConcurrentLinkedQueue khi được truy cập qua nhiều luồng. Được đề cập dưới đây là bài kiểm tra Junit của tôi sử dụng RepeatedTest để chạy trong hai chuỗi đồng thời. Câu hỏi của tôi là: là nó đúng để sử dụng RepeatedTest để kiểm tra đồng thời ví dụ trên ConcurrentLinkedQueue? Mã nguồn được đề cập bên dưới.Junit để thử nghiệm đồng thời

Cảm ơn

import java.util.concurrent.ConcurrentLinkedQueue; 
import junit.extensions.ActiveTestSuite; 
import junit.extensions.RepeatedTest; 
import junit.extensions.TestSetup; 
import junit.framework.TestCase; 

public class TestNonBlockingConcurrentQueue extends TestCase{ 

private static ConcurrentLinkedQueue clq; 

public void testPut() throws Exception { 
    int messageCounter = 0; 
    for(;messageCounter <10000; messageCounter++){ 
     clq.offer(messageCounter); 
    } 
    assertEquals(clq.size(), messageCounter); 
} 

public void testGet() throws Exception { 
    while(!clq.isEmpty()){ 
     clq.poll(); 
    } 
    assertEquals("Size should be zero", clq.size(), 0); 
} 

public static junit.framework.Test suite() { 
    ActiveTestSuite ats = new ActiveTestSuite(); 

    TestSetup setup = new TestSetup(ats) { 
     protected void setUp() throws Exception { 
      System.out.println("Creating ConcurrentLinkedQueue.."); 
      clq = new ConcurrentLinkedQueue(); 
     } 
     protected void tearDown() throws Exception { 
      clq = null; 
     } 
    }; 
    ats.addTest(new RepeatedTest(new TestNonBlockingConcurrentQueue("testPut"), 2)); 
    ats.addTest(new RepeatedTest(new TestNonBlockingConcurrentQueue("testGet"), 2)); 
    return setup; 

} 

public TestNonBlockingConcurrentQueue(String testName){ 
    super(testName); 
} 

Trả lời

7

JUnitPerf sử dụng RepeatedTest để kiểm tra mã đồng thời nên có vẻ như hợp lý để sử dụng nó để làm điều tương tự với thử nghiệm của bạn ở trên, xem:

http://www.clarkware.com/software/JUnitPerf.html

Có khác các phương pháp để kiểm tra đơn vị mã đồng thời, mặc dù không có mã nào trong số chúng thực sự có thể xác minh rằng mã của bạn là an toàn:

Xem thêm: kiểm tra Unit Testing Concurrent Code

-1

Bạn có thể không bao giờ thực sự chạy để kiểm tra các vấn đề đồng thời. Thực tế là không có vấn đề nào xuất hiện trên một máy kiểm tra cụ thể (trên một hệ điều hành đã cho, với một số lõi hoặc bộ vi xử lý nhất định, hoặc thậm chí chỉ các tiến trình khác đang chạy cùng một lúc) không có nghĩa là không có vấn đề gì.

+2

Điều này cũng đúng đối với các sự cố không đồng thời. Để trích dẫn 'Edsger W. Dijkstra': * Thử nghiệm cho thấy sự hiện diện, không phải là sự vắng mặt của các lỗi. *. – whiskeysierra

+0

@Willi, tuyệt đối! Nó chỉ là vấn đề đồng thời có xu hướng khó phát hiện hơn, tôi nghĩ vậy. – Bruno

+1

Tất nhiên bạn có thể viết các bài kiểm tra cho các vấn đề tương tranh. Bạn chắc chắn không thể viết các bài kiểm tra là bằng chứng về sự vắng mặt của các lỗi, nhưng bạn vẫn có thể kiểm tra sự hiện diện của các lỗi cụ thể. Tuy nhiên, những thử nghiệm này có thể phức tạp để viết. –

Các vấn đề liên quan