हम MSTest में कई मापदंडों के साथ एक परीक्षण विधि कैसे चला सकते हैं?


140

NUnit में नीचे की तरह वेल्यूज नामक एक सुविधा है:

[Test]
public void MyTest(
    [Values(1,2,3)] int x,
    [Values("A","B")] string s)
{
    // ...
}

इसका मतलब है कि परीक्षण विधि छह बार चलेगी:

MyTest(1, "A")
MyTest(1, "B")
MyTest(2, "A")
MyTest(2, "B")
MyTest(3, "A")
MyTest(3, "B")

अब हम MSTest का उपयोग कर रहे हैं, लेकिन क्या इसके लिए कोई समकक्ष है ताकि मैं एक ही परीक्षण कई मापदंडों के साथ चला सकूं?

[TestMethod]
public void Mytest()
{
    // ...
}

जैसा कि stackoverflow.com/a/19536942/52277 उत्तर में वर्णित है, आप MSTestHacks का उपयोग कर सकते हैं ।
माइकल फ्रीजिम


@MichaelFreidgeim यह सवाल आपके सुझाव लक्ष्य की तुलना में बेहतर जवाब है
रोब

1
@Rob: IMHO, सबसे उपयुक्त उत्तर -MestestHacks - MSTest के साथ कैसे रोवेस्ट करें? इस सवाल में गायब है।
माइकल फ्रीजिम

शायद @MichaelFreidgeim, ऐसा लगता है कि हालांकि कार्यक्षमता अब 3 1/2 साल (के लिए ही अस्तित्व में है stackoverflow.com/questions/9021881/... )
रोब

जवाबों:


46

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

मेरा व्यक्तिगत विचार सिर्फ NUnit के साथ रहना होगा ...

विज़ुअल स्टूडियो 2012 के अनुसार, अपडेट 1, MSTest में एक समान सुविधा है। देखें मैकडेन का जवाब


हम सेलेनियम का उपयोग कर रहे हैं जो NUnit कोड उत्पन्न करता है, इसलिए हमने NUnit का उपयोग करने के लिए स्विच किया :) :)
लाइट

4
मैंने पाया है कि विज़ुअल स्टूडियो 2012 अपडेट 1 में अब ऐसा ही कुछ संभव है, इस उत्तर को देखने वाले किसी भी व्यक्ति के भविष्य के विचार के लिए सिर्फ FYI करें।
मैकडॉन 19

@McAden क्या आपके पास स्पष्टीकरण के साथ लिंक है?
jeroenh

6
मैंने एक उदाहरण और अपने ब्लॉग पोस्ट के लिंक के साथ नीचे एक उत्तर दिया। यह आवश्यक विशेषताओं का उल्लेख करता है और विशेषता पर "DisplayName" गुण भी है जो टेस्ट एक्सप्लोरर में मामलों को अलग करता है। CTP के अक्टूबर अनाउंसमेंट (जो अब आधिकारिक रिलीज है) में भी इसका उल्लेख किया गया था। blogs.msdn.com/b/visualstudioalm/archive/2012/10/10/26/… मैंने इस SO प्रश्न की जानकारी जोड़ दी है क्योंकि मैं इसके लिए काफी समय लगा। उम्मीद है कि यह कुछ समय किसी को बचाएगा।
मैकडेन 22

167

EDIT 4 : ऐसा लगता है कि MSTest V2 जून 17, 2016 में पूरा हो गया है: https://blogs.msdn.microsoft.com/visualstudioalm/2016/06/17/taking-the-mstest-framework-forward-with-mstest- v2 /

मूल उत्तर :

लगभग एक सप्ताह पहले विजुअल स्टूडियो 2012 अपडेट 1 में कुछ ऐसा ही अब संभव है:

[DataTestMethod]
[DataRow(12,3,4)]
[DataRow(12,2,6)]
[DataRow(12,4,3)]
public void DivideTest(int n, int d, int q)
{
  Assert.AreEqual( q, n / d );
}

EDIT : ऐसा लगता है कि यह केवल WinRT / मेट्रो के लिए इकाई परीक्षण परियोजना के भीतर उपलब्ध है । क्षमा

EDIT 2 : विजुअल स्टूडियो के भीतर "गो टू डेफिनिशन" का उपयोग करते हुए निम्नलिखित मेटाडेटा पाया जाता है:

#region Assembly Microsoft.VisualStudio.TestPlatform.UnitTestFramework.dll, v11.0.0.0
// C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0\ExtensionSDKs\MSTestFramework\11.0\References\CommonConfiguration\neutral\Microsoft.VisualStudio.TestPlatform.UnitTestFramework.dll
#endregion

using System;

