2012-01-05 9 views
8

मैं बिल्ड में विफल होना चाहता हूं अगर कोई परीक्षण लिखने में 1 सेकंड से अधिक समय लेता है, लेकिन यदि मैं प्रतितम मोड में चलता हूं तो इसमें बहुत अधिक समय लगता है।प्रति बैच फोर्कोड में <junit> का उपयोग करते समय प्रति-परीक्षण या प्रति-वर्ग टाइमआउट सेट अप करने का सबसे अच्छा तरीका क्या है?

मैं शायद एक कस्टम कार्य लिख सकता हूं जो जूनिट रिपोर्ट को पार करता है और उस पर आधारित निर्माण में विफल रहता है, लेकिन मैं सोच रहा था कि कोई बेहतर विकल्प के बारे में जानता है या सोच सकता है।

उत्तर

7

यदि आप जुनीट 4 और @Test का उपयोग करते हैं, तो आप timeout पैरामीटर निर्दिष्ट कर सकते हैं जो निर्दिष्ट परीक्षण से अधिक समय ले रहा है। इसके लिए डाउनसाइड यह है कि आपको इसे प्रत्येक टेस्ट विधि में जोड़ना होगा।

org.junit.rules.Timeout के साथ @Rule का उपयोग शायद एक बेहतर विकल्प है। इसके साथ, आप इसे प्रति वर्ग (या यहां तक ​​कि एक साझा सुपर क्लास में भी कर सकते हैं) कर सकते हैं।

+0

टाइमआउट 'नियम 'अच्छा है। करुणा आप इसे '@ सुइट' पर नहीं कर सकते हैं। या आप कर सकते हैं – avandeursen

+0

हम्म। प्रत्येक वर्ग में @ रूल जोड़ने की बजाय, मुझे आश्चर्य है कि रनटाइम पर सभी कक्षाओं में इसे जोड़ने का अपेक्षाकृत आसान तरीका है? –

+0

@ जून-दाईबेट्स-कोबाशिगावा - आप एक कस्टम टेस्ट केस बेस क्लास का उपयोग कर सकते हैं जैसा कि आप जूनिट 3 के साथ करते थे। आदर्श नहीं बल्कि एक सभ्य कामकाज। –

10

एक पुराना प्रश्न जारी करना क्योंकि उत्तर एक उदाहरण प्रदान नहीं करता है।

आप टाइमआउट

  1. परीक्षा पद्धति प्रति निर्दिष्ट कर सकते हैं:

    @Test(timeout = 100) // Exception: test timed out after 100 milliseconds 
    public void test1() throws Exception { 
        Thread.sleep(200); 
    } 
    
  2. एक परीक्षण कक्षा में सभी विधियों के लिए का उपयोग कर 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. वैश्विक स्तर पर कुल

    सभी परीक्षण विधि चलाने के लिए समय एक स्थिर 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. और यहां तक ​​कि लागू टाइमआउट (या तो @Rule या @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); 
    } 
    

संपादित करें: टाइमआउट हाल ही में पदावनत किया गया था का उपयोग करने यह प्रारंभिकरण

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

आपको अब टाइम्यूनिट प्रदान करना चाहिए, क्योंकि यह आपके कोड को और अधिक ग्रैन्युलरिटी प्रदान करेगा।

+0

अच्छा। मैंने कुछ समय पहले जुनीट का उपयोग करना बंद कर दिया था। आखिरी विकल्प अच्छा दिखता है, हालांकि उस समय मैं जो खोज रहा था वह वैश्विक स्तर पर चींटी/ग्रैडल से चलने वाले सभी परीक्षणों का समय था, ताकि परियोजना में हर परीक्षण के लिए 1 सेकंड का समय-समय पर लागू किया जा सके (अनिवार्य रूप से एक बाधा के रूप में इस 400 व्यक्ति परियोजना में काम करने वाले हर किसी के लिए संघर्ष करने के लिए)। –

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

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