2012-01-31 6 views
9

इस मुद्दे के बारे में अन्य सवाल कर रहे हैं, लेकिन मैं कैसे इस तरह इकाई परीक्षण कुछ दृष्टिकोण लगाने की कोशिश कर रहा हूँ:कैसे इकाई परीक्षण लिखने के लिए कि संगामिति अपरिवर्तनशीलताओं परीक्षण

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(); 
     } 
    } 

यह मेरा पहनें ताला तंत्र (है सिर्फ सीखने के उद्देश्यों के लिए)। मैं इस धागे की सुरक्षा का परीक्षण कैसे करूं? मुझे पता है कि यूनिट परीक्षण समवर्ती कोड की बात होने पर कोई गारंटी नहीं है, लेकिन मैं इस यूनिट परीक्षण को लिखने के बारे में भी कहूंगा कि ATTEMPTS इस लॉकिंग तंत्र में निहित स्पष्ट आविष्कारों का परीक्षण करने के लिए कैसे?

+0

क्या स्थिर विश्लेषण प्रश्न से बाहर है? – UmNyobe

+0

नहीं, पूरी तरह से सवाल से बाहर नहीं। लेकिन मैं और सोच रहा हूं कि एक यूनिट टेस्ट इस तरह की चीज़ के लिए कैसा दिखता है ... फिर से, यह स्वीकार करते हुए कि समेकन की बात होने पर यूनिट परीक्षणों की कोई भी राशि गारंटी नहीं देती है। – LuxuryMode

+2

आम तौर पर, आप विभिन्न चालें नियोजित करते हैं - थ्रेडों का एक गुच्छा यादृच्छिक रूप से प्रेषित किया जाता है, एक थ्रेड में लॉक जारी करते हैं जबकि दो अन्य धागे इस पर कताई कर रहे हैं, आदि। यह एक कला है। –

उत्तर

5

मुझे लगता है कि मैंने कुछ शोध किया है क्योंकि मैं अपने स्वयं के प्रश्न का उत्तर दूंगा। MultithreadedTC नामक एक महान ढांचा है। यह तुम इतनी तरह परीक्षण स्थापित करने के लिए अनुमति देता है:

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); 

    } 

} 

जहां waitForTick (int) कॉल वर्तमान थ्रेड ब्लॉक कर जब तक टिक पहुँच जाता है। बेहतर जुनीट एकीकरण के लिए इसे थोड़ा और आधुनिक बनाने के लिए कुछ विकास भी था: http://janvanbesien.blogspot.com/2009/06/modernizing-multithreadedtc-junit-4.html

संबंधित मुद्दे