2008-12-07 11 views
41

मुझे पता है कि एमएसटीएस्ट RowTest और इसी तरह के परीक्षणों का समर्थन नहीं करता है।एमएसटीएस्ट के साथ पंक्ति कैसे करें?

MSTests उपयोगकर्ता क्या करते हैं? RowTest समर्थन के बिना जीना संभव है?

मैंने DataDriven परीक्षण सुविधाओं को देखा है लेकिन बहुत अधिक ओवरहेड की तरह लगता है, क्या कोई तीसरी पार्टी पैच या उपकरण है जो मुझे RowTestMSTest में समान परीक्षण करने की अनुमति देता है?

+1

अफसोस की बात है, DaTest केवल VS2008 के साथ काम करता प्रतीत होता है। –

+1

http://code.google.com/p/datest/wiki/DaTest –

+0

संभावित डुप्लिकेट [MSTest में एकाधिक पैरामीटर के साथ एक परीक्षण विधि कैसे चलाएं?] (Http://stackoverflow.com/questions/9021881/how -to-run-a-test-method-with-multiple-पैरामीटर-इन-एमस्टेस्ट) – Rob

उत्तर

35
[TestMethod] 
Test1Row1 
{ 
    Test1(1,4,5); 
} 

[TestMethod] 
Test1Row2 
{ 
    Test1(1,7,8); 
} 

private Test1(int i, int j, int k) 
{ 
    //all code and assertions in here 
} 
+2

यह वह तरीका है जिसका मैंने उपयोग किया है, और यह आपको प्रत्येक "पंक्ति" को अलग, और उम्मीदवार वर्णनात्मक नाम देने देता है। – Mel

4

हम VS2012 Update1 में DataRow के लिए समर्थन में जोड़ लिया है में वर्णित है। See this blog for a breif introduction

संपादित करें: यह विशेषता है कि यह सुविधा वर्तमान में विंडोज स्टोर ऐप्स तक सीमित है।

+7

यह विंडोज स्टोर ऐप्स के लिए क्यों सीमित है? क्या यह जल्द ही नियमित परीक्षण परियोजनाओं के लिए उपलब्ध होगा? – DevDave

+1

xUnit ने इतने लंबे समय तक ऐसा किया है। यह एक आम परिदृश्य है, इसे केवल विंडोज स्टोर ऐप्स के लिए क्यों सक्षम किया जाना चाहिए? इसका कोई मतलब नही बनता। – CodeMonkeyKing

+0

@DevDave जबकि मुझे vnext योजनाओं के बारे में पता नहीं है, वहां विरासत mstest परियोजनाओं के लिए एक एडाप्टर उपलब्ध है जो समान कार्यक्षमता प्रदान करता है। विवरण के लिए इस ब्लॉग को देखें: http://blogs.msdn.com/b/vstsqualitytools/archive/2009/09/04/extending-the-visual-studio-unit-test-type-part-2.aspx – allen

0

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

[TestClass] 
public class Ha_ha_ha_Test: MsTestRows.Rows.TestRows_42<string> 
{ 
    public override void TestMethod(string dataRow, int rowNumber) 
    { 
     Console.WriteLine(dataRow); 
     Assert.IsFalse(dataRow.Contains("3")); 
    } 

    public override string GetNextDataRow(int rowNumber) 
    { 
     return "data" + rowNumber; 
    } 
} 

अधिक विवरण:

https://github.com/dzhariy/mstest-rows

7

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

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

https://github.com/Thwaitesy/MSTestHacks

1)NuGet पैकेज इंस्टॉल करें।

2) TestBase

public class UnitTest1 : TestBase 
{ } 

3) से अपने परीक्षण वर्ग उत्तराधिकार एक संपत्ति, फील्ड या विधि बनाएं, कि रिटर्न IEnumerable

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) MSTest जोड़े डेटासोर्स आपके परीक्षण विधि में विशेषता है, जो उपरोक्त IENumerable नाम पर वापस इंगित करता है। इसे पूरी तरह से योग्यता की आवश्यकता है।

[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 
{ 
    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 }; 
      } 
     } 

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

      Assert.IsNotNull(number); 
     } 
    } 
} 
+0

बहुत बहुत धन्यवाद, @Thwaitesy! आपने मुझे बहुत समय बचा लिया है। – tsul

1

अपनी टीम पर है कि एमएस टेस्ट ढांचे का उपयोग कर में लॉक हो गया है की तरह, हम एक तकनीक है कि बेनामी पर केवल निर्भर करता है विकसित परीक्षण डेटा की सरणी रखने के लिए प्रकार, और 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 पर अधिक पृष्ठभूमि और विस्तार के साथ इस समाधान के बारे में ब्लॉग किया है।

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