xUnit.net: গ্লোবাল সেটআপ + টিয়ারডাউন?


102

এই প্রশ্নটি ইউনিট টেস্টিং ফ্রেমওয়ার্ক xUnit.net সম্পর্কে ।

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

বিকল্পভাবে, যদি আমি প্রোগ্রামটিমে xUnit প্রার্থনা করি তবে আমি নিম্নলিখিত কোডটি দিয়ে যা চাই তা অর্জন করতে পারি:

static void Main()
{
    try
    {
        MyGlobalSetup();
        RunAllTests();  // What goes into this method?
    }
    finally
    {
        MyGlobalTeardown();
    }
}

কীভাবে আমাকে কীভাবে ঘোষণামূলকভাবে বা প্রোগ্রামগতভাবে কিছু গ্লোবাল সেটআপ / টিয়ারডাউন কোড চালানো যায় সে সম্পর্কে একটি ইঙ্গিত সরবরাহ করতে পারেন?


4
আমি এখানে অনুমান এর জবাব হচ্ছে, stackoverflow.com/questions/12379949/...
the_joric

উত্তর:


122

যতদূর আমি জানি, xUnit এর বৈশ্বিক সূচনা / টিয়ারডাউন এক্সটেনশন পয়েন্ট নেই। তবে এটি তৈরি করা সহজ। কেবলমাত্র একটি বেস পরীক্ষার শ্রেণি তৈরি করুন যা IDisposableনির্ধারকটিতে এবং আপনার IDisposable.Disposeপদ্ধতিতে পদ্ধতিতে আপনার টিয়ারডাউন প্রয়োগ করে এবং আপনার সূচনা করে do এটি দেখতে এটির মতো হবে:

public abstract class TestsBase : IDisposable
{
    protected TestsBase()
    {
        // Do "global" initialization here; Called before every test method.
    }

    public void Dispose()
    {
        // Do "global" teardown here; Called after every test method.
    }
}

public class DummyTests : TestsBase
{
    // Add test methods
}

তবে প্রতিটি কলের জন্য বেস ক্লাস সেটআপ এবং টিয়ারডাউন কোড কার্যকর করা হবে। এটি আপনি যা চান তা নাও হতে পারে, কারণ এটি খুব দক্ষ নয়। IClassFixture<T>বিশ্বব্যাপী সূচনা / টিয়ারডাউন কার্যকারিতা কেবল একবারেই ডাকা হবে তা নিশ্চিত করার জন্য আরও অনুকূলিত সংস্করণ ইন্টারফেসটি ব্যবহার করবে । এই সংস্করণের জন্য, আপনি আপনার পরীক্ষার শ্রেণি থেকে একটি বেস শ্রেণি প্রসারিত করবেন না তবে এমন IClassFixture<T>ইন্টারফেস প্রয়োগ করবেন যেখানে Tআপনার ফিক্সারের শ্রেণি বোঝায়:

using Xunit;

public class TestsFixture : IDisposable
{
    public TestsFixture ()
    {
        // Do "global" initialization here; Only called once.
    }

    public void Dispose()
    {
        // Do "global" teardown here; Only called once.
    }
}

public class DummyTests : IClassFixture<TestsFixture>
{
    public DummyTests(TestsFixture data)
    {
    }
}

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


4
দেখে মনে হচ্ছে আইসি ক্লাস ফিকচার দ্বারা প্রতিস্থাপিত হয়ে IUseFixture আর বিদ্যমান নেই।
গাটেক থমাস

9
এটি যখন কাজ করে, আমি মনে করি গির স্যাগবার্গের উত্তরে কালেকশন ফিকচারটি এই দৃশ্যের জন্য এটি আরও ভাল উপযুক্ত কারণ এটি বিশেষভাবে এই উদ্দেশ্যে তৈরি করা হয়েছিল। আপনার পরীক্ষার ক্লাসগুলিও উত্তরাধিকারী হতে হবে না, আপনি কেবল তাদের [Collection("<name>")]এট্রিবিউট দিয়ে চিহ্নিত করুন
মিশেলজেড

9
অ্যাসিঙ্ক সেটআপ এবং টিয়ারডাউন করার কোনও উপায় আছে কি?
Andrii

দেখে মনে হচ্ছে এম এস আইসি-ক্লাস ফিকচার সমাধানটিও কার্যকর করে দিয়েছে। ডকস.মাইক্রোসফট.ইন- ইউএস
কোর্টেস্ট /

