2009-02-04 12 views
35

एक्लिप्स में जुनीट व्यू यादृच्छिक रूप से परीक्षणों को ऑर्डर करने लगता है। मैं कक्षा के नाम से उन्हें कैसे आदेश दे सकता हूं?एक्लिप्स के जुनीट व्यू में ऑर्डरिंग यूनिट परीक्षण

+6

यह मुझे ग्रहण में पागल बनाता है, और मेरी इच्छा है कि कोई इसे प्लगइन के विकल्प के रूप में जोड़ देगा। मेरी इच्छा है कि स्वीकार्य उत्तर वास्तव में समस्या को ठीक करे! –

उत्तर

5

के रूप में गैरी टिप्पणी में कहा:

यह अच्छा होगा अगर यूनिट धावक वर्ग के नाम से आगे जाना है और उन्हें आदेश के लिए कहा जा सकता है।हम्म, शायद मुझे को स्रोत कोड में देखना चाहिए ...

मैंने देखा लेकिन इन नामों को हल करने के लिए कार्यक्षमता का कोई संकेत नहीं है। मैं जुनीट प्लगइन में एक परिवर्तन अनुरोध का सुझाव दूंगा, लेकिन मुझे नहीं लगता कि इस बात का उपयोग करने वाले बहुत से लोग हैं, इसलिए: DIY।

यदि आप प्लगइन कोड संशोधित करते हैं तो मैं समाधान देखना चाहता हूं।

+0

हाँ, प्लगइन कोड को संशोधित करना शायद सबसे अच्छा समाधान है। इच्छा है कि मेरे पास समय था। –

2

मार्क ने लिखा है:

यह उनके निष्पादन के समय के आधार पर आदेश देता है, हो सकता है आप अपने तरीके को सॉर्ट करना चाहिए? स्रोत/सॉर्ट सदस्यों

निशान सही है। लेकिन आप अपने यूनिट टेस्ट को सॉर्ट नहीं कर सकते हैं। निष्पादन के आदेश के बारे में अनुमान लगाने की अनुमति नहीं है।

यूनिट परीक्षणों को स्वतंत्र रूप से बनाया जाना चाहिए और यह यादृच्छिक है, उन्हें यूनिटरनर द्वारा कैसे बुलाया जाता है।

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

+0

ठीक है, मैं TestSuite का उपयोग करने से बचने की कोशिश कर रहा हूं। मैं यूनिट टेस्ट आजादी की सराहना करता हूं, और मैं इसे बनाए रखता हूं, लेकिन यह अच्छा होगा अगर यूनिट धावक को आगे बढ़ने और कक्षा के नाम से आदेश देने के लिए कहा जा सके। हम्म, शायद मुझे स्रोत कोड में देखना चाहिए ... –

2

तुम सच में अपने JUnit परीक्षण के बीच मुश्किल निर्भरता की जरूरत है, की कोशिश JExample extension

JExample इकाई परीक्षण करने के लिए निर्माता-उपभोक्त रिश्तों परिचय देता है।
एक निर्माता एक परीक्षण विधि है जो अपनी इकाई को रिटर्न मूल्य के रूप में परीक्षण के तहत उत्पन्न करती है।
एक उपभोक्ता एक परीक्षण विधि है जो एक या अधिक उत्पादकों और उनके वापसी मूल्यों पर निर्भर करता है।

आप जूनिट 4.4 या 4.5 के लिए install it in Eclipse कर सकते हैं।

import jexample.Depends; 

    @Test 
    @Depends("#testEmpty") 
    public Stack<Integer> testPush(Stack<Integer> $) { 
     $.push(42); 
     assertFalse($.isEmpty()); 
     return $; 
    } 

इस आईबीएम लेख "In pursuit of code quality: JUnit 4 vs. TestNG" में उल्लेख किया है:

