2012-01-31 49 views
9

Có những câu hỏi khác về vấn đề này, nhưng tôi đang cố gắng tìm cách tiếp cận kiểm tra đơn vị một cái gì đó như thế này:Làm thế nào để viết bài kiểm tra đơn vị kiểm tra bất biến đồng thời

public class Semaphore extends Lock { 
     private AtomicInteger semaphore = new AtomicInteger(0); 
     public synchronized boolean available() { 
       return semaphore.intValue() == 0; 
     } 
     public synchronized void acquire() { 
      semaphore.incrementAndGet(); 

     } 
     public synchronized void release() { 
      semaphore.decrementAndGet(); 
     } 
    } 

Đây là cơ chế dệt ở nhà khóa của tôi (chỉ vì mục đích học tập). Làm thế nào tôi sẽ kiểm tra sự an toàn thread này? Tôi biết rằng không có đảm bảo khi nói đến đơn vị kiểm tra mã đồng thời, nhưng làm thế nào tôi thậm chí sẽ đi về viết một bài kiểm tra đơn vị mà ATTEMPTS để kiểm tra các bất biến rõ ràng vốn có trong cơ chế khóa này?

+0

Phân tích tĩnh không? – UmNyobe

+0

Không, không hoàn toàn nằm ngoài câu hỏi. Nhưng tôi tự hỏi thử nghiệm đơn vị nào thậm chí sẽ trông giống như thế này ... một lần nữa, thừa nhận rằng không có số lượng các bài kiểm tra đơn vị đảm bảo bất cứ điều gì khi nói đến đồng thời. – LuxuryMode

+2

Nói chung, bạn sử dụng các thủ thuật khác nhau - chạy một loạt các chủ đề được gửi ngẫu nhiên, giải phóng một khóa trong một luồng trong khi hai chủ đề khác đang quay trên đó, v.v. Đó là một tác phẩm nghệ thuật. –

Trả lời

5

Tôi đoán tôi sẽ trả lời câu hỏi của riêng mình vì tôi đã thực hiện một số nghiên cứu. Có một khuôn khổ tuyệt vời được gọi là MultithreadedTC. Nó cho phép bạn thiết lập các thử nghiệm như vậy:

public class SafeSemaphoreTest extends MultithreadedTestCase { 

    private SafeSemaphore semaphore; 
    AtomicInteger ai = new AtomicInteger(0); 

    @Override 
    public void initialize() { 
     semaphore = new SafeSemaphore(); 
    } 


    public void thread1() throws InterruptedException { 

     assertTick(0); 

     semaphore.acquire(); 
     waitForTick(2); 
     assertTick(2); 

     semaphore.acquire(); 
     assertEquals(semaphore.getValue(), 2); 
     assertEquals(semaphore.getValue()==3, false); 
     semaphore.release(); 
     semaphore.release(); 

    } 

    public void thread2() throws InterruptedException { 
     waitForTick(1); 
     assertTick(1); 
     assertEquals(semaphore.available(), false); 
     waitForTick(3); 
     assertTick(3); 
     assertEquals(semaphore.available(), true); 

    } 

} 

trong đó waitForTick (int) gọi khối chuỗi hiện tại cho đến khi đạt được dấu. Thậm chí có một số phát triển để làm cho điều này trở nên hiện đại hơn một chút để tích hợp JUnit tốt hơn: http://janvanbesien.blogspot.com/2009/06/modernizing-multithreadedtc-junit-4.html

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