এমএসটিস্টে একাধিক পরামিতি সহ আমরা কীভাবে একটি পরীক্ষা পদ্ধতি চালাতে পারি?


140

নুনিটের নীচের মতো মানগুলি নামে একটি বৈশিষ্ট্য রয়েছে:

[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")

আমরা এখন এমএসটিস্ট ব্যবহার করছি, তবে এর পক্ষে কি কোনও সমমান রয়েছে যাতে আমি একাধিক পরামিতি দিয়ে একই পরীক্ষা চালাতে পারি?

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

বর্ণনা অনুযায়ী আপনি MSTestHacks ব্যবহার করতে পারেন stackoverflow.com/a/19536942/52277 উত্তর।
মাইকেল ফ্রিজিম


@ মিশেলফ্রিজেম এই প্রশ্নের আপনার প্রস্তাবিত টার্গেটের চেয়ে ভাল উত্তর রয়েছে
রব

1
@ রব: আইএমএইচও, সবচেয়ে উপযুক্ত উত্তর - এমএসটিস্টহ্যাকস - এমএসটিস্টের সাথে রাউস্টেস্ট কীভাবে করবেন? এই প্রশ্নের অনুপস্থিত।
মাইকেল ফ্রেইজিম

@ মিশেলফ্রিজেম সম্ভবত, যদিও এটি উপস্থিত থেকে 3/2 বছর ধরে কার্যকারিতা বিদ্যমান রয়েছে বলে মনে হচ্ছে ( স্ট্যাকওভারফ্লো / সেকশনস / 9021881/… )
রব

উত্তর:


46

এটি দুর্ভাগ্যক্রমে এমস্টেস্টের পুরানো সংস্করণগুলিতে সমর্থিত নয়। স্পষ্টতই একটি এক্সটেনসিবিলিটি মডেল রয়েছে এবং আপনি নিজে এটি প্রয়োগ করতে পারেন । আর একটি বিকল্প হ'ল ডেটা-চালিত পরীক্ষাগুলি ব্যবহার করা ।

আমার ব্যক্তিগত মতামতটি কেবল নুনিটের সাথে আঁকতে হবে যদিও ...

ভিজ্যুয়াল স্টুডিও ২০১২, আপডেট 1 হিসাবে, এমএসটিস্টের একটি অনুরূপ বৈশিষ্ট্য রয়েছে। দেখুন McAden এর উত্তর


আমরা সেলেনিয়াম ব্যবহার করছি যা নুনিট কোড উত্পন্ন করে তাই আমরা এর পরিবর্তে নুনিট ব্যবহার করতে শুরু করলাম :)
দ্য লাইট

4
আমি খুঁজে পেয়েছি যে অনুরূপ কিছু এখন ভিজ্যুয়াল স্টুডিও 2012 আপডেট 1 এ সম্ভব হয়েছে, কেবল উত্তরটি দেখার জন্য কারও ভবিষ্যতের বিবেচনার জন্য এফআইআইআই।
ম্যাকএডেন

@ এমসিএডেনের একটি ব্যাখ্যা সহ আপনার কোনও লিঙ্ক আছে?
jeroenh

6
আমি নীচে একটি উত্তর দিয়েছি এবং আমার ব্লগ পোস্টে একটি লিঙ্ক। এটি টেস্ট এক্সপ্লোরারগুলিতে কেসগুলি পৃথক করে এমন বৈশিষ্ট্যগুলিতে প্রয়োজনীয় বৈশিষ্ট্যগুলি এবং "প্রদর্শন নাম" বৈশিষ্ট্যগুলির উল্লেখ করে। এছাড়া অন্তর্গত CTP (যা এখন সরকারী রিলিজ হয়েছে) এর অক্টোবর announcment মধ্যে উল্লেখ করা হয়েছে blogs.msdn.com/b/visualstudioalm/archive/2012/10/26/... আমি এই তাই প্রশ্ন তথ্য জুড়েছেন কারণ আমি এটি সন্ধান করার জন্য বেশ কিছুটা সময় ব্যয় করে। আশা করি এটি কারও কিছু সময় সাশ্রয় করবে।
ম্যাকএডেন