एक बात JUnit ढांचे को प्राप्त करने की कोशिश करता है परीक्षण अलगाव है।
नकारात्मक पक्ष पर, यह परीक्षण-मामले निष्पादन के लिए एक आदेश निर्दिष्ट करना बहुत मुश्किल बनाता है, जो किसी भी प्रकार के आश्रित परीक्षण के लिए आवश्यक है।
डेवलपर्स ने इस बारे में जानने के लिए विभिन्न तकनीकों का उपयोग किया है, जैसे वर्णमाला क्रम में परीक्षण मामलों को निर्दिष्ट करना या फिक्स्चर पर भारी निर्भर होना (@Before@After) चीजों को व्यवस्थित करने के लिए।

ये कामकाज सफल होने वाले परीक्षणों के लिए ठीक हैं, लेकिन असफल परीक्षणों के लिए, उनके पास असुविधाजनक परिणाम होता है: प्रत्येक आगामी आश्रित परीक्षण भी विफल रहता है। कुछ स्थितियों में, यह अनावश्यक विफलताओं

रिपोर्टिंग बड़े परीक्षण स्वीट का कारण बन सकता

तो सावधान रहना: यदि आप अपने JUnit आदेश देने के लिए किसी भी समाधान को बनाए रखने के परीक्षण जिस तरह से आप चाहते हैं ... आपको लगता है की जरूरत है कि समाधान समर्थन एक " अन्य परीक्षणों को आगे बढ़ने की इजाजत देने के लिए "सुविधा छोड़ें" भले ही उनमें से कोई विफल हो।

+1

मुझे लगता है कि वह सिर्फ एक विशिष्ट क्रम में _results_ देखना चाहता है। – guerda

+1

... हाँ इसलिए मेरा जवाब: चूंकि आप परिणामों को सॉर्ट नहीं कर सकते हैं, इसलिए आप परीक्षणों को ऑर्डर करने का प्रयास कर सकते हैं। – VonC

+2

हाँ, बस परिणाम। और केवल इसलिए कि यूनिट परीक्षणों के चलने के बाद मैं एक विशिष्ट परीक्षा परिणाम देखना चाहता हूं। मुझे यकीन नहीं है कि क्यों ग्रहण परीक्षण परिणामों को ऑर्डर नहीं कर सकता है क्योंकि वे चल रहे हैं। बस एक सॉर्टेडसेट का उपयोग करें। –

0

मैं इसके लिए भी एक समाधान खोज रहा था, और मुझे नीचे दिए गए यूआरएल से एक तरह की दरार मिली। मुझे नहीं पता कि यह आपके लिए काम करता है या नहीं, लेकिन यह मेरे लिए स्प्रिंग टूल सूट 2.5.2 में काम करता है।

http://osdir.com/ml/java.junit.user/2002-10/msg00077.html

3

एक बात से कोई एक कार्य हो सकता है कि JUnit 3.x. का स्कीमा उपयोग कर रहा है हमने एक टेस्ट सूट का इस्तेमाल किया जिसे ऑलटेस्ट कहा जाता था जहां आप इसे एक विशिष्ट क्रम में परीक्षण जोड़ते हैं। और हर पैकेज के लिए हमें एक और ऑलटेस्ट मिला। उन टेस्ट सूट को एक नाम के समान होने के कारण पैकेज को आसानी से पदानुक्रम बनाने में सक्षम बनाता है जिसे जूनिट प्लगइन द्वारा मूल्यवान किया जाना चाहिए।

मैं वास्तव में नापसंद करता हूं कि यह जूनिट व्यूअर के अंदर परीक्षण विधियों को कैसे पेश कर रहा है। यह उसी क्रम में होना चाहिए क्योंकि वे टेस्टकेस कक्षा में निर्दिष्ट हैं। मैं उन तरीकों को महत्व और विशेषताओं के तरीके में आदेश देता हूं। इसलिए सबसे असफल तरीका पहले और फिर परीक्षण मामले के बाद के हिस्से में अधिक विशेष को सही करना है।