namespace Microsoft.VisualStudio.TestPlatform.UnitTestFramework
{
    [AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
    public class DataTestMethodAttribute : TestMethodAttribute
    {
        public DataTestMethodAttribute();

        public override TestResult[] Execute(ITestMethod testMethod);
    }
}

EDIT 3 : इस मुद्दे को Visual Studio के UserVoice मंचों में लाया गया था। अंतिम अद्यतन स्थिति:

STARTED · विज़ुअल स्टूडियो टीम ADMIN विज़ुअल स्टूडियो टीम (उत्पाद टीम, Microsoft विज़ुअल स्टूडियो) ने जवाब दिया · 25 अप्रैल, 2016 प्रतिक्रिया के लिए धन्यवाद। हमने इस पर काम करना शुरू कर दिया है।

प्रताप लक्ष्मण विजुअल स्टूडियो

https://visualstudio.uservoice.com/forums/330519-team-services/suggestions/3865310-allow-use-of-datatestmethod-datarow-in-all-unit


4
विजुअल स्टूडियो 2012 अपडेट 2 (वर्तमान में, CTP 4) के साथ विंडोज फोन अब भी समर्थित है
पेड्रो लामास

8
मेरे पास 1 अद्यतन है, लेकिन DataTestMethod और DataRow मान्यता प्राप्त नहीं हैं, ये विशेषताएँ किस लाइब्रेरी में हैं?
देववेद

3
क्या DataTestMethod के बारे में कोई आधिकारिक स्रोत है? यह किस विधानसभा में है?
इगोर लंकिन

2
मैंने पाया कि UnitTestFramework.dll मेरे कंप्यूटर पर स्थापित किया गया था और मैन्युअल रूप से इसे संदर्भित करने के बाद मैं डेटा पंक्तियों के साथ [DataTestMethod] विशेषता का उपयोग करके एक विधि लिखने में सक्षम था, लेकिन मैं विधि स्टूडियो में Visual Studio 2012.3 को खोजने के लिए विधि नहीं ढूँढ सकता।
जोश DeLong

5
मैं अपने कंप्यूटर पर "C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v8.0 \ ExtensionSDKs \ MSTestFramework \ 11.0 \ References \ CommonConfiguration \ neutral \ Microsoft.VisualStudio.TestPlatform.UnitTestFramework.dll" फ़ाइल पथ पर चला गया। और फ़ाइल वहाँ थी। इसलिए मैंने इसे अपनी मूल इकाई परीक्षण परियोजना में संदर्भित किया। JustDecompile में dll को खोलने से पता चलता है कि लाइब्रेरी में केवल mscorlib, System और System.Core के संदर्भ हैं। यह एक विंडोज स्टोर परियोजना नहीं है।
जोश डेलांग 10

34

यह सुविधा अभी प्री-रिलीज़ में है और विज़ुअल स्टूडियो 2015 के साथ काम करती है।

उदाहरण के लिए:

[TestClass]
public class UnitTest1
{
    [DataTestMethod]
    [DataRow(1, 2, 2)]
    [DataRow(2, 3, 5)]
    [DataRow(3, 5, 8)]
    public void AdditionTest(int a, int b, int result)
    {
        Assert.AreEqual(result, a + b);
    }
}

यह सही जवाब है। ध्यान दें कि [DataTestMethod] को [DataRow] ( stackoverflow.com/a/59162403/2540235 ) का उपयोग करने के लिए आवश्यक नहीं है
१५:५०

11

NUnit Value(या TestCase) विशेषताओं के समान नहीं है , लेकिन MSTest में हैDataSource विशेषता है, जो आपको एक समान कार्य करने की अनुमति देती है।

आप इसे डेटाबेस या XML फ़ाइल पर हुक कर सकते हैं - यह NUnit की सुविधा के समान सीधा नहीं है, लेकिन यह काम करता है।


7

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


6

इसे लागू करना बहुत सरल है - आपको TestContextसंपत्ति का उपयोग करना चाहिए और TestPropertyAttribute

उदाहरण

public TestContext TestContext { get; set; }
private List<string> GetProperties()
{
    return TestContext.Properties
        .Cast<KeyValuePair<string, object>>()
        .Where(_ => _.Key.StartsWith("par"))
        .Select(_ => _.Value as string)
        .ToList();
}

//usage
[TestMethod]
[TestProperty("par1", "http://getbootstrap.com/components/")]
[TestProperty("par2", "http://www.wsj.com/europe")]
public void SomeTest()
{
    var pars = GetProperties();
    //...
}

संपादित करें:

मैंने TestContextसंपत्ति तक पहुंच को सरल बनाने और कुछ परीक्षण मामलों की तरह कार्य करने के लिए कुछ विस्तार विधियों को तैयार किया । सरल परीक्षण गुणों के प्रसंस्करण के साथ उदाहरण देखें:

[TestMethod]
[TestProperty("fileName1", @".\test_file1")]
[TestProperty("fileName2", @".\test_file2")]
[TestProperty("fileName3", @".\test_file3")]
public void TestMethod3()
{
    TestContext.GetMany<string>("fileName").ForEach(fileName =>
    {
        //Arrange
        var f = new FileInfo(fileName);

        //Act
        var isExists = f.Exists;

        //Asssert
        Assert.IsFalse(isExists);
    });
}

और जटिल परीक्षण ऑब्जेक्ट बनाने के साथ उदाहरण:

[TestMethod]
//Case 1
[TestProperty(nameof(FileDescriptor.FileVersionId), "673C9C2D-A29E-4ACC-90D4-67C52FBA84E4")]
//...
public void TestMethod2()
{
    //Arrange
    TestContext.For<FileDescriptor>().Fill(fi => fi.FileVersionId).Fill(fi => fi.Extension).Fill(fi => fi.Name).Fill(fi => fi.CreatedOn, new CultureInfo("en-US", false)).Fill(fi => fi.AccessPolicy)
        .ForEach(fileInfo =>
        {
            //Act
            var fileInfoString = fileInfo.ToString();

            //Assert
            Assert.AreEqual($"Id: {fileInfo.FileVersionId}; Ext: {fileInfo.Extension}; Name: {fileInfo.Name}; Created: {fileInfo.CreatedOn}; AccessPolicy: {fileInfo.AccessPolicy};", fileInfoString);
        });
}

अधिक जानकारी के लिए विस्तार के तरीकों और नमूनों के सेट पर एक नज़र डालें ।


2
यह दृष्टिकोण काम करता है लेकिन मापदंडों के प्रत्येक सेट के लिए अलग-अलग परीक्षण मामले नहीं बनाता है।
usr4896260

आप TestProperty मान (उदा। "0-100") के रूप में कुछ अधिक जटिल का उपयोग कर सकते हैं, परीक्षण के शरीर में इसे संभाल सकते हैं।
एंड्री ब्रुकिन

4

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

विजुअल स्टूडियो 2012 में, यह TestExplorer में दो परीक्षण बनाता है:

  1. DemoTest_B10_A5.test
  2. DemoTest_A12_B4.test

    public class Demo
    {
        int a, b;
    
        public Demo(int _a, int _b)
        {
            this.a = _a;
            this.b = _b;
        }
    
        public int Sum()
        {
            return this.a + this.b;
        }
    }
    
    public abstract class DemoTestBase
    {
        Demo objUnderTest;
        int expectedSum;
    
        public DemoTestBase(int _a, int _b, int _expectedSum)
        {
            objUnderTest = new Demo(_a, _b);
            this.expectedSum = _expectedSum;
        }
    
        [TestMethod]
        public void test()
        {
            Assert.AreEqual(this.expectedSum, this.objUnderTest.Sum());
        }
    }
    
    [TestClass]
    public class DemoTest_A12_B4 : DemoTestBase
    {
        public DemoTest_A12_B4() : base(12, 4, 16) { }
    }
    
    public abstract class DemoTest_B10_Base : DemoTestBase
    {
        public DemoTest_B10_Base(int _a) : base(_a, 10, _a + 10) { }
    }
    
    [TestClass]
    public class DemoTest_B10_A5 : DemoTest_B10_Base
    {
        public DemoTest_B10_A5() : base(5) { }
    }

4

MSTest उस सुविधा का समर्थन नहीं करता है, लेकिन आप इसे प्राप्त करने के लिए अपनी विशेषता को लागू कर सकते हैं।

PostSharp का उपयोग करके MSTest में पैरामीटर किए गए परीक्षणों को सक्षम करने पर एक नज़र डालें ।


3

मुझे DataRowAttributeविजुअल स्टूडियो 2015 में काम करने के लिए नहीं मिला , और यही मैंने समाप्त किया:

[TestClass]
public class Tests
{
    private Foo _toTest;

    [TestInitialize]
    public void Setup()
    {
        this._toTest = new Foo();
    }

    [TestMethod]
    public void ATest()
    {
        this.Perform_ATest(1, 1, 2);
        this.Setup();

        this.Perform_ATest(100, 200, 300);
        this.Setup();

        this.Perform_ATest(817001, 212, 817213);
        this.Setup();
    }

    private void Perform_ATest(int a, int b, int expected)
    {
        // Obviously this would be way more complex...

        Assert.IsTrue(this._toTest.Add(a,b) == expected);
    }
}

public class Foo
{
    public int Add(int a, int b)
    {
        return a + b;
    }
}

यहाँ वास्तविक समाधान सिर्फ NUnit का उपयोग करना है (जब तक कि आप MSTest में फंस नहीं जाते हैं जैसे मैं इस विशेष उदाहरण में हूं)।


3
जब आप उनमें से एक को तोड़ देंगे, तो आपको बचाने के लिए आपको प्रत्येक परीक्षण कॉल को एक अलग परीक्षण में विभाजित करना चाहिए। (जो हम सभी जानते हैं कि होगा)
रजत

हां बिल्कुल। व्यवहार में यह है कि यह कैसे किया जाएगा। इस मामले में मैं इसे सरलता के लिए
ब्रैंडन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.