167

সম্পাদনা 4 : এমএসটিস্ট ভি 2 এ 17 জুন, 2016 এ দেখে মনে হচ্ছে: https ://blogs.msdn.mic Microsoft.com/visualstudioalm/2016/06/17/taking-the-mstest-framework-forward-with-mstest- v2 /

আসল উত্তর :

প্রায় এক সপ্তাহ আগে ভিজ্যুয়াল স্টুডিও ২০১২ আপডেটে 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 );
}

সম্পাদনা : এটা মনে হচ্ছে, এই জন্য ইউনিট টেস্টিং প্রকল্পের মধ্যে শুধুমাত্র উপলব্ধ WinRT / মেট্রো । অকর্মা

সম্পাদনা 2 : নিম্নলিখিত ভিজ্যুয়াল স্টুডিওর মধ্যে "Go to Definition" ব্যবহার করে মেটাটাটা পাওয়া গেছে:

#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);
    }
}

সম্পাদনা 3 : এই সমস্যাটি ভিজ্যুয়াল স্টুডিওর ইউজারভয়েস ফোরামে তুলে ধরা হয়েছিল। সর্বশেষ আপডেটে বলা হয়েছে:

শুরু হয়েছে · ভিজ্যুয়াল স্টুডিও টিম অ্যাডমিন ভিজ্যুয়াল স্টুডিও টিম (পণ্য দল, মাইক্রোসফ্ট ভিজ্যুয়াল স্টুডিও) সাড়া দিয়েছে · 25 এপ্রিল, 2016 প্রতিক্রিয়াটির জন্য আপনাকে ধন্যবাদ। আমরা এ নিয়ে কাজ শুরু করেছি।

প্রতাপ লক্ষ্মণ ভিজ্যুয়াল স্টুডিও

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


4
উইন্ডোজ ফোনটি এখন ভিজ্যুয়াল স্টুডিও 2012 আপডেট 2 (বর্তমানে সিটিপি 4) এর সাথেও সমর্থিত
পেড্রো লামাস

8
আমার কাছে আপডেট 1 আছে তবে ডেটা টেস্টমেথোড এবং ডেটারো সনাক্ত করা যায় না, এই বৈশিষ্ট্যগুলি কোন লাইব্রেরিতে রয়েছে?
ডেভডেভ

3
ডেটা টেস্টমেথোড সম্পর্কে কোনও অফিসিয়াল উত্স আছে? এটি কোন নেমস্পেসে, কোন সমাবেশে?
ইগোর লঙ্কিন

2
আমি দেখতে পেলাম যে ইউনিট টেস্টফ্রেম ওয়ার্ক.ডিল আমার কম্পিউটারে ইনস্টল করা হয়েছিল এবং ম্যানুয়ালি এটি উল্লেখ করার পরে আমি ডাটা সারিগুলির সাথে [ডাটাস্টেস্টমেথড] বৈশিষ্ট্যটি ব্যবহার করে একটি পদ্ধতি লিখতে সক্ষম হয়েছি তবে পদ্ধতিটি খুঁজে পেতে আমি ভিজ্যুয়াল স্টুডিও 2012.3-এ টেস্ট এক্সপ্লোরার পেতে পারি না।
জোশ দেলং

5
আমি "সি: \ প্রোগ্রাম ফাইলগুলি (x86) \ মাইক্রোসফ্ট এসডিকে \ উইন্ডোজ \ v8.0 \ এক্সটেনশনএসডিকে \ এমএসটিস্টফ্রেমওয়ার্ক \ 11.0 \ রেফারেন্সগুলি \ কমন কনফিগারেশন \ নিরপেক্ষ \ মাইক্রোসফ্ট.ভিজুয়ালস্টুডিও.টেষ্টপ্লেটফর্ম.উনিটটেষ্টফ্রেম কম্পিউটার এবং ফাইলটি ছিল। সুতরাং আমি এটি আমার বেসিক ইউনিট পরীক্ষা প্রকল্পে উল্লেখ করেছি। JustDecompile এ dll খুললে বোঝা যায় যে লাইব্রেরিতে কেবলমাত্র mscorlib, সিস্টেম এবং System.Core এর উল্লেখ রয়েছে। এটি কোনও উইন্ডোজ স্টোর প্রকল্প নয়।
জোশ দেলং

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 )
mattavatar