यह वास्तव में कष्टप्रद है कि परीक्षण धावक उनको तंग कर रहा है। मैं इसे स्वयं देख लूंगा और यदि मुझे कोई समाधान मिल जाए तो मैं इस जवाब को अपडेट कर दूंगा।

अद्यतन:

एक testcase भीतर विधि के नाम के आदेश के साथ मेरी समस्या यह एक से संबंधित है: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7023180 (धन्यवाद ओरेकल!)।

तो अंत में ऑरैकल ने कक्षाओं के भीतर विधियों का क्रम बदल दिया .getMethods या class.getDeclaredMethods कॉल करें। अब विधियां यादृच्छिक हैं और JVM के विभिन्न रनों के बीच बदल सकती हैं। यह तुलना के अनुकूलन से संबंधित होने के लिए या यहां तक ​​कि विधि नाम को संपीड़ित करने का प्रयास है - जो जानता है ...।

तो क्या बचा है। सबसे पहले एक का उपयोग कर सकते हैं: @FixMethodOrder (javacodegeeks.com से):

  1. @FixMethodOrder (MethodSorters.DEFAULT) - एक आंतरिक तुलनित्र के आधार पर नियतात्मक आदेश
  2. @FixMethodOrder (MethodSorters.NAME_ASCENDING) - विधि के आरोही क्रम नाम
  3. @FixMethodOrder (MethodSorters.JVM) - प्रतिबिंब आधारित आदेश

खैर सेंट है कि पर निर्भर करता है की 4.11 रास्ता पूर्व ऊपर बताते हैं लेकिन बताते हैं कि लोग test1TestName स्कीमा का उपयोग क्यों शुरू करते हैं।

Update2:

मैं एएसएम का उपयोग के बाद से Javassist भी getMethods पर यादृच्छिक क्रमबद्ध तरीकों का उत्पादन()। वे आंतरिक रूप से मानचित्र का उपयोग करते हैं। एएसएम के साथ मैं बस एक आगंतुक का उपयोग करता हूं।

package org.junit.runners.model; 

import java.io.IOException; 
import java.io.InputStream; 
import java.util.ArrayList; 
import java.util.Collections; 
import java.util.Comparator; 
import java.util.List; 

import org.objectweb.asm.ClassReader; 
import org.objectweb.asm.ClassVisitor; 
import org.objectweb.asm.MethodVisitor; 
import org.objectweb.asm.Opcodes; 

import com.flirtbox.ioc.OrderTest; 

/** 
* @author Martin Kersten 
*/ 
public class TestClassUtil { 
public static class MyClassVisitor extends ClassVisitor { 
    private final List<String> names; 
    public MyClassVisitor(List<String> names) { 
     super(Opcodes.ASM4); 
     this.names = names; 
    } 

    @Override 
    public MethodVisitor visitMethod(int access, String name, String desc, 
      String signature, String[] exceptions) { 
     names.add(name); 
     return super.visitMethod(access, name, desc, signature, exceptions); 
    } 
} 

private static List<String> getMethodNamesInCorrectOrder(Class<?> clazz) throws IOException { 
    InputStream in = OrderTest.class.getResourceAsStream("/" + clazz.getName().replace('.', '/') + ".class"); 
    ClassReader classReader=new ClassReader(in); 
    List<String> methodNames = new ArrayList<>(); 
    classReader.accept(new MyClassVisitor(methodNames), 0); 
    return methodNames; 
} 

public static void sort(Class<?> fClass, List<FrameworkMethod> list) { 
    try { 
     final List<String> names = getMethodNamesInCorrectOrder(fClass); 
     Collections.sort(list, new Comparator<FrameworkMethod>() { 
      @Override 
      public int compare(FrameworkMethod methodA, FrameworkMethod methodB) { 
       int indexA = names.indexOf(methodA.getName()); 
       int indexB = names.indexOf(methodB.getName()); 
       if(indexA == -1) 
        indexA = names.size(); 
       if(indexB == -1) 
        indexB = names.size(); 
       return indexA - indexB; 
      } 
     }); 
    } catch (IOException e) { 
     throw new RuntimeException("Could not optain the method names of " + fClass.getName() + " in correct order", e); 
    } 
} 
} 

