2012-03-29 14 views
6

मेरे पास 15-20 अलग-अलग परीक्षण मामलों के साथ एक परीक्षण है, मैं दो अलग-अलग पैरामीटर के साथ दो बार एक साथ परीक्षण करना चाहता हूं, उदाहरण के लिए परीक्षण की पहले क्लास विधि में पारित किया जाना चाहिए:विभिन्न तर्कों के साथ दो समान परीक्षण चलाना

public class TestOne { 
    private static ClassToTest classToTest; 

    @BeforeClass 
    public static void setUp() throws Exception { 
     classToTest = new ClassToTest("Argument1", "Argument2"); 
    } 

    @Test 
    public void testOne() { 
    ........roughly 15 - 20 tests here 
} 

public class TestTwo { 
    private static ClassToTest classToTest; 

    @BeforeClass 
    public static void setUp() throws Exception { 
     classToTest = new ClassToTest("Argument3", "Argument4"); 
    } 

    @Test 
    public void testOne() { 
    ........roughly 15 - 20 tests here, same as in TestOne 
} 

आप इन दो परीक्षण के बीच फर्क सिर्फ इतना है देख सकते हैं सेटअप विधि है, जो ClassToTest के निर्माता को अलग-गुजरता है। मैं दोनों वर्गों में परीक्षण विधियों को दोहराना नहीं चाहता हूं, लेकिन एक वर्ग में इसे हासिल करने के लिए या तो विरासत या कुछ अन्य बुद्धिमान तरीका पसंद करेंगे।

+0

सरल विरासत को ठीक काम करना चाहिए। क्या आपने क्लासटॉस्ट और testOne() को बेसक्लास में ले जाने का प्रयास किया है? – robertvoliva

उत्तर

6

यह जुनीट 4 के @Parameters के लिए एक आदर्श उपयोग केस की तरह लगता है; https://blogs.oracle.com/jacobc/entry/parameterized_unit_tests_with_junit या http://www.mkyong.com/unittest/junit-4-tutorial-6-parameterized-test/ देखें। उस ने कहा, आपको टेस्ट क्लास के लिए एक कन्स्ट्रक्टर को सेटअप विधि से प्रारंभिक स्थानांतरित करना होगा।

+0

यह मेरे लिए अच्छा नहीं है क्योंकि हम क्लासटॉस्ट के केवल एक उदाहरण चाहते हैं, यह बनाने के लिए बहुत भारी वस्तु है। मैं नहीं चाहता कि मेरा परीक्षण हमेशा के लिए दौड़ें। मेरा मतलब क्लासटॉस्ट का एक उदाहरण है, जो सभी परीक्षण विधियों द्वारा साझा किया जाता है, यही कारण है कि इसे ** @ पहले क्लास ** – Ravi

+0

में परिभाषित किया गया है यदि आपकी टेस्ट क्लास वास्तव में हेवीवेट है ... ठीक है, वहां आपकी समस्या है। जब तक वे _less_ हेवीवेट न हों तब तक अपने परीक्षणों को तोड़ दें। –

+0

मैं यह नहीं कह रहा हूं कि मेरी टेस्ट क्लास भारी है, जिस वर्ग में मैं परीक्षण करने की कोशिश कर रहा हूं वह भारी है क्योंकि यह बाहरी प्रणाली से कनेक्शन बनाता है, हम इसके बारे में कुछ भी नहीं कर सकते हैं, वास्तव में यह परीक्षण एकीकरण परीक्षण है जिसे हम सत्यापित करते हैं उस प्रणाली से सही डेटा। – Ravi

0

प्रलेखन (http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html) के अनुसार:

एक उपवर्ग अपनी मूल वर्ग के निजी सदस्यों के वारिस नहीं है । हालांकि, अगर सुपरक्लास के पास के निजी क्षेत्र तक पहुंचने के लिए सार्वजनिक या संरक्षित तरीके हैं, तो इन्हें उप-वर्ग द्वारा भी उपयोग किया जा सकता है।

0

कैसे इस बारे में:

public class TestOne { 
    private static ClassToTest classToTest1, classToTest2; 

