2012-03-12 14 views
17

यूनिट परीक्षण नाम से यूनिट परीक्षण नाम कैसे प्राप्त करें?इकाई परीक्षण के भीतर से रनटाइम पर इकाई परीक्षण विधि का नाम कैसे प्राप्त करें?

मैं नीचे दी गई विधि एक BaseTestFixture कक्षा के अंदर है:

public string GetCallerMethodName() 
{ 
    var stackTrace = new StackTrace(); 
    StackFrame stackFrame = stackTrace.GetFrame(1); 
    MethodBase methodBase = stackFrame.GetMethod(); 
    return methodBase.Name; 
} 

मेरे टेस्ट स्थिरता वर्ग आधार एक से विरासत:

[TestFixture] 
public class WhenRegisteringUser : BaseTestFixture 
{ 
} 

और मैं नीचे प्रणाली का परीक्षण किया:

[Test] 
public void ShouldRegisterThenVerifyEmailThenSignInSuccessfully_WithValidUsersAndSites() 
{ 
    string testMethodName = this.GetCallerMethodName(); 
    // 
} 

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

जब यह टीमसिटी द्वारा चलाया जाता है, तो _InvokeMethodFast() वापस लौटाया जाता है जो कि एक तरीका है जो टीमसिटी अपने स्वयं के उपयोग के लिए रनटाइम पर उत्पन्न करता है।

तो मैं रनटाइम पर परीक्षण विधि का नाम कैसे प्राप्त कर सकता हूं?

+0

क्या यह वीएस से लॉन्च होने पर भी रिलीज मोड में संकलित है? –

+1

क्या आपको ढेर में बुलाए गए प्रत्येक विधि के लिए असेंबली जानकारी मिलती है? हो सकता है कि आप अपनी टेस्ट असेंबली की तलाश में ढेर को चला सकें। –

+0

एक स्टैकट्रैक मदद करेगा, यह देखने के लिए कि वास्तविक विधि नाम कॉल स्टैक को आगे सूचीबद्ध करता है या नहीं। –

उत्तर

17

आप NUnit 2.5.7/2.6 उपयोग कर रहे हैं आप उपयोग कर सकते TestContext class:

[Test] 
public void ShouldRegisterThenVerifyEmailThenSignInSuccessfully() 
{ 
    string testMethodName = TestContext.CurrentContext.Test.Name; 
} 
+1

अच्छी सुविधा :) –

+1

एमएसटीएस्ट भी इस टेस्टकॉन्टेक्स्ट में – bryanbcook

+0

में यह जानकारी उजागर करता है अब यह टीमसिटी से ठीक है लेकिन जब मैं इसे स्थानीय स्टूडियो के भीतर से स्थानीय रूप से चलाता हूं, तो यह एक अपवाद फेंकता है कि ऑब्जेक्ट प्रारंभ नहीं होता है। तो इसे विजुअल स्टूडियो के भीतर से कैसे काम करना है? –

7

आप NUnit आप ढेर के ऊपर पाश और परीक्षा पद्धति को खोजने के कर सकते हैं का उपयोग नहीं कर रहे हैं, तो:

foreach(var stackFrame in stackTrace.GetFrames()) { 
    MethodBase methodBase = stackFrame.GetMethod(); 
    Object[] attributes = methodBase.GetCustomAttributes(typeof(TestAttribute), false); 
    if (attributes.Length >= 1) { 
    return methodBase.Name; 
    } 
} 
return "Not called from a test method"; 
+0

क्या आप जानते हैं कि यह केवल एमएसटीएस्ट पर काम करता है? या यह न्यूटिट और एमएसटीएस्ट दोनों पर काम करेगा? – Yoiku

+0

आपको टेस्ट फ्रेमवर्क के लिए एनोटेशन को सही एनोटेशन के रूप में बदलने की आवश्यकता होगी। हालांकि स्वीकार्य उत्तर बताते हुए, एनयूनीट में टेस्टकॉन्टेक्स्ट है जो एक बेहतर समाधान है। –

+0

उत्तर के लिए धन्यवाद, मैं पूछ रहा था क्योंकि मैं एक एफडब्ल्यू बनाने की कोशिश कर रहा हूं और मैं खुद को न्यूटिट या एमएसटीएस्ट तक सीमित नहीं करना चाहता हूं। इसलिए मुझे लगता है कि मैं क्या करूँगा, जब तक मुझे कोई विधि नहीं मिलती है, जो नामस्थान माइक्रोसॉफ्ट या सिस्टम से नहीं है, तब तक मुझे नीचे से ऊपर तक ढेर लूप करना है। मैंने यह कोशिश की है और मुझे एमएसटीएस्ट के साथ अच्छे परिणाम मिल गए हैं और एफडब्लू को कमांड लाइन प्रोग्राम से कॉल किया गया है (मुझे मुख्य विधि मिली है)। – Yoiku

5

धन्यवाद दोस्तों; मैंने संयुक्त दृष्टिकोण का उपयोग किया ताकि अब यह सभी वातावरण में काम करे:

public string GetTestMethodName() 
{ 
    try 
    { 
     // for when it runs via TeamCity 
     return TestContext.CurrentContext.Test.Name; 
    } 
    catch 
    { 
     // for when it runs via Visual Studio locally 
     var stackTrace = new StackTrace(); 
     foreach (var stackFrame in stackTrace.GetFrames()) 
     { 
      MethodBase methodBase = stackFrame.GetMethod(); 
      Object[] attributes = methodBase.GetCustomAttributes(
             typeof(TestAttribute), false); 
      if (attributes.Length >= 1) 
      { 
       return methodBase.Name; 
      } 
     } 
     return "Not called from a test method"; 
    } 
} 
+0

देख पाएंगे, कृपया ध्यान दें कि रिलीज में यह कभी-कभी काम नहीं करता है - परीक्षण विधि को रेखांकित किया जा सकता है और आप TestAttribute देखने में सक्षम नहीं होंगे – imaximchuk

0

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

तो आप टेस्ट विधि नाम प्राप्त करने के लिए ऐसा कर सकते हैं। का उपयोग करें TestMethodAttributeटेस्टएट्रिब्यूट का इंस्टॉलेशन।

public string GetTestMethodName() 
    { 
      // for when it runs via Visual Studio locally 
      var stackTrace = new StackTrace(); 
      foreach (var stackFrame in stackTrace.GetFrames()) 
      { 
       MethodBase methodBase = stackFrame.GetMethod(); 
       Object[] attributes = methodBase.GetCustomAttributes(typeof(TestMethodAttribute), false); 
       if (attributes.Length >= 1) 
       { 
        return methodBase.Name; 
       } 
      } 
      return "Not called from a test method"; 
    } 
11

जब दृश्य स्टूडियो का उपयोग कर यदि आप अपने परीक्षण कक्षा में एक TestContext property जोड़ने आप आसानी से इस जानकारी प्राप्त कर सकते अपने परीक्षण चलाने के लिए।

[TestClass] 
public class MyTestClass 
{ 
    public TestContext TestContext { get; set; } 

    [TestInitialize] 
    public void setup() 
    { 
     logger.Info(" SETUP " + TestContext.TestName); 
     // .... // 
    } 
} 
संबंधित मुद्दे