4
এক্সউনিট তিনটি সূচনা বিকল্প দেয়: প্রতি পরীক্ষার পদ্ধতিতে, প্রতি পরীক্ষার ক্লাসে এবং বিভিন্ন পরীক্ষার ক্লাস বিস্তৃত। ডকুমেন্টেশন এখানে: xunit.net/docs/shared-context
GHN

50

আমি একই উত্তরটির সন্ধান করছিলাম এবং এই সময়ে xUnit ডকুমেন্টেশন ক্লাস ফিক্সার এবং কালেকশন ফিক্সারগুলি কীভাবে প্রয়োগ করতে পারে সে সম্পর্কে শ্রোতাগুলিতে খুব সহায়ক, যা বিকাশকারীদের ক্লাস বা শ্রেণীর স্তরের গ্রুপে সেটআপ / টিয়ারডাউন কার্যকারিতা বিস্তৃত করে। এটি গির স্যাগবার্গের উত্তরের সাথে সামঞ্জস্যপূর্ণ এবং এটি কাকে দেখতে ভাল হবে তা বোঝাতে ভাল কঙ্কালের বাস্তবায়ন দেয়।

https://xunit.github.io/docs/shared-context.html

সংগ্রহের ফিক্সচার কখন ব্যবহার করবেন: আপনি যখন একক পরীক্ষার প্রসঙ্গ তৈরি করতে চান এবং বেশ কয়েকটি পরীক্ষার ক্লাসে পরীক্ষার মধ্যে ভাগ করে নিতে চান এবং পরীক্ষার ক্লাসগুলির সমস্ত পরীক্ষা শেষ হওয়ার পরে এটি পরিষ্কার হয়ে যান।

কখনও কখনও আপনি একাধিক পরীক্ষার ক্লাসগুলির মধ্যে ফিক্সচার অবজেক্টটি ভাগ করতে চান। ক্লাস ফিক্সচারগুলির জন্য ব্যবহৃত ডাটাবেস উদাহরণটি একটি দুর্দান্ত উদাহরণ: আপনি পরীক্ষার ডেটার একটি সেট সহ একটি ডাটাবেস সূচনা করতে চাইতে পারেন এবং তারপরে সেই পরীক্ষার ডেটা একাধিক পরীক্ষার ক্লাস দ্বারা ব্যবহারের জন্য রেখে যেতে পারেন। আপনি বিভিন্ন পরীক্ষার ক্লাসে পরীক্ষার মধ্যে একটি একক বস্তু ভাগ করে নিতে xUnit.net এর সংগ্রহ ফিক্সচার বৈশিষ্ট্যটি ব্যবহার করতে পারেন।

সংগ্রহের ফিক্সচারগুলি ব্যবহার করতে, আপনাকে নিম্নলিখিত পদক্ষেপগুলি গ্রহণ করতে হবে:

ফিক্সচার ক্লাস তৈরি করুন এবং ফিক্সচার ক্লাস কনস্ট্রাক্টরের স্টার্টআপ কোডটি দিন। যদি ফিক্সচার ক্লাসটি ক্লিনআপ করার প্রয়োজন হয় তবে ফিক্সচার ক্লাসে আইডিস্পোজেবল বাস্তবায়ন করুন এবং ক্লিনআপ কোডটি ডিসপোজ () পদ্ধতিতে রেখে দিন। সংগ্রহ সংজ্ঞা ক্লাস তৈরি করুন, এটি [কালেকশন ডেফিনিশন] অ্যাট্রিবিউট দিয়ে সজ্জিত করুন, এটি একটি অনন্য নাম দিয়ে যা পরীক্ষার সংগ্রহটি সনাক্ত করবে। সংগ্রহ সংজ্ঞা শ্রেণিতে আইকোলিকেশনফাইচার <> যুক্ত করুন। পরীক্ষার সংজ্ঞা বিভাগের [কালেকশন ডেফিনিশন] বৈশিষ্ট্যটিতে আপনি সরবরাহ করেছেন এমন অনন্য নাম ব্যবহার করে, সমস্ত পরীক্ষার শ্রেণিতে [সংগ্রহ] বৈশিষ্ট্য যুক্ত করুন যা সংগ্রহের অংশ হবে। যদি পরীক্ষার ক্লাসগুলিতে ফিক্সচারের দৃষ্টান্ত অ্যাক্সেসের প্রয়োজন হয় তবে এটি নির্মাণকারী যুক্তি হিসাবে যুক্ত করুন এবং এটি স্বয়ংক্রিয়ভাবে সরবরাহ করা হবে। এখানে একটি সহজ উদাহরণ:

public class DatabaseFixture : IDisposable
{
    public DatabaseFixture()
    {
        Db = new SqlConnection("MyConnectionString");

        // ... initialize data in the test database ...
    }

