2012-01-27 12 views
5

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

+0

'nunit-सांत्वना के रूप में वे चलाते हैं, लेकिन मैं सही सोच कर कि क्या आप चाहते हैं कि प्राप्त करने के लिए है में हूँ MyAssembly.dll/labels' सभी परीक्षणों दिखाएगा पहले से सूचीबद्ध करें और फिर उपयोगकर्ता को संकेत दें (या उन्हें '/ runlist = 'फ़ाइल में जोड़ें)? और श्रेणियों का उपयोग न करने के लिए तर्क क्या है? – ClickRick

+0

हम उन्हें समय से पहले, सही चाहते हैं। यहां की कुंजी यह थी कि हम उन्हें एक बार में चलाने के लिए चाहते थे, यानि प्रति परीक्षण एक बार, बार-बार नूनिट-कंसोल चलाएं। हमने घटकों को बदल दिया है कि हमें वास्तव में ऐसा करने की ज़रूरत नहीं है, लेकिन मुझे अभी भी आश्चर्य है कि इस पर कोई जवाब नहीं दिख रहा है। –

+0

यदि यह अभी भी आपके लिए एक समस्या थी, तो मैं उनके इवेंट लिस्टनर क्लास का उपयोग करने के लिए लुभाना चाहूंगा (देखें http://imistaken.blogspot.co.uk/2009/03/nunit-extensions-adding-logic-at-run उदाहरण के लिए एचटीएमएल) यह देखने के लिए कि क्या आप इस तरह से सूची प्राप्त कर सकते हैं, लेकिन वह उस बिंदु पर परीक्षणों के वास्तविक चलने को दबाने में सक्षम होने पर निर्भर करेगा, और ऐसा कुछ है जिसे मैं कोशिश किए बिना नहीं जानता। – ClickRick

उत्तर

0

नूनिट-कंसोल अभी भी इस विकल्प का समर्थन नहीं कर रहा है। यह प्रतिबिंब का उपयोग कर परीक्षण मामलों की एक सूची प्राप्त करने के लिए काफी सरल है। एक बहुत ही बुनियादी स्तर पर, आप विशेषताओं के साथ public class के सभी public विधियों की एक सूची चाहते हैं। आपके परीक्षणों को कैसे संरचित किया जाता है, इस पर निर्भर करते हुए, आपको अतिरिक्त फ़िल्टरिंग करने की आवश्यकता हो सकती है, जैसे [Ignore] विशेषताओं के साथ चिह्नित किसी भी परीक्षण को हटाने या बेस क्लास में परीक्षण विधियों पर विचार करने के लिए।

एक बुनियादी स्तर पर, कोड कुछ इस तरह दिखेगा:

// Load the assembly containing your fixtures 
Assembly a = Assembly.LoadFrom(assemblyName); 

// Foreach public class that is a TestFixture and not Ignored 
foreach (var c in a.GetTypes() 
        .Where(x=>x.IsPublic 
        && (x.GetCustomAttributes(typeof(NUnit.Framework.TestFixtureAttribute)).Count() > 0) 
        && (x.GetCustomAttributes(typeof(NUnit.Framework.IgnoreAttribute)).Count() ==0))) 
{ 
    // For each public method that is a Test and not Ignored 
    foreach (var m in c.GetMethods() 
         .Where(x=>x.IsPublic 
         && (x.GetCustomAttributes(typeof(NUnit.Framework.TestAttribute)).Count() > 0) 
         && (x.GetCustomAttributes(typeof(NUnit.Framework.IgnoreAttribute)).Count() ==0))) 
    { 
     // Print out the test name 
     Console.WriteLine("{0}.{1}", c.ToString(), m.Name); 
     // Alternately, print out the command line to run test case using nunit-console 
     //Console.WriteLine("nunit-console /run:{0}.{1} {2}", c.ToString(), m.Name, assemblyName); 
    } 
} 

जाहिर है आप इस एक सा कारगर बनाने के लिए सक्षम है, तो आप केवल किसी विशेष TestFixture से परीक्षण तरीकों चाहता था होगी।

जैसा कि टिप्पणियों में कहा गया है, यदि आपको TestCase और TestCaseSource जैसे अन्य NUnit विशेषताओं पर ध्यान देना होगा तो यह थोड़ा अधिक जटिल हो जाता है। मैंने इन विशेषताओं की कुछ कार्यक्षमता का समर्थन करने के लिए नीचे दिए गए कोड को संशोधित किया है।

static void PrintTestNames(string assemblyName) { 
    Assembly assembly = Assembly.LoadFrom(assemblyName); 

    foreach (var fixture in assembly.GetTypes().Where(x => x.IsPublic 
             && (x.GetCustomAttributes(typeof(TestFixtureAttribute)).Count() > 0) 
             && (x.GetCustomAttributes(typeof(IgnoreAttribute)).Count() == 0))) { 
     foreach(var method in fixture.GetMethods().Where(x=>x.IsPublic 
      && (x.GetCustomAttributes(typeof(IgnoreAttribute)).Count() == 0) 
      && ((x.GetCustomAttributes(typeof(TestAttribute)).Count() > 0) 
       || (x.GetCustomAttributes(typeof(TestCaseAttribute)).Count() > 0) 
       || (x.GetCustomAttributes(typeof(TestCaseSourceAttribute)).Count() > 0)) 
      )) { 
      var testAttributes = method.GetCustomAttributes(typeof(TestAttribute)) as IEnumerable<TestAttribute>; 
      var caseAttributes = method.GetCustomAttributes(typeof(TestCaseAttribute)) as IEnumerable<TestCaseAttribute>; 
      var caseSourceAttributes = method.GetCustomAttributes(typeof(TestCaseSourceAttribute)) as IEnumerable<TestCaseSourceAttribute>; 

      if (caseAttributes.Count() > 0) { 
       foreach(var testCase in caseAttributes) { 
        if (!string.IsNullOrEmpty(testCase.TestName)) { 
         PrintTestName(fixture.ToString(), testCase.TestName); 
        } 
        else { 
         string arguments = ExtractArguments(testCase.Arguments); 
         PrintTestName(fixture.ToString(), method.Name + arguments); 
        } 
       } 
      } 
      else if (caseSourceAttributes.Count() > 0) { 
       foreach (var testCase in caseSourceAttributes) { 
        var sourceName = testCase.SourceName; 
        if (!string.IsNullOrEmpty(sourceName)) { 
         var staticMember = fixture.GetField(sourceName, BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public); 
         var instanceMember = fixture.GetField(sourceName, BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public); 
         var staticMethodMember = fixture.GetMethod(sourceName, BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public); 
         var instanceMethodMember = fixture.GetMethod(sourceName, BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public); 
         var staticPropMember = fixture.GetProperty(sourceName, BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public); 
         var instancePropMember = fixture.GetProperty(sourceName, BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public); 


         IEnumerable memberValues; 

         if (null != staticMember) { 
          memberValues = staticMember.GetValue(null) as IEnumerable; 
         } 
         else if (null != instanceMember) { 
          var instance = Activator.CreateInstance(fixture); 
          memberValues = instanceMember.GetValue(instance) as IEnumerable; 
         } else if(null != staticMethodMember) { 
          memberValues = staticMethodMember.Invoke(null,new object [0]) as IEnumerable; 
         } 
         else if (null != instanceMethodMember) { 
          var instance = Activator.CreateInstance(fixture); 
          memberValues = instanceMethodMember.Invoke(instance, new object[0]) as IEnumerable; 
         } 
         else if (null != staticPropMember) { 
          memberValues = staticPropMember.GetValue(null) as IEnumerable; 
         } 
         else if (null != instancePropMember) { 
          var instance = Activator.CreateInstance(fixture); 
          memberValues = instancePropMember.GetValue(instance) as IEnumerable; 
         } 
         else { 
          Console.WriteLine("*** Ooops...Looks like I don't know how to get {0} for fixture {1}", sourceName, fixture.ToString()); 
          continue; 
         } 

         foreach (var memberValue in memberValues) { 
          if (null != memberValue as IEnumerable) { 
           PrintTestName(fixture.ToString(), method.Name + ExtractArguments(memberValue as IEnumerable)); 
          } 
          else { 
           PrintTestName(fixture.ToString(), method.Name + "(" + memberValue.ToString() + ")"); 
          } 
         } 
        } else { 
         Console.WriteLine("*** Ooops...Looks like I don't know how to handle test {0} for fixture {1}", method.Name, fixture.ToString()); 
        } 
       } 
      } 
      else { 
       PrintTestName(fixture.ToString(), method.Name); 
      } 
     } 
    } 
} 

static string ExtractArguments(IEnumerable arguments) { 
    string caseArgs = "("; 
    bool first = true; 
    foreach (var arg in arguments) { 
     if (first) first = false; 
     else caseArgs += ","; 
     caseArgs += Convert.ToString(arg); 
    } 
    return caseArgs + ")"; 
} 

static void PrintTestName(string fixture, string testName) { 
    Console.WriteLine("{0}.{1}", fixture, testName); 
    //Console.WriteLine("nunit-console /run:{0}.{1} {2}", fixture, testName, assemblyName); 
} 

आप उपरोक्त कोड के माध्यम से देखते हैं, तो आप देख सकते हैं कि मैं कार्यक्षमता संभाला है जहां परीक्षण के लिए TestCaseSource एक स्ट्रिंग संपत्ति/विधि/क्षेत्र नामकरण है। आप यह भी देखेंगे कि और कोड है, यह अभी भी बहुत सरल कोड है, इसलिए यदि आप TestCaseSource के वैकल्पिक संस्करण का उपयोग कर रहे थे, या यदि अन्य एनयूनीट विशेषताएँ हैं जिनका उपयोग आप कर रहे हैं, तो इसे आसानी से बढ़ाया जा सकता है I के लिए catered नहीं है।

उपर्युक्त के लिए एक काउंटर जोड़ने के लिए भी आसान होगा ताकि आपके पास आराम का स्तर हो कि परीक्षणों की संख्या के रूप में मुद्रित किया गया था, जो नूनिट-कंसोल चल रहे परीक्षणों की संख्या के रूप में मुद्रित थे।

+0

यह मूल बातें प्राप्त करेगा, लेकिन यदि आप कुछ अधिक उन्नत विशेषताओं का उपयोग करते हैं जो स्वचालित रूप से विभिन्न इनपुट से परीक्षण उत्पन्न कर सकते हैं, तो आप भाग्य से बाहर हैं! –

+0

@ सेबेस्टियन गुड मैंने उपरोक्त को टेस्टकेस + कुछ टेस्टकेससोर्स क्रमपरिवर्तन के लिए समर्थन जोड़ा है। अन्य टेस्टकेससोर्स विकल्पों को संभालने के लिए कोड को विस्तारित करना (या अन्य विशेषताएँ जो मुझे नहीं मिली हैं) सरल होनी चाहिए यदि आप वैकल्पिक लोगों का उपयोग कर रहे हैं, हालांकि मैं इसे पाठक * के लिए * अभ्यास के रूप में छोड़ दूंगा। – forsvarir

+0

आपको उन मामलों पर विचार करने की भी आवश्यकता है जहां टेस्ट क्लास इन गुणों के साथ (सार) आधार वर्गों से प्राप्त होते हैं। फिर गणना को कई बार एक ही परीक्षण विधियों को चलाने के लिए समायोजित करने की आवश्यकता होती है, – WebDancer

1

अब --explore कमांड लाइन विकल्प है जिसका प्रयोग परीक्षण के बिना सभी परीक्षण मामलों को सूचीबद्ध करने के लिए किया जा सकता है। अधिक विशेष रूप से

nunit3-console.exe MyProject.dll --explore 

अधिक जानकारी के लिए: https://github.com/nunit/docs/wiki/Console-Command-Line#description

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