क्या MSTest NUnit के TestCase के बराबर है?


107

मैं TestCaseNUnit में सुविधा को प्रत्येक परीक्षण के लिए एक अलग विधि की आवश्यकता के बिना परीक्षण मापदंडों को निर्दिष्ट करने के त्वरित तरीके के रूप में काफी उपयोगी मानता हूं । क्या MSTest में भी कुछ ऐसा ही है?

 [TestFixture]  
 public class StringFormatUtilsTest  
 {  
     [TestCase("tttt", "")]  
     [TestCase("", "")]  
     [TestCase("t3a4b5", "345")]  
     [TestCase("3&5*", "35")]  
     [TestCase("123", "123")]  
     public void StripNonNumeric(string before, string expected)  
     {  
         string actual = FormatUtils.StripNonNumeric(before);  
         Assert.AreEqual(expected, actual);  
     }  
 }  


आप NUnit का उपयोग क्यों नहीं करते?
माइक डी क्लार्क

1
@MikedeKlerk: अगर आप एंटिटी फ्रेमवर्क का उपयोग कर रहे हैं तो नुनिट अविश्वसनीय रूप से धीमा है ... यह स्पष्ट रूप से आपके द्वारा बनाई गई कक्षाओं में हर बार जब आप परीक्षण चलाते हैं, तो यह दर्शाता है।
रॉबर्ट हार्वे

सामान्यतया, NUnit में MSTest की तुलना में अधिक विशेषताएं हैं, यदि आप MSTest का उपयोग केवल वीएस टेस्ट एक्सप्लोरर के साथ अपने परीक्षण चलाने में सक्षम होने के लिए कर रहे हैं, तो आप NUnit के साथ NUnit टेस्ट एडेप्टर एक्सटेंशन को NuGet
Stacked

1
कोशिश करें DataRow(), देखें: blogs.msdn.microsoft.com/devops/2016/06/17/…
बाबाक

जवाबों:


62

Microsoft ने हाल ही में "MSTest V2" ( ब्लॉग-लेख देखें ) की घोषणा की । यह आपको लगातार (डेस्कटॉप, UWP, ...) DataRow-attribute का उपयोग करने की अनुमति देता है!

 [TestClass]  
 public class StringFormatUtilsTest  
 {  
     [DataTestMethod]  
     [DataRow("tttt", "")]  
     [DataRow("", "")]  
     [DataRow("t3a4b5", "345")]  
     [DataRow("3&5*", "35")]  
     [DataRow("123", "123")]  
     public void StripNonNumeric(string before, string expected)  
     {  
         string actual = FormatUtils.StripNonNumeric(before);  
         Assert.AreEqual(expected, actual);  
     }  
 } 

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

इसका उपयोग करने के लिए, बस NuGet संकुल MSTest.TestFramework और MSTest.TestAdapter स्थापित करें (दोनों पूर्व रिलीज़ अब तक)।

पुराना उत्तर:

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

टेस्ट एक्सप्लोरर के माध्यम से NUnit परीक्षण चलाने में सक्षम होने के लिए VsTestAdapter VSIX एक्सटेंशन है । दुर्भाग्य से, वीएस एक्सप्रेस उपयोगकर्ता एक्सटेंशन इंस्टॉल नहीं कर सकते ... लेकिन सौभाग्य से VsTestAdapter एक सादे NuGet- पैकेज के साथ भी आता है!

इसलिए, यदि आप एक वीएस एक्सप्रेस उपयोगकर्ता हैं, तो बस VsTestAdapter NuGet- पैकेज स्थापित करें और टेस्ट एक्सप्लोरर के माध्यम से अपने NUnit परीक्षण / Testcases को चलाने का आनंद लें!


दुर्भाग्य से उपर्युक्त कथन सत्य नहीं है। जबकि एक्सप्रेस संस्करण के माध्यम से पैकेज को स्थापित करना पूरी तरह से संभव है, यह बेकार है, क्योंकि यह टेस्ट एक्सप्लोरर का उपयोग नहीं कर सकता है। पहले TestAdapter के पुराने संस्करण पर एक साइड नोट था, जिसे 2.0.0 के विवरण पृष्ठ से हटा दिया गया था :

ध्यान दें कि यह वीएस एक्सप्रेस के साथ काम नहीं करता है


