2009-05-03 16 views
32

क्या जुनीट में समूह परीक्षण करने का कोई तरीका है, ताकि मैं केवल कुछ समूह चला सकूं?ग्रुपिंग जुनीट परीक्षण

या क्या कुछ परीक्षणों को एनोटेट करना संभव है और फिर उन्हें वैश्विक रूप से अक्षम करना संभव है?

मैं JUnit 4 का उपयोग कर रहा हूं, मैं टेस्टएनजी का उपयोग नहीं कर सकता।

संपादित करें: @RunWith और @SuiteClasses महान काम करता है। लेकिन क्या टेस्ट क्लास में केवल कुछ परीक्षणों की तरह एनोटेट करना संभव है? या मुझे पूरे टेस्ट क्लास को एनोटेट करना है?

+0

संबंधित: http://stackoverflow.com/questions/457276/junit4-test-suites/4952225#4952225 – cmcginty

+0

'@ रनविथ 'और' @ सुइट क्लासेस 'बिल्कुल अच्छा नहीं है, http: // stackoverflow पर देखें। कॉम/प्रश्न/18894951 – Val

+0

आईएमएचओ, दूसरा जवाब स्वीकार्य उत्तर होना चाहिए - जूनिट 4.8 – Srikanth

उत्तर

9

क्या आप एक परीक्षा कक्षा के अंदर परीक्षण समूह करना चाहते हैं या आप परीक्षण कक्षाओं को समूहित करना चाहते हैं? मैं बाद वाले को मानने जा रहा हूँ।

यह इस बात पर निर्भर करता है कि आप अपने परीक्षण कैसे चला रहे हैं। यदि आप उन्हें मेवेन द्वारा चलाते हैं, तो यह निर्दिष्ट करना संभव है कि आप कौन से परीक्षण शामिल करना चाहते हैं। इसके लिए the Maven surefire documentation देखें।

अधिक आम तौर पर, हालांकि, मैं क्या करता हूं कि मेरे पास परीक्षण सूट का पेड़ है।

@RunWith(Suite.class) 
@SuiteClasses(SomeUnitTest1.class, SomeUnitTest2.class) 
public class UnitTestsSuite { 
} 

तो, शायद मैं एक FunctionTestsSuite और एक UnitTestsSuite, और फिर एक AllTestsSuite जो अन्य दो भी शामिल है: JUnit 4 में एक टेस्ट स्वीट तरह दिखता है। यदि आप उन्हें ग्रहण में चलाते हैं तो आपको बहुत अच्छा पदानुक्रमित दृश्य मिलता है।

इस दृष्टिकोण के साथ समस्या यह है कि यदि आप एक से अधिक अलग तरीकों से परीक्षणों को टुकड़ा करना चाहते हैं तो यह बहुत ही कठिन है। लेकिन यह अभी भी संभव है (उदाहरण के लिए आप सूट का एक सेट कर सकते हैं जो मॉड्यूल पर आधारित टुकड़ा है, फिर परीक्षण के प्रकार पर एक और टुकड़ा)।

+5

के बाद से आधिकारिक समूह समर्थन समर्थन वाक्यविन्यास का उपयोग करना था: @SuiteClasses ({SomeUnitTest1.class, SomeUnitTest2.class}) –

+0

@MatthewHegarty धन्यवाद, लेकिन अगली कृपया समय अगर आपने कोड पर टाइपो एएसपी देखा है, तो संपादन करने में संकोच न करें। 'कृपया इसे टिप्पणी के रूप में पोस्ट न करें' (क्योंकि टिप्पणी अन्य टिप्पणियों के प्रवाह से दफन हो सकती है) वास्तव में समुदाय के लिए यह बहुत ही अनुपयोगी है। धन्यवाद! –

1

आप परीक्षण Suite वस्तुओं का परीक्षण कर सकते हैं जिनमें परीक्षण के समूह होते हैं। वैकल्पिक रूप से, आपके आईडीई (ग्रहण की तरह) किसी दिए गए पैकेज में निहित सभी परीक्षणों को चलाने के लिए समर्थन हो सकता है।

8

वैश्विक रूप से उन्हें अक्षम करने के लिए, जुनीट (4.5+) के दो तरीके हैं एक नई विधि का उपयोग करने के लिए है। यदि आप इसे टेस्ट क्लास के @BeforeClass (या @Before) में डालते हैं, और यदि स्थिति विफल हो जाती है, तो यह परीक्षण को अनदेखा कर देगी। इस स्थिति में आप एक सिस्टम प्रॉपर्टी या कुछ और डाल सकते हैं जिसे वैश्विक स्तर पर सेट या बंद किया जा सकता है।

