2014-06-16 12 views
11

एमएसटीएस्ट का उपयोग करके, मुझे [TestInitialize] विधि के भीतर से वर्तमान परीक्षण का नाम प्राप्त करने की आवश्यकता है। आप इसे TestContext.TestName संपत्ति से प्राप्त कर सकते हैं।एमएसटीएस्ट टेस्टकॉन्टेक्स्ट को समझना

मुझे के बीच व्यवहार में एक अप्रत्याशित अंतर मिला जो [ClassInitialize] विधि में पारित किया गया है और जिसे सार्वजनिक संपत्ति के रूप में घोषित किया गया है (और परीक्षण धावक द्वारा सेट किया जाता है)।

TextContext.TestName='TestMethod1' static _testContext.TestName='TestMethod1' 
TextContext.TestName='TestMethod2' static _testContext.TestName='TestMethod1' 
TextContext.TestName='TestMethod3' static _testContext.TestName='TestMethod1' 

मैं पहले कि ग्रहण किया था: (VS2013 में Resharper परीक्षण धावक उत्पादन से कॉपी-पेस्ट किया)

using System; 
using Microsoft.VisualStudio.TestTools.UnitTesting; 

namespace TestContext.Tests 
{ 
    [TestClass] 
    public class UnitTest1 
    { 
     public TestContext TestContext { get; set; } 

     private static TestContext _testContext; 

     [ClassInitialize] 
     public static void SetupTests(TestContext testContext) 
     { 
      _testContext = testContext; 
     } 

     [TestInitialize] 
     public void SetupTest() 
     { 
      Console.WriteLine(
       "TextContext.TestName='{0}' static _testContext.TestName='{1}'", 
       TestContext.TestName, 
       _testContext.TestName); 
     } 

     [TestMethod] public void TestMethod1() { Assert.IsTrue(true); } 

     [TestMethod] public void TestMethod2() { Assert.IsTrue(true); } 

     [TestMethod] public void TestMethod3() { Assert.IsTrue(true); } 
    } 
} 

यह निम्न उत्पादन होने का कारण बनता है:

निम्नलिखित कोड पर विचार करें TestContext के दो उदाहरण बराबर होंगे, लेकिन स्पष्ट रूप से वे नहीं हैं।

  • public TestContext संपत्ति मैं उम्मीद के रूप में
  • private static TestContext मूल्य [ClassInitialize] विधि के लिए पारित हो जाता है जो ऐसा नहीं करता व्यवहार करता है। चूंकि TestContext गुण वर्तमान में चल रहे परीक्षण से संबंधित है, इसलिए ऐसा करना भ्रामक लगती है और टूट

वहाँ किसी भी परिदृश्य में जहाँ आप वास्तव में TestContext[ClassInitialize] विधि को पास किए जाने का उपयोग करना चाहते हैं, या इसे सबसे अच्छा नजरअंदाज कर दिया और कभी नहीं किया गया है उपयोग किया गया? गुण सेट TestContext सेट किया गया है से पहले

+0

धावक प्रत्येक परीक्षण से पहले एक नया टेस्टकॉन्टेक्स्ट उदाहरण बना रहा है। क्या आप पूछ रहे हैं कि इसे इस तरह क्यों डिजाइन किया गया था? –

+1

@ माइकज़ - मेरे लिए 'निजी स्थैतिक टेस्ट कॉन्टेक्स्ट' व्यवहार गलत लगता है। मैं यही पूछ रहा हूं। –

+0

'_testContext' एक फ़ील्ड है जिसे आपने केवल एक बार असाइन किया है, '[ClassInitialize]' विशेषता के साथ चिह्नित विधि के अंदर। परीक्षणों के बीच आप इसे बदलने की उम्मीद क्यों करेंगे? जैसा कि @ माइक ने लिखा था, प्रत्येक टेस्ट को एक नया 'टेस्ट कॉन्टेक्स्ट' उदाहरण मिलता है। – Groo

उत्तर

8

[ClassInitialize] के रूप में केवल शुरुआत में कहा जाता है सेट कर दिया जाता का उपयोग करें, परीक्षण नाम 'TestMethod1` है। यह पहली टेस्ट रन के बाद पुराना है।

TestContext प्रत्येक विधि के लिए सेट है, और इस प्रकार वर्तमान परीक्षण नाम है।

हां, यह थोड़ा मूर्ख है।

+1

मेरी उम्मीद/उम्मीद थी कि परीक्षण धावक 'टेक्स्टकॉन्टेक्स्ट' के संदर्भ को बनाए रखेगा जो इसे '[क्लासइन्स्टिलाइज]' विधि से गुजरता है, और इसके मानों को सही तरीके से अपडेट किया जाता है ... –

+2

@ रिचर्डएवरेट यह अधिक व्यावहारिक होता और अधिक सहज ज्ञान युक्त।बेहतर अभी भी, 'प्रारंभिक()' विधि केवल स्थिर डेटा को पास करना होगा। – BanksySan

2

विधि

[ClassInitialize] 
public static void SetupTests(TestContext testContext) { } 

कहा जाता है। इसलिए यदि आपको SetupTests में संदर्भ की आवश्यकता है तो पैरामीटर उपयोगी है। अन्यथा TestContext संपत्ति है, जो पहले प्रत्येक

[TestInitialize] 
public void SetupTest() { } 
संबंधित मुद्दे