11

নুনিটের Value(বা TestCase) বৈশিষ্ট্যগুলির মতো ঠিক একই নয় , তবে এমএসটিস্টের DataSourceবৈশিষ্ট্য রয়েছে, যা আপনাকে অনুরূপ কাজ করতে দেয়।

আপনি এটি ডাটাবেস বা এক্সএমএল ফাইলের মধ্যে রেখে দিতে পারেন - এটি NUnit এর বৈশিষ্ট্যের মতো সোজা নয়, তবে এটি কাজ করে।


7

MSTest একটি শক্তিশালী বৈশিষ্ট্য বলা ডেটাউত্স । এটি ব্যবহার করে আপনি যেমনটি জিজ্ঞাসা করেছিলেন তেমন ডেটা-চালিত পরীক্ষাগুলি করতে পারেন। এক্সএমএল, সিএসভি বা একটি ডাটাবেসে আপনার পরীক্ষার ডেটা থাকতে পারে। এখানে কয়েকটি লিঙ্ক রয়েছে যা আপনাকে গাইড করবে


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সম্পত্তিটিতে অ্যাক্সেসকে সহজ করার জন্য আমি কয়েকটি এক্সটেনশন পদ্ধতি প্রস্তুত করেছি এবং আমাদের বেশ কয়েকটি পরীক্ষার কেস রয়েছে like সাধারণ পরীক্ষার বৈশিষ্ট্যগুলি এখানে প্রক্রিয়াকরণের সাথে উদাহরণ দেখুন:

[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

আপনি টেস্টপ্রোপার্টি মান হিসাবে আরও জটিল কিছু ব্যবহার করতে পারেন (উদাহরণস্বরূপ "0-100"), পার্স এবং এটি পরীক্ষার শিরোনামে পরিচালনা করতে পারেন।
আন্দ্রে বুরিকিন

4

এটি করার আরও একটি উপায় অবশ্যই আছে যা এই থ্রেডে আলোচনা করা হয়নি, অর্থাৎ টেস্টমেথোদযুক্ত শ্রেণীর উত্তরাধিকারের মাধ্যমে। নিম্নলিখিত উদাহরণে, শুধুমাত্র একটি টেস্টমেথোদ সংজ্ঞায়িত করা হয়েছে তবে দুটি পরীক্ষার মামলা করা হয়েছে।

ভিজ্যুয়াল স্টুডিও ২০১২-তে, এটি টেস্টএক্সপ্লোরারে দুটি পরীক্ষা তৈরি করে:

  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 সেই বৈশিষ্ট্যটিকে সমর্থন করে না, তবে এটি অর্জনের জন্য আপনি নিজের বৈশিষ্ট্যটি প্রয়োগ করতে পারেন।

কটাক্ষপাত আছে MSTest মধ্যে স্থিতিমাপ পরীক্ষা সক্ষম করা হলে তা PostSharp ব্যবহার


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

এখানে আসল সমাধানটি কেবল নুনিট ব্যবহার করা (আপনি যদি এমএসটিস্টে আটকে না থাকেন তবে আমি যেমন এই বিশেষ উদাহরণে আছি)।


3
আপনার সময় সাশ্রয়ের জন্য আপনার প্রতিটি পরীক্ষার কলকে একটি পৃথক পরীক্ষায় বিভক্ত করা উচিত them (যা আমরা সবাই জানি) ঘটবে
রূপালী

হ্যা অবশ্যই. বাস্তবে এটি করা হবে কিভাবে। এই ক্ষেত্রে আমি কেবল এটি সরলতার জন্য চিত্রিত করছিলাম
ব্র্যান্ডন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.