2009-05-16 16 views
6

मेरे कुछ सबसे पुराने यूनिट परीक्षण बहु-थ्रेडिंग रेस स्थितियों का पता लगाने में मदद करते हैं, और जैसे ही वे पंक्ति में कई बार दौड़ते हैं, लेकिन मैं केवल विशिष्ट परीक्षण रनों के लिए ऐसा करना चाहता हूं - - हमेशा नहीं।मैस्टेस्ट टेस्ट रन दो बार दोहराएं

क्या परीक्षण कई बार चलाने के लिए mstest (टेस्ट सूची संपादक में अधिमानतः) कॉन्फ़िगर करने का कोई तरीका है?

उत्तर

10

मुझे कुछ ऐसा करने की ज़रूरत है, इसलिए मैं इसके समाधान के साथ आया।

यह आसान नहीं है, लेकिन एक बार सबकुछ सेटअप हो जाने पर आप इसे परियोजनाओं में पुन: उपयोग कर सकते हैं। मेरे पास गिटहब (https://github.com/johnkoerner/MSTestLooper) पर इस कोड का एक डाउनलोड भी है, लेकिन अगर किसी बिंदु पर यह दूर हो जाता है, तो मैंने यह कैसे किया है।

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

class TestLooperInvoker : ITestMethodInvoker 
{ 
    private TestMethodInvokerContext m_invokerContext; 
    private string PropertyName; 

    public TestLooperInvoker(TestMethodInvokerContext InvokerContext, string PropertyName) 
    { 
     m_invokerContext = InvokerContext; 
     this.PropertyName = PropertyName; 
    } 

    public TestMethodInvokerResult Invoke(params object[] args) 
    { 

     // Our helper results class to aggregate our test results 
     HelperTestResults results = new HelperTestResults(); 

     IEnumerable<object> objects = m_invokerContext.TestContext.Properties[PropertyName] as IEnumerable<object>; 

     foreach (var d in objects) 
      results.AddTestResult(m_invokerContext.InnerInvoker.Invoke(d), new object[1] { d.GetType().ToString()}); 

     var output = results.GetAllResults(); 
     m_invokerContext.TestContext.WriteLine(output.ExtensionResult.ToString()); 

     return output; 
    } 
} 

HelperTestResults: जहाँ हम पाशन प्रदर्शन

class TestLooperExecution : TestExtensionExecution 
{ 
    private string PropertyName; 

    public TestLooperExecution(string PropertyName) 
    { 
     this.PropertyName = PropertyName; 
    } 

    public override ITestMethodInvoker CreateTestMethodInvoker(TestMethodInvokerContext InvokerContext) 
    { 
     return new TestLooperInvoker(InvokerContext, PropertyName); 
    } 

    public override void Dispose() 
    { 
     //TODO: Free, release or reset native resources 
    } 

    public override void Initialize(TestExecution Execution) 
    { 
     //TODO: Wire up event handlers for test events if needed 

    } 
} 

अंत में हम एक कस्टम invoker है, जो जोड़ें:

[Serializable] 
public class TestLooperAttribute : TestClassExtensionAttribute 
{ 
    private static readonly Uri thisGuy = new Uri("urn:TestLooperAttribute"); 

    private string _PropertyName; 
    public string PropertyName 
    { 
     get 
     { return _PropertyName; } 
     set 
     { 
      _PropertyName = value; 
     } 
    } 
    public override Uri ExtensionId 
    { 

     get { 
      return thisGuy; } 
    } 


     public override TestExtensionExecution GetExecution() 
    { 

     return new TestLooperExecution(PropertyName); 
    } 
} 

अगला हम एक कस्टम परीक्षण वर्ग निष्पादन वर्ग बनाने के लिए कक्षा सिर्फ आउटपुट के लिए स्ट्रिंग बनाती है, आप इसे कैसे संभाल सकते हैं और मैं उस कोड को शामिल नहीं करना चाहता क्योंकि यह केवल इतना पोस्ट करेगा।

एक DLL में इस संकलित करें और फिर आप

C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\PublicAssemblies 

में कॉपी करने की जरूरत है तुम भी वर्ग के लिए एक रजिस्ट्री प्रविष्टि बनाने के लिए है: यदि आपने यह सब है कि अब

Windows Registry Editor Version 5.00 
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\11.0\EnterpriseTools\QualityTools\TestTypes\{13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b}\TestTypeExtensions\TestLooperAttribute] 
"AttributeProvider"="TestLooper.TestLooperAttribute, TestLooper" 

किया गया, आप आखिरकार कक्षा का उपयोग कर सकते हैं:

using System; 
using Microsoft.VisualStudio.TestTools.UnitTesting; 
using TestLooper; 
using System.Collections.Generic; 
namespace UnitTestSamples 
{ 
    [TestLooper(PropertyName="strings")] 
    public class UnitTest1 
    { 
     public static List<String> strings = new List<String>(); 
     private TestContext testContextInstance; 

     public TestContext TestContext 
     { 
      get 
      { 
       return testContextInstance; 
      } 
      set 
      { 
       testContextInstance = value; 
      } 
     } 
     [ClassInitialize()] 
     public static void Init(TestContext x) 
     { 
      strings.Add("A"); 
      strings.Add("B"); 
      strings.Add("C"); 
      strings.Add("D"); 

     } 

     [TestInitialize()] 
     public void TestInit() 
     { 
      if (!TestContext.Properties.Contains("strings")) 
      testContextInstance.Properties.Add("strings", strings); 
     } 

     [TestMethod] 
     [DataSource("Microsoft.VisualStudio.TestTools.DataSource.CSV", "DataDriven1.csv", "DataDriven1#csv", DataAccessMethod.Sequential)] 
     [DeploymentItem("DataDriven1.csv")] 
     public void TestMethodStrings(string s) 

     { 
      int value1 = Convert.ToInt32(TestContext.DataRow["Col1"]); ; 
      TestContext.WriteLine(String.Format("{0}:{1}", s, value1)); 
     } 
    } 
} 

ध्यान दें कि हमारी टेस्ट विधि पैरामीटर स्वीकार करती है, जो f परीक्षण परीक्षण लोपर। मैं इसे डेटा संचालित परीक्षण का उपयोग करके भी दिखाता हूं, यह दिखाने के लिए कि आप अपने डेटा सेट में बड़े क्रमपरिवर्तन उत्पन्न करने के लिए दोनों को एक साथ जोड़ सकते हैं।

+0

मुझे यह भी पता नहीं था कि एमएसटीएस्ट की इतनी विस्तारशीलता थी। यह बहुत अच्छा है, धन्यवाद! –

2

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

+0

यह एक दिलचस्प दृष्टिकोण है। धन्यवाद। –

2

मुझे लगता है कि उत्तर नहीं है।

3
[TestMethod()] 
public void RepetableTest(){ 
    for(int i = 0; i < repeatNumber; i++){ 

    //test code goes here 


    } 
} 
+1

http://stackoverflow.com/questions/25565574/run-unittest-several-time-not-just-loop-it देखें? क्यों यह हमेशा आवश्यक परिणाम प्राप्त नहीं करता है। – Ricibob

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