दूसरा विकल्प एक कस्टम धावक बनाना है जो वैश्विक संपत्ति और प्रतिनिधियों को उपयुक्त धावक को समझता है। यह दृष्टिकोण बहुत अधिक भंगुर है (चूंकि जुनीट 4 आंतरिक धावक अस्थिर हैं और रिलीज से रिलीज होने के लिए बदला जा सकता है), लेकिन इसका एक वर्ग पदानुक्रम में विरासत में शामिल होने और उप-वर्ग में ओवरराइड होने का लाभ है। यदि आपको विरासत JUnit38 कक्षाओं का समर्थन करना है तो यह ऐसा करने का एकमात्र यथार्थवादी तरीका भी है।

कस्टम रनर करने के लिए यहां कुछ कोड दिया गया है। क्या प्राप्त होता है इसके बारे में AppropriateRunnerForClass कर सकता है, जिस तरह से मैंने इसे लागू किया था, एक अलग एनोटेशन होना था जो कस्टम धावक को क्या चलाना है, बताता है। एकमात्र विकल्प जुनीट कोड से कुछ बहुत ही भंगुर प्रतिलिपि पेस्ट था।

private class CustomRunner implements Runner 
private Runner runner; 

    public CustomRunner(Class<?> klass, RunnerBuilder builder) throws Throwable { 
     if (!isRunCustomTests()) { 
      runner = new IgnoredClassRunner(klass); 
     } else { 
      runner = getAppropriateRunnerForClass(klass, builder); 
    } 

    public Description getDescription() { 
     return runner.getDescription(); 
    } 

    public void run(RunNotifier notifier) { 
     runner.run(notifier); 
    } 
} 

संपादित करें: @RunWith टैग केवल पूरी कक्षा के लिए काम करता है। उस सीमा के आसपास काम करने का एक तरीका है परीक्षण विधियों को एक स्थिर आंतरिक कक्षा में स्थानांतरित करना और उसे एनोटेट करना। इस तरह आपको कक्षा के संगठन के साथ एनोटेशन का लाभ है। लेकिन, ऐसा करने से किसी भी @ पहले या @BeforeClass टैग में मदद नहीं मिलेगी, आपको आंतरिक कक्षा में उन्हें फिर से बनाना होगा। यह बाहरी वर्ग की विधि को कॉल कर सकता है, लेकिन इसे हुक के रूप में अपना स्वयं का तरीका रखना होगा।

71

JUnit 4.8 का समर्थन करता है समूहीकरण:

public interface SlowTests {} 
public interface IntegrationTests extends SlowTests {} 
public interface PerformanceTests extends SlowTests {} 

और फिर ...

public class AccountTest { 

    @Test 
    @Category(IntegrationTests.class) 
    public void thisTestWillTakeSomeTime() { 
     ... 
    } 

    @Test 
    @Category(IntegrationTests.class) 
    public void thisTestWillTakeEvenLonger() { 
     ... 
    } 

    @Test 
    public void thisOneIsRealFast() { 
     ... 
    } 
} 

और अंत में,

@RunWith(Categories.class) 
@ExcludeCategory(SlowTests.class) 
@SuiteClasses({ AccountTest.class, ClientTest.class }) 
public class UnitTestSuite {} 

यहाँ से लिया: http://weblogs.java.net/blog/johnsmart/archive/2010/04/25/grouping-tests-using-junit-categories-0

इसके अलावा, Arquillian यह स्वयं समूहकरण का समर्थन करता है: https://github.com/weld/core/blob/master/tests-arquillian/src/test/java/org/jboss/weld/tests/Categories.java

3

JUnit Test Groups आज़माएं। प्रलेखन से:

@TestGroup("integration") 
public class MyIntegrationTest { 
    @ClassRule 
    public static TestGroupRule rule = new TestGroupRule(); 

    ... 
} 
  • एक साधारण परीक्षण समूह निष्पादित करें: -Dtestgroup = एकीकरण
  • कई परीक्षण समूहों निष्पादित करें: -Dtestgroup = GROUP1, GROUP2
  • निष्पादित सभी परीक्षण समूहों: -Dtestgroup = सभी
0

आप टेस्ट सूट (http://qaautomated.blogspot.in/2016/09/junit-test-suits-and-test-execution.html) का उपयोग कर सकते हैं या आप अपने परीक्षण मामलों को प्रभावी ढंग से समूहित करने के लिए जूनिट श्रेणियां (http://qaautomated.blogspot.in/2016/09/junit-categories.html) कर सकते हैं।

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