बस पैकेज org.junit.runners.model में अपने src/परीक्षण/जावा फ़ोल्डर में इस डाल दिया। अब org.junit.runners.model.TestClass को उसी पैकेज में जूनिट 4.5 lib की प्रतिलिपि बनाएँ और सॉर्टिंग दिनचर्या जोड़कर इसके कन्स्ट्रक्टर को बदलें।

public TestClass(Class<?> klass) { 
    fClass= klass; 
    if (klass != null && klass.getConstructors().length > 1) 
     throw new IllegalArgumentException(
       "Test class can only have one constructor"); 

    for (Class<?> eachClass : getSuperClasses(fClass)) 
     for (Method eachMethod : eachClass.getDeclaredMethods()) 
      addToAnnotationLists(new FrameworkMethod(eachMethod)); 

      //New Part 
    for(List<FrameworkMethod> list : fMethodsForAnnotations.values()) { 
     TestClassUtil.sort(fClass, list); 
    } 

    //Remove once you have verified the class is really picked up 
    System.out.println("New TestClass for " + klass.getName()); 

} 

यहां आप जाते हैं। अब आपके पास जावा फ़ाइल के भीतर घोषित किए गए क्रम में अच्छी तरह से क्रमबद्ध तरीके हैं। यदि आपको आश्चर्य है कि कक्षा पथ आमतौर पर इस तरह से सेट किया जाता है कि आपके स्रोत (लक्ष्य या बिन) फ़ोल्डर में सब कुछ क्लासलोडर द्वारा पहले माना जाता है। तो एक ही पैकेज और उसी वर्ग को परिभाषित करते समय आप अपने द्वारा उपयोग की जाने वाली किसी भी लाइब्रेरी में प्रत्येक वर्ग/इंटरफ़ेस को 'ओवरराइड' कर सकते हैं। चाल है!

अद्यतन 3 मैं हर पैकेज और प्रत्येक वर्ग के सही क्रम में वृक्ष दृश्य प्राप्त करने में सक्षम था।

  • विचार पेरेंटरनर को उप-वर्ग करना है और उसके बाद सभी वर्गों को जोड़ना है जिन्हें आप सार्वजनिक होने के रूप में पहचानते हैं और परीक्षण के साथ एनोटेटेड विधियां रखते हैं।
  • एक getName() विधि को केवल उस वर्ग का पैकेज नाम लौटाएं जो आपके सूट धावक का प्रतिनिधित्व कर रहा है (इसलिए आप पेड़ को सूट के वर्ग नाम के बिना पैकेज पेड़ के रूप में देखते हैं)।
  • यदि आपको एक निश्चित सूट क्लास मिलती है (मैं सभी सूट कक्षाओं के लिए ऑलटेस्ट का उपयोग करता हूं) उपनिर्देशिका का निरीक्षण करें।
  • यदि आपको उपनिर्देशिका में एक सूट क्लास नहीं मिलती है तो इसकी सभी उपनिर्देशिकाएं जांचें, इस प्रकार यदि आप मूल निर्देशिका में सूट नहीं रखते हैं तो परीक्षणों वाले पैकेज को याद नहीं करते हैं।

वह था। सुइट क्लास मैं हर जगह जोड़ता हूं: @RunWith(MySuiteRunner.class) public class AllTests { }

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

1

जुनीट व्यू में ऑर्डरिंग परीक्षण bug #386453 in Eclipse Bugzilla के रूप में दायर किया गया है। इस समस्या को और अधिक दृश्यता प्राप्त करने में मदद करने और/या मतदान करने से मदद मिल सकती है।

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