2012-08-01 12 views
10

मैं बहुत की तरह एक विशेषता में एक दिया परीक्षण के बारे में विभिन्न जानकारी (कई बग ट्रैकिंग सिस्टम के लिए आईडी) की दुकान:एनयूनीट परीक्षण चलाने के भीतर रनटाइम पर इकाई परीक्षण विधि विशेषताओं को कैसे प्राप्त करें?

[TestCaseVersion("001","B-8345","X543")] 
public void TestSomethingOrOther() 

आदेश में एक परीक्षण के दौरान यह जानकारी प्राप्त करने में, मैं नीचे दिए गए कोड लिखा है:

System.RuntimeMethodHandle._InvokeMethodFast(IRuntimeMethodInfo method, Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeType typeOwner) 
    at System.RuntimeMethodHandle.InvokeMethodFast(IRuntimeMethodInfo method, Object target, Object[] arguments, Signature sig, MethodAttributes methodAttributes, RuntimeType typeOwner) 
    at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks) 
    at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) 
    at NUnit.Core.Reflect.InvokeMethod(MethodInfo method, Object fixture, Object[] args) 
:

 public string GetTestID() 
    { 
     StackTrace st = new StackTrace(1); 
     StackFrame sf; 
     for (int i = 1; i <= st.FrameCount; i++) 
     { 
      sf = st.GetFrame(i); 
      if (null == sf) continue; 
      MethodBase method = sf.GetMethod(); 
      if (method.GetCustomAttributes(typeof(TestAttribute), true).Length == 1) 
      { 
       if (method.GetCustomAttributes(typeof(TestCaseVersion), true).Length == 1) 
       { 
        TestCaseVersion tcv = 
         sf.GetMethod().GetCustomAttributes(typeof(TestCaseVersion), true).OfType<TestCaseVersion>() 
          .First(); 
        return tcv.TestID; 
       } 
      } 
     } 

समस्या यह है कि जब रिलीज मोड में NUnit के माध्यम से परीक्षण चल रहा है, जो विधि परीक्षण नाम और इन विशेषताओं होनी चाहिए निम्नलिखित की जगह है

:

अद्यतन जो कोई रुचि रखता है के लिए, मैं ऊपर (निम्नलिखित तरीके से कोड को लागू करने, ताकि विशेषता मान के किसी भी TestCaseVersion विशेषता का उपयोग करता है मौजूदा कोड के किसी भी परिवर्तन किए बिना, पहुँचा जा सकता है घाव

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface | AttributeTargets.Method, AllowMultiple = false)] 
public class TestCaseVersion : PropertyAttribute 
{ 
    public TestCaseVersion(string testCaseCode, string story, string task, string description) 
    { 
     base.Properties.Add("TestId", testCaseCode); 
     base.Properties.Add("Description", description); 
     base.Properties.Add("StoryId", story); 
     base.Properties.Add("TaskId", task); 
    } 
} 

public string GetTestID() 
{ 
    return TestContext.CurrentContext.Test.Properties["TestId"]; 
} 
+0

अच्छा अपडेट !!! अगर मैं कर सकता हूं तो मैं आपको दूसरा अपवॉट दूंगा :-) –

उत्तर

8

आपको एक बार महत्वपूर्ण परीक्षण का मामला संस्करण स्ट्रिंग (यानी "001, B-8345, X543""001","B-8345","X543" के बजाय), आप में TestContext कार्यक्षमता उपलब्ध का उपयोग करने के NUnit 2.5.7 और उच्च सक्षम होना चाहिए होने के साथ ठीक कर रहे हैं ।

विशेष रूप से, आप को परिभाषित करने और एक परीक्षण संदर्भ Property विशेषता TestCaseVersion इस तरह इस्तेमाल कर सकते हैं: Btw

[Test, Property("TestCaseVersion", "001, B-8345, X543")] 
public void TestContextPropertyTest() 
{ 
    Console.WriteLine(TestContext.CurrentContext.Test.Properties["TestCaseVersion"]); 
} 

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

[Test, Property("MajorVersion", "001"), 
Property("MinorVersion", "B-8345"), Property("Build", "X543")] 
public void TestContextPropertyTest() 
{ 
    Console.WriteLine(TestContext.CurrentContext.Test.Properties["MajorVersion"]); 
    Console.WriteLine(TestContext.CurrentContext.Test.Properties["MinorVersion"]); 
    Console.WriteLine(TestContext.CurrentContext.Test.Properties["Build"]); 
} 
+0

धन्यवाद, यही एकमात्र समाधान है जिसे मैं भी ढूंढ सकता हूं। मेरी इच्छा है कि वास्तविक परीक्षण विधि के किसी भी अन्य गुण प्राप्त करने का कोई तरीका हो, लेकिन इसे करना होगा – breed052

0

क्या मुझे आपका विचार समझ में नहीं आ रहा है, लेकिन क्यों अधिक सरल समाधान का उपयोग नहीं करना है?

[TestCase(TestName = "001, B-8345, X543")] 
public void TestSomethingOrOther() 
+0

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

+0

लेकिन आप 'GetTestID() 'का उपयोग कैसे करेंगे, संदेशों को जोर देने के लिए अतिरिक्त जानकारी जोड़ें? – Akim

+0

मैं एक विधि पर GetTestID का उपयोग करता हूं जो परीक्षणों के परिणामों को लॉग इन करने के लिए सभी परीक्षणों को कॉल करता है। – breed052

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