    public void Dispose()
    {
        // ... clean up test data from the database ...
    }

    public SqlConnection Db { get; private set; }
}

[CollectionDefinition("Database collection")]
public class DatabaseCollection : ICollectionFixture<DatabaseFixture>
{
    // This class has no code, and is never created. Its purpose is simply
    // to be the place to apply [CollectionDefinition] and all the
    // ICollectionFixture<> interfaces.
}

[Collection("Database collection")]
public class DatabaseTestClass1
{
    DatabaseFixture fixture;

    public DatabaseTestClass1(DatabaseFixture fixture)
    {
        this.fixture = fixture;
    }
}

[Collection("Database collection")]
public class DatabaseTestClass2
{
    // ...
}

xUnit.net সংগ্রহের ফিক্সারগুলিকে ক্লাস ফিক্সারের মতোই আচরণ করে, ব্যতীত সংগ্রহের স্থির বস্তুটির আয়ু দীর্ঘায়িত: সংগ্রহের কোনও পরীক্ষার ক্লাসে কোনও পরীক্ষা চালানোর আগে এটি তৈরি করা হয়েছিল, এবং পরিষ্কার করা হবে না it সংগ্রহের সমস্ত পরীক্ষার ক্লাস চলমান শেষ না হওয়া পর্যন্ত।

পরীক্ষার সংগ্রহগুলি আইক্লাস ফিকচার <> দিয়েও সজ্জিত করা যায়। xUnit.net এটি পরীক্ষা করে যেমন পরীক্ষার প্রতিটি স্বতন্ত্র পরীক্ষার ক্লাস ক্লাস ফিক্সের সাথে সজ্জিত থাকে।

পরীক্ষার সংগ্রহগুলি xUnit.net সমান্তরালভাবে চালানোর সময় পরীক্ষা চালানোর পথেও প্রভাব ফেলে influence আরও তথ্যের জন্য, সমান্তরালে চলমান টেস্টগুলি দেখুন।

গুরুত্বপূর্ণ দ্রষ্টব্য: ফিক্সচারগুলি অবশ্যই পরীক্ষার মতো একই সমাবেশে থাকতে হবে।


4
"পরীক্ষার সংগ্রহগুলি আইক্লাস ফিকচার <> দিয়েও সজ্জিত করা যায়। xUnit.net এটিকে এমন আচরণ করে যেহেতু পরীক্ষার সংগ্রহের প্রতিটি স্বতন্ত্র পরীক্ষার শ্রেণি ক্লাস ফিক্সচারের সাথে সজ্জিত ছিল।" কোন সুযোগ আমি কি এর উদাহরণ পেতে পারি? আমি এটি বেশ বুঝতে পারি না।
rtf

@ ট্যানারফ্যালকনার ক্লাস ফিক্সচারটি একটি ক্লাস লেভেল সেটআপ এবং টিয়ারডাউন করার মতো একটি উপায় ছিল, যেমন আপনি যখন কোনও পরীক্ষা শুরু করার পদ্ধতিটি করেন তখন একটি traditionalতিহ্যবাহী। নেট ইউনিট টেস্ট প্রকল্পের সাথে পান: [টেস্টআইনিটাইজাইজ] পাবলিক শূন্য সূচনা () Lar
ল্যারি স্মিথ

এটির সাথে আমার একমাত্র সমস্যাটি হ'ল Collection"গ্লোবাল" সেটআপটি ঘটতে পারে তার জন্য আপনাকে বিশিষ্টতা সহ আপনার পরীক্ষা ক্লাসগুলি সজ্জিত করতে হবে। তার অর্থ, পরীক্ষা-চালুর আগে আপনার কিছু সেটআপ করা দরকার থাকলে, আপনাকে এই বৈশিষ্ট্য সহ সমস্ত-পরীক্ষা ক্লাসগুলি সাজাইয়া রাখা প্রয়োজন। এটি আমার মতে খুব ভঙ্গুর, কারণ একক পরীক্ষার শ্রেণি সাজাতে ভুলে যাওয়া ত্রুটিগুলি হতে পারে যা ট্র্যাক করা কঠিন। XUnit সত্যিকারের বিশ্বব্যাপী সেটআপ এবং টিয়ারডাউন করার উপায় তৈরি করা ভাল লাগবে।
জোডম্যান

13

একটি সহজ সহজ সমাধান আছে। Fody.ModuleInit প্লাগইন ব্যবহার করুন

https://github.com/Fody/ModuleInit

