क्या मैं टेस्टएनजी टेस्ट केस पर एक क्लास वाइड ग्रुप निर्दिष्ट कर सकता हूं?

मेरे पास बेस क्लास है जो टेस्टएनजी में डेटाबेस टेस्ट का प्रतिनिधित्व करता है, और मैं यह निर्दिष्ट करना चाहता हूं कि इस वर्ग से विस्तारित सभी वर्ग समूह "डीबी-टेस्ट" के समूह हैं, हालांकि मुझे पता चला है कि यह संभव नहीं लगता है। मैंने @ टेस्ट एनोटेशन की कोशिश की है:

@Test(groups = { "db-test" })
public class DBTestBase {
}

हालांकि, यह काम नहीं करता है क्योंकि @ टेस्ट एनोटेशन परीक्षणों में विधियों का एक समूह बनाने की कोशिश करेगा, और जांच चलने पर चेतावनियों/त्रुटियों को ग्रहण में पॉप अप करें।

तो मैंने परीक्षण को अक्षम करने का प्रयास किया, इसलिए कम से कम समूहों को असाइन किया गया है:

@Test(enabled = false, groups = { "db-test" })
public class DBTestBase {
}

लेकिन फिर किसी भी @BeforeTest (और अन्य समान टिप्पणियां) भी अक्षम हो जाते हैं ... जो निश्चित रूप से मैं नहीं चाहता हूं।

मैं किसी विशेष प्रकार के समूह के रूप में कक्षा को एनोटेट करने का कोई तरीका चाहूंगा, लेकिन यह टेस्टएनजी में काफी प्रतीत नहीं होता है। क्या किसी के पास कोई दूसरा विचार है?

0
ro fr bn
बस अपने टेस्टएनजी 'वर्ग-व्यापी समूह' समस्या के लिए एक संभावित समाधान जोड़ा गया। क्या आप इसे देख सकते हैं, और मुझे बताएं कि क्या यह सही दिशा में जाता है?
जोड़ा लेखक VonC, स्रोत

5 उत्तर

मुझे यकीन नहीं है कि एनोटेशन विरासत टेस्टएनजी के लिए कैसे काम करती है लेकिन यह आलेख कुछ उपयोगों का हो सकता है। http://beust.com/weblog/archives/000170.html

दरअसल, यह बेहतर http://testng.org/doc/documentation-main की मदद कर सकता है। एचटीएमएल # एनोटेशन , उत्तराधिकारी समूह देखें।

0
जोड़ा

यह मुझे निम्न कोड-चुनौती (समुदाय विकी पोस्ट) के रूप में प्रतीत होता है:

समूह 'एग्लोबल ग्रुप' समूह से विस्तारित कक्षा के सभी परीक्षण विधियों को निष्पादित करने में सक्षम कैसे हो:

  • विस्तारित कक्षा पर 'aGlobalGroup' समूह निर्दिष्ट करना?
  • विस्तारित कक्षा के गैर-एनोटेटेड सार्वजनिक विधियों का परीक्षण करना?

The first answer is easy:
add a class TestNG(groups = { "aGlobalGroup" }) on the Base class level

वह समूह बेस क्लास और विस्तारित कक्षा दोनों के सभी सार्वजनिक तरीकों पर लागू होगा।

लेकिन: उस समूह में गैर-परीक्षण सार्वजनिक विधियों (बिना टेस्टएन एनोटेशन के) भी शामिल किए जाएंगे।

चुनौती: उन गैर-टेस्टएनजी विधियों को शामिल करने से बचें।

@Test(groups = { "aGlobalGroup" })
public class Base {

    /**
     * 
     */
    @BeforeClass
     public final void setUp() {
           System.out.println("Base class: @BeforeClass");
     }


    /**
     * Test not part a 'aGlobalGroup', but still included in that group due to the class annotation. 
* Will be executed even if the TestNG class tested is a sub-class. */ @Test(groups = { "aLocalGroup" }) public final void aFastTest() { System.out.println("Base class: Fast test"); } /** * Test not part a 'aGlobalGroup', but still included in that group due to the class annotation.
* Will be executed even if the TestNG class tested is a sub-class. */ @Test(groups = { "aLocalGroup" }) public final void aSlowTest() { System.out.println("Base class: Slow test"); //throw new IllegalArgumentException("oups"); } /** * Should not be executed.
* Yet the global annotation Test on the class would include it in the TestNG methods... */ public final void notATest() { System.out.println("Base class: NOT a test"); } /** * SubClass of a TestNG class. Some of its methods are TestNG methods, other are not.
* The goal is to check if a group specify in the super-class will include methods of this class.
* And to avoid including too much methods, such as public methods not intended to be TestNG methods. * @author VonC */ public static class Extended extends Base { /** * Test not part a 'aGlobalGroup', but still included in that group due to the super-class annotation.
* Will be executed even if the TestNG class tested is a sub-class. */ @Test public final void anExtendedTest() { System.out.println("Extended class: An Extended test"); } /** * Should not be executed.
* Yet the global annotation Test on the class would include it in the TestNG methods... */ public final void notAnExtendedTest() { System.out.println("Extended class: NOT an Extended test"); } }
0
जोड़ा

उत्तर कस्टम org.testng.IMethodSelector के माध्यम से है:

इसकी includeMethod() सार्वजनिक रूप से एनोटेटेड विधि की तरह, हम चाहते हैं कि किसी भी विधि को बाहर कर सकते हैं।

हालांकि, कस्टम जावा विधि चयनकर्ता को पंजीकृत करने के लिए, आपको इसे किसी भी testRunner द्वारा प्रबंधित XMLTest उदाहरण में जोड़ना होगा, जिसका अर्थ है कि आपको अपने कस्टम TestRunner

लेकिन, एक कस्टम TestRunner बनाने के लिए, आपको -testestunfactory विकल्प के माध्यम से TestRunnerFactory को पंजीकृत करने की आवश्यकता है।

लेकिन यह है कि- testrunfactory को TestNG वर्ग द्वारा कभी भी ध्यान में नहीं रखा जाता है ... इसलिए आपको एक कस्टम टेस्टएनजी कक्षा को परिभाषित करने की भी आवश्यकता है:

  • कॉन्फ़िगर (मानचित्र) विधि को ओवरराइड करने के लिए,
  • ताकि आप वास्तव में TestRunnerFactory
  • सेट कर सकें
  • TestRunnerFactory जो आपको एक कस्टम TestRunner का निर्माण करेगा,
  • TestRunner जो XMLTest उदाहरण को एक कस्टम XMLMethodSelector
  • पर सेट करेगा
  • XMLMethodSelector जो एक कस्टम IMethodSelector
  • का निर्माण करेगा
  • IMethodSelector जो आपके चयन के किसी भी टेस्टएनजी विधियों को बाहर कर देगा!

ठीक है ... यह एक दुःस्वप्न है। लेकिन यह एक कोड-चुनौती भी है, इसलिए यह थोड़ा चुनौतीपूर्ण होना चाहिए;)

सभी कोड DZone स्निपेट पर उपलब्ध हैं।

एक कोड चुनौती के लिए हमेशा की तरह:

  • एक जावा वर्ग (और कुछ आंतरिक कक्षाएं)
  • वर्ग को 'स्रोत/परीक्षण' निर्देशिका में कॉपी-पेस्ट करें (चूंकि पैकेज 'परीक्षण' है)
  • इसे चलाएं (कोई तर्क आवश्यक नहीं है)

माइक स्टोन से अपडेट करें:

मैं इसे स्वीकार करने जा रहा हूं क्योंकि यह मेरे द्वारा किए जाने वाले कार्यों के बहुत करीब लगता है, लेकिन मुझे लगा कि मैं जो भी करता हूं वह जोड़ता हूं।

असल में, मैंने एक समूह एनोटेशन बनाया जो टेस्ट (और अन्य) एनोटेशन की समूह संपत्ति की तरह व्यवहार करता है।

फिर, मैंने समूह एन्नोटेशन ट्रांसफॉर्मर बनाया, जो परिभाषित किए जा रहे सभी परीक्षणों और परीक्षण वर्गों को देखने के लिए IAnotationTransformer का उपयोग करता है, फिर समूह को जोड़ने के लिए परीक्षण को संशोधित करता है, जो समूह बहिष्करण और समावेशन के साथ पूरी तरह से काम करता है।

नए एनोटेशन ट्रांसफॉर्मर का उपयोग करने के लिए बिल्ड को संशोधित करें, और यह सब पूरी तरह से काम करता है!

खैर ... एक चेतावनी यह है कि यह समूह को गैर-परीक्षण विधियों में नहीं जोड़ता है ... क्योंकि जब मैंने ऐसा किया था, तो एक और एनोटेशन ट्रांसफॉर्मर था जो आपको कुछ भी बदलने देता है, लेकिन इसे किसी भी तरह शामिल नहीं किया गया था टेस्टएनजी में मैं किसी कारण से उपयोग कर रहा था ... इसलिए हमेशा के लिए एनोटेटेड विधियों को पहले/बाद में बनाने के लिए एक अच्छा विचार है = सत्य ... जो मेरे लिए पर्याप्त है।

अंतिम परिणाम यह है कि मैं कर सकता हूं:

@Groups({ "myGroup1", "myGroup2"})
public class MyTestCase {
    @Test
    @Groups("aMethodLevelGroup")
    public void myTest() {
    }
}

और मैंने ट्रांसफॉर्मर को सबक्लासिंग और सब कुछ के साथ काम किया।

0
जोड़ा
इतने लंबे समय तक खेद है ... मैंने थोड़ी देर के लिए SO को देखना बंद कर दिया :-)
जोड़ा लेखक Mike Stone, स्रोत
माइक !!! माइक स्टोन वापस आ गया है! खुशी है कि आप मेरे "समाधान" को पसंद करते हैं: यह एसओ पर मेरी पहली कोड-चुनौती में से एक था;)
जोड़ा लेखक VonC, स्रोत
"बिल्ड संशोधित करें"? आप टेस्टिंग बिल्ड को संशोधित करते हैं? क्योंकि मेरे समाधान की जटिलता टेस्टिंग को संशोधित करने से बचने के लिए ठीक है ...
जोड़ा लेखक VonC, स्रोत

आप विधि स्तर पर @ टेस्ट एनोटेशन निर्दिष्ट कर सकते हैं जो अधिकतम लचीलापन की अनुमति देता है।

public class DBTestBase {

    @BeforeTest(groups = "db-test")
    public void beforeTest() {
        System.out.println("Running before test");
    }

    public void method1() {
        Assert.fail();//this does not run. It does not belong to 'db-test' group.
    }

    @Test(groups = "db-test")
    public void testMethod1() {
        Assert.assertTrue(true);
    }
}

क्या यह आपके लिए काम करता है या मुझे आपके प्रश्न से कुछ याद आ रहा है।

0
जोड़ा

टेस्टएनजी @ टेस्ट एनोटेशन के साथ कक्षा से सभी सार्वजनिक तरीकों को चलाएगा। हो सकता है कि आप उन तरीकों को बदल सकें जिन्हें आप नहीं चाहते हैं कि टेस्टएनजी गैर-सार्वजनिक हो

0
जोड़ा