XUnit.net তে NUnit এর অনুরূপ প্যারামিটারাইজেশন পরীক্ষা করুন


106

XUnit.net ফ্রেমওয়ার্কে NUnit এর নিম্নলিখিত বৈশিষ্ট্যগুলির অনুরূপ কোনও উপায় আছে?

[Test, TestCaseSource("CurrencySamples")]
public void Format_Currency(decimal value, string expected){}

static object[][] CurrencySamples = new object[][]
{
    new object[]{ 0m, "0,00"},
    new object[]{ 0.0004m, "0,00"},
    new object[]{ 5m, "5,00"},
    new object[]{ 5.1m, "5,10"},
    new object[]{ 5.12m, "5,12"},
    new object[]{ 5.1234m, "5,12"},
    new object[]{ 5.1250m, "5,13"}, // round
    new object[]{ 5.1299m, "5,13"}, // round
}

এটি নুনিট জিইআইতে 8 টি পৃথক পরীক্ষা উত্পন্ন করবে

[TestCase((string)null, Result = "1")]
[TestCase("", Result = "1")]
[TestCase(" ", Result = "1")]
[TestCase("1", Result = "2")]
[TestCase(" 1 ", Result = "2")]
public string IncrementDocNumber(string lastNum) { return "some"; }

এটি 5 টি পৃথক পরীক্ষা উত্পন্ন করবে এবং স্বয়ংক্রিয়ভাবে ফলাফলের তুলনা করবে ( Assert.Equal())।

[Test]
public void StateTest(
    [Values(1, 10)]
    int input,
    [Values(State.Initial, State.Rejected, State.Stopped)]
    DocumentType docType
){}

এটি 6 টি সংযুক্ত পরীক্ষা তৈরি করবে। অমূল্য.

কয়েক বছর আগে আমি xUnit চেষ্টা করেছি এবং এটি পছন্দ করেছি তবে এতে এই বৈশিষ্ট্যের অভাব রয়েছে। তাদের ছাড়া বাঁচতে পারি না। কিছু পরিবর্তন হয়েছে?


উত্তর:


138

xUnit ডেটা থিওরি বলে পরিচিত কিছু মাধ্যমে প্যারামিটারাইজড পরীক্ষা চালানোর জন্য একটি উপায় সরবরাহ করে । ধারণাটি ইউনাইটে পাওয়া একটির সমতুল্য তবে আপনি বাক্স থেকে বেরিয়ে আসা কার্যকারিতাটি সম্পূর্ণ নয়।

এখানে একটি উদাহরণ:

[Theory]
[InlineData("Foo")]
[InlineData(9)]
[InlineData(true)]
public void Should_be_assigned_different_values(object value)
{
    Assert.NotNull(value);
}

এই উদাহরণে xUnit Should_format_the_currency_value_correctlyপ্রত্যেকবার একবার InlineDataAttributeআর্গুমেন্ট হিসাবে নির্দিষ্ট মানটি পাস করার জন্য পরীক্ষা চালাবে ।

ডেটা থিওরিগুলি একটি এক্সটেনসিবিলিটি পয়েন্ট যা আপনি নিজের প্যারামিটারাইজড পরীক্ষাগুলি চালানোর জন্য নতুন উপায় তৈরি করতে ব্যবহার করতে পারেন। যেভাবে এটি করা হয় তা হল নতুন বৈশিষ্ট্য তৈরি করা যা পরীক্ষার পদ্ধতির আর্গুমেন্ট এবং রিটার্ন মানটি পরীক্ষা করে এবং allyচ্ছিকভাবে কাজ করে।

কীভাবে xUnit ডেটা তত্ত্ব বাড়ানো যেতে পারে একটি ভাল ব্যবহারিক উদাহরণ জানতে পারেন AutoFixture এর AutoData এবং InlineAutoData তত্ত্ব।


3
স্পষ্টতই, এটি দশমিক আক্ষরিক বৈশিষ্ট্য প্যারামিটার হিসাবে ব্যবহার করার অনুমতি নেই
সের্গেইই ভলচকভ

1
আপনার লিংকটি খুঁজে পাওয়া যায়নি। পরিবর্তে এখানে যান: blog.benhall.me.uk/2008/01/intrration-to-xunit-net- এক্সটেনশনগুলি
রনি ওভারবি

9
আপনার xUnit.net লাগবে: এক্সটেনশনগুলি ( নিউগেট প্যাকেজ) অথবা অন্যথায় [Theory]বৈশিষ্ট্যটি উপলভ্য নয়।
ড্যানিয়েল এএ পেলসমেকার

4
সর্বাধিক প্রস্তাবিত। নেট ইউনিট পরীক্ষার কাঠামোর কিছু ডকুমেন্টেশন থাকলে এটি দুর্দান্ত হবে ..
আইজাক ক্লিনম্যান

6
গুগল বলেছে যে আপনার উত্তরগুলি xUnit ডকুমেন্টেশন।
নাথানচেড়ে

55

আমাকে আরও একটি নমুনা এখানে ফেলে দেওয়া যাক, যদি কারওর জন্য কিছুটা সময় সাশ্রয় হয়।

[Theory]
[InlineData("goodnight moon", "moon", true)]
[InlineData("hello world", "hi", false)]
public void Contains(string input, string sub, bool expected)
{
    var actual = input.Contains(sub);
    Assert.Equal(expected, actual);
}

আপনি কি দ্বিতীয় লাইনের একটি বন্ধনী বন্ধনীটি ভুলে গেছেন?
cs0815

দরকারী, ধন্যবাদ :)
জেক 2

21

আপনার প্রথম অনুরোধে, আপনি এখানে পাওয়া উদাহরণগুলি অনুসরণ করতে পারেন ।