    @BeforeClass 
    public static void setUp() throws Exception { 
     classToTest1 = new ClassToTest("Argument1", "Argument2"); 
     classToTest2 = new ClassToTest("Argument3", "Argument4"); 
    } 

    @Test 
    public void testOne() { 
     testOneImpl(classToTest1); 
     testOneImpl(classToTest2); 
    } 

    public void testOneImpl(ClassToTest classToTest) { 
     // exact samew as whatever your current testOne() test method is 
    } 

    .... 
} 

संपादित करें: या रखने के लिए विधि उलटी गिनती:

public class TestOne { 
    private static List<ClassToTest> classesToTest; 

    @BeforeClass 
    public static void setUp() throws Exception { 
     classesToTest = new ArrayList<>; 
     classesToTest.add(new ClassToTest("Argument1", "Argument2")); 
     classesToTest.add(new ClassToTest("Argument3", "Argument4")); 
    } 

    @Test 
    public void testOne() { 
     for (ClassToTest classToTest: classesToTest) { 
      ... same test content as before 
     } 
    } 
+0

याद रखें कि हमारे पास लगभग 20 परीक्षण हैं, इसलिए 20 बार * 2 विधियों को – Ravi

+0

लिखा जाना होगा, मुझे लगा कि आपकी चिंता कोड की नकल के साथ थी, विधियों की गिनती नहीं थी। इस तरह कोड का कोई दोहराव नहीं है, इरादे की एक संक्षिप्त अभिव्यक्ति, चिंताओं को अलग करना आदि। क्या यह वास्तव में हर परीक्षण विधि के लिए एक और * बहुत छोटी * बॉयलरप्लेट विधि जोड़ने के लिए कठिन है?यदि आप विधि गणना को नीचे रखना चाहते हैं, तो निश्चित रूप से आप 'testToTest1' और' classToTest2' की एक सूची को फिर से भर सकते हैं, और सूची को 'सेटअप' में एक बार परिभाषित किया जा सकता है। –

1

क्या इसके लायक है के लिए, यहाँ कैसे आप TestNG साथ यह करना होगा:

public class TestFactory { 
    @Factory 
    public Object[] createTests() { 
    return new Object[] { 
     new ClassToTest("arg1", "arg2"), 
     new ClassToTest("arg3", "arg4") 
    }; 
    } 
} 

public class ClassToTest { 
    public ClassToTest(String arg1, String arg2) { 
    this.arg1 = arg1; 
    this.arg2 = arg2; 
    } 

    @Test 
    public void testOne() { 
    // use arg1 and arg2 
    } 
} 
1

आपके सभी के लिए धन्यवाद यूआईसी जवाब यह मैं इसे कैसे अंत में है किया

public abstract class Base { 
    final HeavyObject heavy; 

    protected Base(HeavyObject heavy) { 
     this.param = param; 
    } 

    @Test 
    public void test() { 
     param.doSomething(); 
    } 

    @Test 
    .............More tests here 

} 


public class FirstTest extends Base{ 

    private static HeavyObject param; 

    @BeforeClass 
    public static void init() { 
     param = new HeavyObject("arg1", "arg2"); 
    } 

    public FirstTest() { 
     super(param); 
    } 
} 

public class SecondTest extends Base{ 

    private static HeavyObject param; 

    @BeforeClass 
    public static void init() { 
     param = new HeavyObject("arg3", "arg4"); 
    } 

    public FirstTest() { 
     super(param); 
    } 
} 

बेस एक अमूर्त वर्ग है जो सभी परीक्षण और FirstTest और SecondTest विभिन्न मापदंडों के साथ अपने स्वयं के वस्तुओं को बनाने और इसका इस्तेमाल करने के सार वर्ग के लिए इसे पारित किया है।

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