এটি একটি ন্যুগেট প্যাকেজ এবং এটি ইনস্টল ModuleInitializer.csকরার পরে এটি প্রজেক্টে নতুন একটি ফাইল যুক্ত হয় । এখানে একটি স্থিতিশীল পদ্ধতি রয়েছে যা বিল্ডিংয়ের পরে অ্যাসেমব্লিতে তাঁত হয়ে যায় এবং সমাবেশটি লোড হওয়ার সাথে সাথে এবং কোনও কিছু চালানোর আগে চালানো হয় run

আমি এটি কিনেছি এমন একটি লাইব্রেরিতে সফ্টওয়্যার লাইসেন্স আনলক করতে আমি এটি ব্যবহার করি। আমি সর্বদা প্রতিটি পরীক্ষায় লাইসেন্স আনলক করতে ভুলে যাচ্ছিলাম এবং এমন কোনও বেস ক্লাস থেকে এটি পরীক্ষা করা ভুলে যাচ্ছিল যা এটি আনলক করবে। উজ্জ্বল স্ফুলিঙ্গগুলি যা এই লাইব্রেরিটি লিখেছিল তা পরিবর্তে আপনাকে বলার অপেক্ষা রাখে যে এটি লাইসেন্স লক ছিল সূক্ষ্ম সংখ্যাসূচক ত্রুটি যার ফলে পরীক্ষাগুলি ব্যর্থ হয় বা পাস না হলে পাস করে। আপনি কখনই জানতে পারবেন না আপনি লাইব্রেরিটি সঠিকভাবে আনলক করেছেন কিনা। সুতরাং এখন আমার মডিউল থিম দেখতে

/// <summary>
/// Used by the ModuleInit. All code inside the Initialize method is ran as soon as the assembly is loaded.
/// </summary>
public static class ModuleInitializer
{
    /// <summary>
    /// Initializes the module.
    /// </summary>
    public static void Initialize()
    {
            SomeLibrary.LicenceUtility.Unlock("XXXX-XXXX-XXXX-XXXX-XXXX");
    }
}

এবং এই সমাবেশে স্থাপন করা সমস্ত পরীক্ষাগুলিতে তাদের জন্য লাইসেন্সটি সঠিকভাবে আনলক করা থাকবে।


4
সলিড আইডিয়া; দুর্ভাগ্যক্রমে এটি ডিএনএক্স ইউনিট পরীক্ষাগুলির সাথে এখনও কাজ করে বলে মনে হচ্ছে না।
জেফ ডানলপ

12

একাধিক ক্লাসের মধ্যে সেটআপ / টিয়ারডাউন-কোড ভাগ করতে আপনি xUnit এর কালেকশন ফিচার ব্যবহার করতে পারেন ।

উদ্ধৃতি:

সংগ্রহের ফিক্সচারগুলি ব্যবহার করতে, আপনাকে নিম্নলিখিত পদক্ষেপগুলি গ্রহণ করতে হবে:

  • ফিক্সচার ক্লাস তৈরি করুন এবং ফিক্সচার ক্লাস কনস্ট্রাক্টরের স্টার্টআপ কোডটি দিন।
  • যদি ফিক্সচার ক্লাসটি ক্লিনআপ করার প্রয়োজন হয় তবে ফিক্সচার ক্লাসে আইডিস্পোজেবল বাস্তবায়ন করুন এবং ক্লিনআপ কোডটি ডিসপোজ () পদ্ধতিতে রেখে দিন।
  • সংগ্রহ সংজ্ঞা ক্লাস তৈরি করুন, এটি [কালেকশন ডেফিনিশন] অ্যাট্রিবিউট দিয়ে সজ্জিত করুন, এটি একটি অনন্য নাম দিয়ে যা পরীক্ষার সংগ্রহটি সনাক্ত করবে।
  • সংগ্রহ সংজ্ঞা শ্রেণিতে আইকোলিকেশনফাইচার <> যুক্ত করুন।
  • পরীক্ষার সংজ্ঞা বিভাগের [কালেকশন ডেফিনিশন] বৈশিষ্ট্যটিতে আপনি সরবরাহ করেছেন এমন অনন্য নাম ব্যবহার করে, সমস্ত পরীক্ষার শ্রেণিতে [সংগ্রহ] বৈশিষ্ট্য যুক্ত করুন যা সংগ্রহের অংশ হবে।
  • যদি পরীক্ষার ক্লাসগুলিতে ফিক্সচারের দৃষ্টান্ত অ্যাক্সেসের প্রয়োজন হয় তবে এটি নির্মাণকারী যুক্তি হিসাবে যুক্ত করুন এবং এটি স্বয়ংক্রিয়ভাবে সরবরাহ করা হবে।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.