2011-09-26 5 views
15
@DataPoints public static final Integer[] input1={1,2}; 
@Theory 
@Test 
public void test1(int input1){ 

} 

@DataPoints public static final Integer[] input2={3,4}; 
@Theory 
@Test 
public void test2(int input2){ 

} 

मैं चाहता हूं कि test1 डेटा सेट इनपुट 1 के साथ चलता है - {1,2} और इनपुट 2 के साथ test2 रन - {3,4}। लेकिन वर्तमान में प्रत्येक परीक्षण डेटा सेट {1,2,3,4} दोनों के साथ चलता है। विशिष्ट @DataPoints को विशिष्ट @Dorysसिद्धांत के साथ डेटापॉइंट कैसे संलग्न करें?

उत्तर

22

डेटापॉइंट कक्षा पर लागू करने के लिए कैसे बाध्य करें। यदि आपके पास @ थ्योरी विधि है जो एक int लेती है, और आपके पास डेटापॉइंट है जो इंक की एक सरणी है, तो इसे int के साथ बुलाया जाएगा।

@RunWith(Theories.class) 
public class TheoryTest { 
    @DataPoint public static int input1 = 45; 
    @DataPoint public static int input2 = 46; 
    @DataPoints public static String[] inputs = new String[] { "foobar", "barbar" }; 

    @Theory public void testString1(String input) { 
     System.out.println("testString1 input=" + input); 
    } 

    @Theory public void testString2(String input) { 
     System.out.println("testString2 input=" + input); 
    } 

    @Theory public void test1(int input) { 
     System.out.println("test1 input=" + input); 
    } 

    @Theory public void test2(int input) { 
     System.out.println("test2 input=" + input); 
    } 
} 

यह 45 & 46. यह "foobar" और "barbar" और "foobar" और "barbar" के साथ testString2 साथ testString1 कॉल के साथ 45 & 46 के साथ test1, और test2 कहता है।

तुम सच में विभिन्न सिद्धांतों के लिए विभिन्न डेटा सेट का उपयोग करने के लिए, आप एक निजी कक्षा में डेटा लपेट कर सकते हैं:

@RunWith(Theories.class) 
public class TheoryTest { 
    public static class I1 { int i; public I1(int i) { this.i = i;} } 
    public static class I2 { int i; public I2(int i) { this.i = i;} } 

    @DataPoint public static I1 input1 = new I1(45); 
    @DataPoint public static I2 input2 = new I2(46); 

    @Theory 
    public void test1(I1 input) { 
     System.out.println("test1 input=" + input.i); 
    } 

    @Theory 
    public void test2(I2 input) { 
     System.out.println("test2 input=" + input.i); 
    } 
} 

यह 46. के साथ 45 के साथ test1 test2 और यह काम करता है कहता है, लेकिन में मेरी राय, यह कोड को अस्पष्ट करता है, और टेस्ट क्लास को दो वर्गों में विभाजित करने का बेहतर समाधान हो सकता है।

+0

@Mathew उत्तर के लिए धन्यवाद। तो इस तरह कोई बाध्यकारी सुविधा नहीं है। समय के लिए निजी कक्षा में रैपिंग का उपयोग करेंगे। लेकिन यह अभी भी सुरुचिपूर्ण नहीं है। मुझे अभी भी समझ में नहीं आता कि क्लास से डाटापॉइंट क्यों जुड़े हुए हैं? वे विधि स्तर पर बेहतर समझते हैं। –

+0

विचार यह है कि आपके पास कई डेटा पॉइंट हैं, और आप कई सिद्धांतों का परीक्षण कर सकते हैं: इसके लिए आपको कई परीक्षण विधियों की आवश्यकता है। अगर आप उत्तर से खुश हैं, तो क्या आप इसे स्वीकार कर सकते हैं? टेस्ट क्लास को दो वर्गों में विभाजित करने के लिए –

+0

+1। यदि test1 और test2 को पास करने और समझने के लिए अलग-अलग डेटा सेट की आवश्यकता है, तो अनिवार्य रूप से वे विभिन्न व्यवहारों का परीक्षण कर रहे हैं और तर्कसंगत रूप से अलग हो सकते हैं। –

1

कुछ संदर्भ मैंने व्यवहार को सत्यापित करने के लिए विशिष्ट मानों और सिद्धांतों के परीक्षणों के उपयोग के बारे में बात करते हुए देखा है। उदाहरण के तौर पर, यदि आपके पास ऐसी कक्षा है जिसमें किसी विशेषता से जोड़ने और घटाने के तरीके हैं, तो परीक्षण परिणाम की शुद्धता को सत्यापित करेगा (उदाहरण के लिए, 1 + 3 रिटर्न 4) जबकि एक सिद्धांत यह सत्यापित कर सकता है कि डेटापॉइंट मानों के लिए (x1 , वाई 1), (x2, y2), x + yy हमेशा x के बराबर होता है, x-y + y हमेशा x के बराबर होता है, x * y/y हमेशा x के बराबर होता है। इस तरह, सिद्धांतों के परिणाम कसकर नहीं होते हैं आँकड़े। सिद्धांतों के साथ, आप y == 0 जैसे मामलों को फ़िल्टर भी कर सकते हैं; वे विफलता के रूप में गिनती नहीं है। निचली पंक्ति: आप दोनों का उपयोग कर सकते हैं। एक अच्छा कागज है: http://web.archive.org/web/20110608210825/http://shareandenjoy.saff.net/tdd-specifications.pdf

21
JUnit 4.12 (यकीन नहीं है जब यह शुरू की गई थी) साथ

यह संभव है datapoints नाम और (i http://farenda.com/junit/junit-theories-with-datapoints/ से यह सीखा) मानकों करने के लिए उन्हें आवंटित करने के लिए:

@RunWith(Theories.class) 
public class TheoriesAndDataPointsTest { 
    @DataPoints("a values") 
    public static int[] aValues() { 
     return new int[]{1, 2}; 
    } 

    @DataPoints("b values") 
    public static int[] bValues() { 
     return new int[]{3, 4}; 
    } 

    @Theory 
    public void theoryForA(@FromDataPoints("a values") int a) { 
     System.out.printf("TheoryForA called with a = %d\n", a); 
    } 

    @Theory 
    public void theoryForB(@FromDataPoints("b values") int a) { 
     System.out.printf("TheoryForB called with b = %d\n", a); 
    } 
} 

आउटपुट:

TheoryForA called with a = 1 
TheoryForA called with a = 2 
TheoryForB called with b = 3 
TheoryForB called with b = 4 
+1

यह स्वीकार्य उत्तर होना चाहिए। – Chris311

+0

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