আপনি পরীক্ষার সংগ্রহের জন্য প্রয়োজনীয় ডেটা সম্বলিত একটি স্ট্যাটিক ক্লাস তৈরি করতে পারেন

using System.Collections.Generic;

namespace PropertyDataDrivenTests
{
    public static class DemoPropertyDataSource
    {
        private static readonly List<object[]> _data = new List<object[]>
            {
                new object[] {1, true},
                new object[] {2, false},
                new object[] {-1, false},
                new object[] {0, false}
            };

        public static IEnumerable<object[]> TestData
        {
            get { return _data; }
        }
    }
}

তারপরে মেম্বারডাটা অ্যাট্রিবিউটটি ব্যবহার করে পরীক্ষাকে এরূপ হিসাবে সংজ্ঞায়িত করুন

public class TestFile1
{
    [Theory]
    [MemberData("TestData", MemberType = typeof(DemoPropertyDataSource))]
    public void SampleTest1(int number, bool expectedResult)
    {
        var sut = new CheckThisNumber(1);
        var result = sut.CheckIfEqual(number);
        Assert.Equal(result, expectedResult);
    }
}

অথবা আপনি যদি সি # 6.0 ব্যবহার করছেন,

[Theory]
[MemberData(nameof(PropertyDataDrivenTests.TestData), MemberType = typeof(DemoPropertyDataSource))]

সদস্যডাটা অ্যাট্রিবিউটের প্রথম যুক্তি আপনাকে ডেটাসোর্স হিসাবে যে সদস্যটি ব্যবহার করছেন তা সংজ্ঞায়িত করতে দেয়, সুতরাং আপনার পুনরায় ব্যবহারের ক্ষেত্রে যথেষ্ট পরিমাণে নমনীয়তা রয়েছে।


13

XUnit এই নিবন্ধ অনুযায়ী আপনার কাছে তিনটি "প্যারামেট্রাইজেশন" বিকল্প রয়েছে:

  1. InlineData
  2. ClassData
  3. MemberData

ইনলাইনডাটা উদাহরণ

[Theory]
[InlineData(1, 2)]
[InlineData(-4, -6)]
[InlineData(2, 4)]
public void FooTest(int value1, int value2)
{
    Assert.True(value1 + value2 < 7)
}

ক্লাসডাটা উদাহরণ

public class BarTestData : IEnumerable<object[]>
{
    public IEnumerator<object[]> GetEnumerator()
    {
        yield return new object[] { 1, 2 };
        yield return new object[] { -4, -6 };
        yield return new object[] { 2, 4 };
    }

    IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}


[Theory]
[ClassData(typeof(BarTestData))]
public void BarTest(int value1, int value2)
{
    Assert.True(value1 + value2 < 7)
}

সদস্যদাতার উদাহরণ

[Theory]
[MemberData(nameof(BazTestData))]
public void BazTest(int value1, int value2)
{
    Assert.True(value1 + value2 < 7)
}

public static IEnumerable<object[]> BazTestData => new List<object[]>
    {
        new object[] { 1, 2 },
        new object[] { -4, -6 },
        new object[] { 2, 4 },
    };

12

আমি এমন একটি লাইব্রেরি পেয়েছি [Values]যা নুনিটের কুনুনিটর নামক বৈশিষ্ট্যের সাথে সমতুল্য কার্যকারিতা তৈরি করে :

এটি আপনাকে প্যারামিটার-স্তরের মান নির্দিষ্ট করতে দেয়:

[Theory, CombinatorialData]
public void CheckValidAge([CombinatorialValues(5, 18, 21, 25)] int age, 
    bool friendlyOfficer)
{
    // This will run with all combinations:
    // 5  true
    // 18 true
    // 21 true
    // 25 true
    // 5  false
    // 18 false
    // 21 false
    // 25 false
}

অথবা আপনি স্পষ্টতই এটিতে সমস্ত সম্ভাব্য সংমিশ্রণগুলি কভার করার জন্য ন্যূনতম সংখ্যার অনুরোধ করতে পারেন:

[Theory, PairwiseData]
public void CheckValidAge(bool p1, bool p2, bool p3)
{
    // Pairwise generates these 4 test cases:
    // false false false
    // false true  true
    // true  false true
    // true  true  false
}

6

আমি এখানে সমস্ত উত্তর নিয়েছি এবং অতিরিক্ত হিসাবে XUnit এর TheoryData<,>জেনেরিক প্রকারগুলি ব্যবহার করে আমার পরীক্ষায় 'মেম্বারডাটা' বৈশিষ্ট্যের জন্য সুরক্ষিত ডেটা সংজ্ঞাগুলি টাইপ করতে সহজ, সহজেই পড়তে এবং টাইপ করতে পারি: উদাহরণ হিসাবে:

/// must be public & static for MemberDataAttr to use
public static TheoryData<int, bool, string> DataForTest1 = new TheoryData<int, bool, string> {
    { 1, true, "First" },
    { 2, false, "Second" },
    { 3, true, "Third" }
};

[Theory(DisplayName = "My First Test"), MemberData(nameof(DataForTest1))]
public void Test1(int valA, bool valB, string valC)
{
    Debug.WriteLine($"Running {nameof(Test1)} with values: {valA}, {valB} & {valC} ");
}

'আমার প্রথম টেস্ট' পরীক্ষার জন্য এক্সপ্লোরার থেকে তিনটি টেস্ট পালিত হয়েছে


এনট কোর জন্য এনবি VS2017 (15.3.3), সি # 7, এবং এক্স ইউনাইট 2.2.0 ব্যবহার করছে


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