4
MSTest "v2" अब वीएस 2017 का उपयोग करते समय डिफ़ॉल्ट ढांचा है। अब यह नवीनतम संस्करण पर ओओटीबी का समर्थन किया जाएगा, यह जानकारी संभवतः उत्तर के शीर्ष पर जानी चाहिए।
मार्क एल।

34

मुझे पता है कि यह एक देर से जवाब है लेकिन उम्मीद है कि यह दूसरों की मदद करता है।

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

https://github.com/Thwaitesy/MSTestHacks

1) NuGet पैकेज स्थापित करें ।

2) TestBase से अपने टेस्ट क्लास में प्रवेश करें

public class UnitTest1 : TestBase
{ }

3) एक संपत्ति, फ़ील्ड या विधि बनाएँ, जो IEnumerable देता है

[TestClass]
public class UnitTest1 : TestBase
{
    private IEnumerable<int> Stuff
    {
        get
        {
            //This could do anything, get a dynamic list from anywhere....
            return new List<int> { 1, 2, 3 };
        }
    }
}

4) ऊपर दिए गए IEnumerable नाम की ओर इशारा करते हुए, अपने परीक्षण विधि में MSTest डेटा स्रोत विशेषता जोड़ें। इसके लिए पूरी तरह से योग्य होने की जरूरत है।

[TestMethod]
[DataSource("Namespace.UnitTest1.Stuff")]
public void TestMethod1()
{
    var number = this.TestContext.GetRuntimeDataSourceObject<int>();

    Assert.IsNotNull(number);
}

अंतिम परिणाम: सामान्य डेटा स्रोत की तरह 3 पुनरावृत्तियों :)

using Microsoft.VisualStudio.TestTools.UnitTesting;
using MSTestHacks;

namespace Namespace
{
    [TestClass]
    public class UnitTest1 : TestBase
    {
        private IEnumerable<int> Stuff
        {
            get
            {
                //This could do anything, get a dynamic list from anywhere....
                return new List<int> { 1, 2, 3 };
            }
        }

        [TestMethod]
        [DataSource("Namespace.UnitTest1.Stuff")]
        public void TestMethod1()
        {
            var number = this.TestContext.GetRuntimeDataSourceObject<int>();

            Assert.IsNotNull(number);
        }
    }
}

क्या यह प्रत्येक मामले के लिए कई मापदंडों के साथ भी काम करेगा?
लोनफ़िश

क्योंकि अंतर्निहित लाइब्रेरी में एक परिवर्तन था, यह MsTest "v2" के साथ काम नहीं करता है । यह वीएस 15 (वीएस 2017) के लिए डिफ़ॉल्ट है।
मार्क एल।

3
हां, यदि आप MSTest V2 का उपयोग कर रहे हैं, तो एक नया परीक्षण केस प्रदाता है जो NUnit के समान है। इस प्रकार इस काम के लिए 👏
Thwaitesy

यह वी.एस. 2015 में काम करने के लिए नहीं लगता है, एप्लिकेशन कॉन्फ़िग फ़ाइल गतिशील रूप से पॉप्युलेट नहीं करता है और इस प्रकार datasources नहीं मिला रहे हैं
रीड

13

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

उदाहरण के लिए, मान लें कि आपके पास इस तरह की एक एक्सटेंशन विधि है:

public static class Extensions
{
    /// <summary>
    /// Get the Qtr with optional offset to add or subtract quarters
    /// </summary>
    public static int GetQuarterNumber(this DateTime parmDate, int offset = 0)
    {
        return (int)Math.Ceiling(parmDate.AddMonths(offset * 3).Month / 3m);
    }
}

आप इस तरह के परीक्षण लिखने के लिए LINQ के साथ संयुक्त बेनामी प्रकारों का उपयोग और सरणी कर सकते हैं:

[TestMethod]
public void MonthReturnsProperQuarterWithOffset()
{
    // Arrange
    var values = new[] {
        new { inputDate = new DateTime(2013, 1, 1), offset = 1, expectedQuarter = 2},
        new { inputDate = new DateTime(2013, 1, 1), offset = -1, expectedQuarter = 4},
        new { inputDate = new DateTime(2013, 4, 1), offset = 1, expectedQuarter = 3},
        new { inputDate = new DateTime(2013, 4, 1), offset = -1, expectedQuarter = 1},
        new { inputDate = new DateTime(2013, 7, 1), offset = 1, expectedQuarter = 4},
        new { inputDate = new DateTime(2013, 7, 1), offset = -1, expectedQuarter = 2},
        new { inputDate = new DateTime(2013, 10, 1), offset = 1, expectedQuarter = 1},
        new { inputDate = new DateTime(2013, 10, 1), offset = -1, expectedQuarter = 3}
        // Could add as many rows as you want, or extract to a private method that
        // builds the array of data
    }; 
    values.ToList().ForEach(val => 
    { 
        // Act 
        int actualQuarter = val.inputDate.GetQuarterNumber(val.offset); 
        // Assert 
        Assert.AreEqual(val.expectedQuarter, actualQuarter, 
            "Failed for inputDate={0}, offset={1} and expectedQuarter={2}.", val.inputDate, val.offset, val.expectedQuarter); 
        }); 
    }
}

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

मैंने AgileCoder.net पर अधिक पृष्ठभूमि और विस्तार के साथ इस समाधान के बारे में ब्लॉग किया है ।


4
इसके साथ सबसे बड़ा मुद्दा यह है कि यदि कोई मामला मानों की सरणी से बाहर हो जाता है - तो पूरा परीक्षण विफल हो जाता है और अधिक मामलों का परीक्षण नहीं किया जाता है।
ytoledano

यह परीक्षण मामलों को बनाता है जो एक दूसरे को प्रभावित कर सकते हैं।
बार्टोज़केपी

@BartoszKP केवल अगर परीक्षण के तहत प्रणाली के दुष्प्रभाव होते हैं, तो इस मामले में यह संभवतः एक इष्टतम तकनीक नहीं है।
Gary.Ray

@ Gary.Ray भी जब सिस्टम के साइड इफेक्ट नहीं हैं । इसके अलावा जब कोई परीक्षा पास नहीं होती है और कोई अन्य डेवलपर उसे ठीक करने की कोशिश करता है, और घंटों का समय यह पता लगाने की कोशिश करता है कि निर्भरता मायने रखती है या नहीं। यह सिर्फ कुछ है जो आपको कभी नहीं करना चाहिए, अवधि।
बार्टोज़केपी

काफी है। +1
ट्रे मैक

7

ख्ल्र ने एक अच्छी विस्तृत व्याख्या दी और जाहिर है कि इस दृष्टिकोण ने डेस्कटॉप के लिए VS2015 एक्सप्रेस में काम करना शुरू कर दिया। मैंने टिप्पणी छोड़ने की कोशिश की, लेकिन मेरी प्रतिष्ठा की कमी ने मुझे ऐसा करने की अनुमति नहीं दी।

मुझे यहाँ समाधान की प्रतिलिपि बनाएँ:

[TestClass]  
 public class StringFormatUtilsTest  
 {  
     [TestMethod]  
     [DataRow("tttt", "")]  
     [DataRow("", "")]  
     [DataRow("t3a4b5", "345")]  
     [DataRow("3&amp;amp;5*", "35")]  
     [DataRow("123", "123")]  
     public void StripNonNumeric(string before, string expected)  
     {  
         string actual = FormatUtils.StripNonNumeric(before);  
         Assert.AreEqual(expected, actual);  
     }  
 } 

इसका उपयोग करने के लिए, बस NuGet संकुल MSTest.TestFramework और MSTest.TestAdapter स्थापित करें ।

एक समस्या है

CS0433 त्रुटि 'TestClassAttribute' प्रकार 'Microsoft.VisualStudio.QualityTools.UnitTestFramework, संस्करण = 10.0.0.0 और' Microsoft.VisualStudio.estPlatform.TestFramework, संस्करण = 14.0.0.0.0 दोनों में मौजूद है।

इसलिए, कृपया Microsoft.VisualStudio.QualityTools.UnitTestFramework को परियोजना के संदर्भ से हटा दें ।

मूल उत्तर को संपादित करने और इसे हटाने के लिए आपका बहुत स्वागत है।


0

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

https://msdn.microsoft.com/en-us/library/ms182527.aspx?f=255&MSPPError=-2147217396 में डेटाबेस इनपुट के आधार पर एक पूर्ण ट्यूटोरियल है।

http://www.rhyous.com/2015/05/11/row-tests-or-paramerterized-tests-mstest-xml/ में XML फ़ाइल इनपुट पर आधारित एक ट्यूटोरियल है।

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