ইউনাইট টেস্ট রান অর্ডার


110

ডিফল্টভাবে নুনিট পরীক্ষাগুলি বর্ণানুক্রমিকভাবে চালিত হয়। ফাঁসির আদেশটি সেট করার কোনও উপায় কি কেউ জানেন? এর জন্য কোনও অ্যাট্রিবিউট কি বিদ্যমান?


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

এটি একটি সদৃশ মনে হচ্ছে তবে আপনি এখানে
জননো নোলান

12
@ রিচার্ডড - উচিত! = অবশ্যই এবং এটি সত্যিই হওয়া উচিত এমন ঘটনা নয়, কারণ প্রায় সমস্ত ইন্টিগ্রেশন টেস্টগুলি যথাযথভাবে পরিচালিত হয় - QA দলকে জিজ্ঞাসা করুন যদি তারা তাদের পরীক্ষার ক্রমটি এলোমেলো করে।
tymtam

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

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

উত্তর:


51

আপনার ইউনিট পরীক্ষা প্রতিটি স্বতন্ত্রভাবে চালানো এবং একা দাঁড়িয়ে থাকতে হবে। তারা যদি এই মানদণ্ডকে সন্তুষ্ট করে তবে অর্ডারটি কোনও বিষয় নয়।

এমন কিছু অনুষ্ঠান রয়েছে যেখানে আপনি প্রথমে কিছু নির্দিষ্ট পরীক্ষা চালাতে চাইবেন। একটি সাধারণ উদাহরণ ক্রমাগত সংহতকরণ পরিস্থিতিতে যেখানে কিছু পরীক্ষা অন্যদের চেয়ে দীর্ঘায়িত হয়। আমরা বিভাগের বৈশিষ্ট্যটি ব্যবহার করি যাতে আমরা পরীক্ষাগুলি চালাতে পারি যা পরীক্ষাগুলি ব্যবহার করে যেগুলি পরীক্ষা করে সামনে উপহাস করে।

যেমন আপনার দ্রুত পরীক্ষার শুরুতে এটি রাখুন

[Category("QuickTests")]

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


2
@ ক্রিস, আমি এই বৈশিষ্ট্যগুলি ব্যবহার করতে চাই না, এটি একটি আকর্ষণীয় ব্লগ পোস্ট- jamesnewkirk.typepad.com/posts/2007/09/why-you-should-.html । বিভাগ পরীক্ষা সম্পর্কে ভাল পয়েন্ট যদিও।
রিচার্ডড

29
অর্ডার নির্ভর পরীক্ষার আরেকটি উদাহরণ হ'ল আপনি যখন কোনও ইন্টিগ্রেশন টেস্ট চালানোর জন্য আপনার নুনিট ফ্রেমওয়ার্কটি ব্যবহার করতে চান ...
বায়রন রস

1
@ বায়রনরোস: আমি যখন পরীক্ষাগুলি করি তখন পরীক্ষাগুলি বড় করার প্রবণতা রাখি এবং বিদ্যমান ইউনিট পরীক্ষাগুলিতে যতটা সম্ভব ঝুঁকির ফলে আমি আরও কম পরীক্ষা লিখতে পারি। তারপরে প্রতিটি পূর্ণ রান আলাদাভাবে ব্যর্থ হতে পারে। আমি আমার ডেটাও ডিজাইনের চেষ্টা করি যাতে এটি বিদ্যমান উপাত্তের উপর নির্ভর করে বরং বিদ্যমান ডেটা থেকে পৃথকভাবে বেঁচে থাকতে পারে ।
মের্লিন মরগান-গ্রাহাম

1
আপনি যদি এলোমেলো ক্রমে আপনার পরীক্ষাগুলি চালনা না করেন তবে আপনি কীভাবে যাচাই করতে পারবেন যে অর্ডার শেষ হয়ে গেলে তারা বাস্তবে কাজ করে? আপনি যা বলছেন তা "যদি আপনার সফ্টওয়্যারটিতে কোনও বাগ থাকে না, তবে পরীক্ষাটি করা অযৌক্তিক হয়" বলার মতো।
jforberg

@ জফারবার্গ: যদি আপনার কোনও ব্যর্থতা হয় যা এলোমেলোভাবে ঘটে থাকে, আপনি যখন এটি স্থির করেছেন তখন কীভাবে বলবেন?
নিডহ্যাক

175

আমি কেবল এটিই উল্লেখ করতে চাই যে বেশিরভাগ প্রতিক্রিয়াকারীরা এগুলি ইউনিট পরীক্ষা বলে ধরেছিলেন, প্রশ্নটি তারা নির্দিষ্ট ছিল না।

nUnit একটি দুর্দান্ত সরঞ্জাম যা বিভিন্ন পরীক্ষার পরিস্থিতিতে ব্যবহার করা যেতে পারে। আমি পরীক্ষার ক্রম নিয়ন্ত্রণ করতে চাওয়ার উপযুক্ত কারণ দেখতে পাচ্ছি।

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


আপনি বোঝাতে চেয়েছেন আপনি উদাহরণস্বরূপ, আপনার পরীক্ষাগুলি ডেকেছেন 001_first_test 002_second_testএবং আরও কি?
ashes999

হ্যাঁ, এটা ঠিক, যদিও আমি সাধারণত এমন একটি প্যাটার্ন ব্যবহার করি যা আমাকে প্রয়োজনবোধে সহজেই পরীক্ষাগুলি সন্নিবেশ করতে দেয়, তাই সম্ভবত 010_ প্রথম_তম, 020_ সেকেন্ড_স্টেস্ট, ইত্যাদি
লেস

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

1
আপনার রান অর্ডার বর্ণমালার উপর নির্ভর করা উচিত নয় । অনেক পরীক্ষার দৌড়করা অনেকগুলি থ্রেড বা প্রক্রিয়াগুলিতে একই সাথে আপনার পরীক্ষাগুলি চালান এবং বর্ণমালার ক্রমে অগত্যা নয়। উদাহরণস্বরূপ, এনক্রাঞ্চ আপনি যে কোড পরিবর্তন করেছেন তার উপর ভিত্তি করে পরীক্ষাগুলিকে অগ্রাধিকার দেয় (প্রভাবিত পরীক্ষাগুলি), তবে শেষবার ব্যর্থ হয়েছে কিনা, তারপরে তারা দ্রুত বা ধীরে ধীরে চালিত হয় কিনা তা নিয়ে on আপনি যদি একটি সংজ্ঞায়িত আদেশ চান , কেবল সেই পরীক্ষাগুলির জন্য একটি মেটা-রানার তৈরি করুন এবং তাদের নিয়মিত রান থেকে বাদ দিন।
আবেল

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

125

নুনিট ৩.২.০ একটি যোগ করেছে OrderAttribute, দেখুন:

https://github.com/nunit/docs/wiki/Order-Attribute

উদাহরণ:

public class MyFixture
{
    [Test, Order(1)]
    public void TestA() { ... }


    [Test, Order(2)]
    public void TestB() { ... }

    [Test]
    public void TestC() { ... }
}

5
থানেক্স, ঠিক আমি যে
বিষয়টির

1
এবং তারপরে তারা এটিকে দশমিকের পরিবর্তে একটি পূর্ণসংখ্যা হিসাবে তৈরি করে, সুতরাং যদি কোনও পরীক্ষার প্রবেশদ্বার করতে হয় তবে সমস্ত পরীক্ষার পুনরায় সংখ্যা নির্ধারণ করতে হবে।
এপিটকা

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

9
উত্তম উত্তর, তবে হুঁশিয়ারি, ডকুমেন্টেশন অনুযায়ী পরীক্ষাগুলি পূর্বের পরীক্ষা শেষ হওয়ার জন্য অপেক্ষা করে না।
RoX

মজার বিষয় হল, আমার অভিজ্ঞতায়, আমরা যদি টেস্ট এবং অর্ডার বৈশিষ্ট্যগুলি পৃথকভাবে যুক্ত করি, তবে পরীক্ষার অর্ডারের কোনও গ্যারান্টি নেই।
যেমন AT

22

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


10

টেস্টগুলি অর্ডার নির্ভর কিনা তা নির্বিশেষে ... আমাদের মধ্যে কিছু কিছু সুশৃঙ্খলভাবে কেবল সবকিছু নিয়ন্ত্রণ করতে চায়।

ইউনিট পরীক্ষা সাধারণত জটিলতার ক্রমে তৈরি করা হয়। সুতরাং, কেন এগুলিও জটিলতার ক্রমে চালানো উচিত নয়, বা যে ক্রমে সেগুলি তৈরি করা হয়েছিল?

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

তবে, এগুলি এলোমেলো ক্রমে চালানোর সুবিধাটিও আমি দেখতে পাচ্ছি, বিশেষ করে যদি আপনি পরীক্ষা করতে চান যে আপনার পরীক্ষাগুলির অন্যান্য পরীক্ষার উপর কোনও নির্ভরতা নেই। "রান টেস্ট এলোমেলোভাবে থামানো পর্যন্ত" রানারদের পরীক্ষা করার বিকল্প বিকল্প সম্পর্কে কীভাবে?


9

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

সুতরাং, আমি সেগুলিকে যথাযথভাবে রেখেছি এবং পাঠ্য বাক্সগুলি এবং এরকম সম্পন্ন করার জন্য পূর্ববর্তী পরীক্ষার উপর নির্ভর করি। প্রাক-শর্তগুলি বৈধ না হলে আমি অ্যাসেটর ব্যবহার করুন gn (উপেক্ষা করুন) ব্যবহার করুন, তবে সেগুলি ক্রমক্রমে চালানো দরকার।


1
পুরোটাই। আমি এখানে একই নৌকায় আছি
স্লিপার স্মিথ

আমিও! ঠিক কেন আমি এই প্রশ্নে অবতরণ!
নিক্লাস ওল্ফ

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

ধন্যবাদ রাহুললোধা! আমি এটি খতিয়ে দেখব।
নিক্লাস ওল্ফ

9

আমি সত্যিই আগের উত্তর পছন্দ।

অর্ডার সীমাটি নির্ধারণ করতে কোনও অ্যাট্রিবিউট ব্যবহার করতে সক্ষম হতে আমি এটি সামান্য পরিবর্তন করেছি:

namespace SmiMobile.Web.Selenium.Tests
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Reflection;
    using NUnit.Framework;

    public class OrderedTestAttribute : Attribute
    {
        public int Order { get; set; }


        public OrderedTestAttribute(int order)
        {
            Order = order;
        }
    }

    public class TestStructure
    {
        public Action Test;
    }

    class Int
    {
        public int I;
    }

    [TestFixture]
    public class ControllingTestOrder
    {
        private static readonly Int MyInt = new Int();

        [TestFixtureSetUp]
        public void SetUp()
        {
            MyInt.I = 0;
        }

        [OrderedTest(0)]
        public void Test0()
        {
            Console.WriteLine("This is test zero");
            Assert.That(MyInt.I, Is.EqualTo(0));
        }

        [OrderedTest(2)]
        public void ATest0()
        {
            Console.WriteLine("This is test two");
            MyInt.I++; Assert.That(MyInt.I, Is.EqualTo(2));
        }


        [OrderedTest(1)]
        public void BTest0()
        {
            Console.WriteLine("This is test one");
            MyInt.I++; Assert.That(MyInt.I, Is.EqualTo(1));
        }

        [OrderedTest(3)]
        public void AAA()
        {
            Console.WriteLine("This is test three");
            MyInt.I++; Assert.That(MyInt.I, Is.EqualTo(3));
        }


        [TestCaseSource(sourceName: "TestSource")]
        public void MyTest(TestStructure test)
        {
            test.Test();
        }

        public IEnumerable<TestCaseData> TestSource
        {
            get
            {
                var assembly =Assembly.GetExecutingAssembly();
                Dictionary<int, List<MethodInfo>> methods = assembly
                    .GetTypes()
                    .SelectMany(x => x.GetMethods())
                    .Where(y => y.GetCustomAttributes().OfType<OrderedTestAttribute>().Any())
                    .GroupBy(z => z.GetCustomAttribute<OrderedTestAttribute>().Order)
                    .ToDictionary(gdc => gdc.Key, gdc => gdc.ToList());

                foreach (var order in methods.Keys.OrderBy(x => x))
                {
                    foreach (var methodInfo in methods[order])
                    {
                        MethodInfo info = methodInfo;
                        yield return new TestCaseData(
                            new TestStructure
                                {
                                    Test = () =>
                                        {
                                            object classInstance = Activator.CreateInstance(info.DeclaringType, null);
                                            info.Invoke(classInstance, null);
                                        }
                                }).SetName(methodInfo.Name);
                    }
                }

            }
        }
    }
}

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

OrderedTestNUnit 3 এ আর সমর্থিত নয়
কনরাড

7

আমি জানি এটি তুলনামূলকভাবে পুরাতন পোস্ট, তবে পরীক্ষার নামগুলি বিশ্রী না করেই আপনার পরীক্ষাটি নিয়মিত রাখার আরও একটি উপায়। টেস্টকেসোর্স অ্যাট্রিবিউটটি ব্যবহার করে এবং আপনি যে বস্তুটি পাস করেন তাতে একটি প্রতিনিধি (অ্যাকশন) থাকে, আপনি কেবলমাত্র অর্ডারটিকে নিয়ন্ত্রণ করতে পারবেন না তবে এটি পরীক্ষার নামও রাখতে পারেন।

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

আমি আগামীকাল দিচ্ছি একটি উপস্থাপনা থেকে একটি ডেমো এখানে:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NUnit.Framework;

namespace NUnitTest
{
    public class TestStructure
    {
        public Action Test;
    }

    class Int
    {
        public int I;
    }

    [TestFixture]
    public class ControllingTestOrder
    {
        private static readonly Int MyInt= new Int();

        [TestFixtureSetUp]
        public void SetUp()
        {
            MyInt.I = 0;
        }

        [TestCaseSource(sourceName: "TestSource")]
        public void MyTest(TestStructure test)
        {
            test.Test();
        }

        public IEnumerable<TestCaseData> TestSource
        {
            get
            {
                yield return new TestCaseData(
                    new TestStructure
                    {
                        Test = () =>
                        {
                            Console.WriteLine("This is test one");
                            MyInt.I++; Assert.That(MyInt.I, Is.EqualTo(1));
                        }
                    }).SetName(@"Test One");
                yield return new TestCaseData(
                    new TestStructure
                    {
                        Test = () =>
                        {
                            Console.WriteLine("This is test two");
                            MyInt.I++; Assert.That(MyInt.I, Is.EqualTo(2));
                        }
                    }).SetName(@"Test Two");
                yield return new TestCaseData(
                    new TestStructure
                    {
                        Test = () =>
                        {
                            Console.WriteLine("This is test three");
                            MyInt.I++; Assert.That(MyInt.I, Is.EqualTo(3));
                        }
                    }).SetName(@"Test Three");
            }
        }
    }
}

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

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

দুঃখের সাথে, NUnit 3 এর সাথে উত্সটি TestCaseSourceঅবশ্যই স্থির হতে হবে, যা প্যাটার্নটি ব্যবহার করে বিরত থাকে। হতাশাজনক।
কনরাড

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

এটি এমন পদ্ধতি নয় যা স্থির হওয়া দরকার - এর উত্স (পরিবর্তনশীল বা সম্পত্তি) TestCaseSourceঅবশ্যই NUnit 3 এ স্ট্যাটিক অবজেক্ট হতে হবে, বা পরীক্ষাগুলি কার্যকর হবে না ute এবং আপনি একটি স্ট্যাটিক অবজেক্টের মধ্যে ডায়নামিক অবজেক্ট তৈরি করতে পারবেন না। সে কারণেই এটি v। 3 তে কাজ করবে না
কনরাড

5

আমি সি # তে লিখিত সেলেনিয়াম ওয়েবড্রাইভার এন্ড-টু-এন্ড ইউআই টেস্ট কেসগুলির সাথে কাজ করছি যা NUnit ফ্রেমওয়ার্ক ব্যবহার করে চালিত হয়। (ইউনিট ক্ষেত্রে যেমন নয়)

এই ইউআই পরীক্ষাগুলি অবশ্যই মৃত্যুদন্ডের আদেশের উপর নির্ভর করে, কারণ অন্যান্য পরীক্ষার পূর্বশর্ত হিসাবে কিছু ডেটা যুক্ত করা দরকার। (প্রতিটি পরীক্ষায় পদক্ষেপগুলি করা সম্ভব হবে না)

এখন, দশম পরীক্ষার কেস যুক্ত করার পরে, আমি দেখতে পাচ্ছি নুনিত এই ক্রমে চালাতে চায়: টেস্ট_1 টেস্ট_০ টেস্ট_০ টেস্ট_২ টেস্ট_৪।

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


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

3

সাধারণত ইউনিট টেস্টটি স্বতন্ত্র হওয়া উচিত, তবে যদি আপনার অবশ্যই হয় তবে আপনি আপনার পদ্ধতিগুলি বর্ণানুক্রমিক ক্রমে নাম রাখতে পারেন যেমন:

[Test]
public void Add_Users(){}

[Test]
public void Add_UsersB(){}

[Test]
public void Process_Users(){}

বা আপনি করতে পারেন ..

        private void Add_Users(){}

        private void Add_UsersB(){}

        [Test]
        public void Process_Users()
        {
           Add_Users();
           Add_UsersB();
           // more code
        }

2
নাম বাদে অবশ্যই বর্ণমালার তৈরি করতে হবে, এটি একটি ভয়াবহ সমাধান। :(

@ ব্যবহারকারী 166390 - এটি ভয়াবহ নয়। এটি কাজ করে এবং NUnit এর নথিভুক্ত আচরণের উপর নির্ভর করে।
tymtam

For1 আমার পক্ষে যথেষ্ট ভাল, আপনি যদি এরপরে পরীক্ষা করে শুরু করেন a_ b_ t1_, এর t2_পরিবর্তে বা পিছনের চরিত্রগুলি মিস করার সহজ উপর নির্ভর করে থাকেন
ক্রিস মেরিসিক

3

টেস্ট অর্ডারিং প্রক্রিয়াটি ব্যবহার করার জন্য খুব ভাল কারণ রয়েছে। আমার নিজের পরীক্ষাগুলির বেশিরভাগই ভাল অভ্যাস যেমন সেটআপ / টিয়ারডাউন ব্যবহার করে। অন্যদের জন্য বিপুল পরিমাণে ডেটা সেটআপের প্রয়োজন হয়, যা এরপরে বিভিন্ন বৈশিষ্ট্য পরীক্ষা করতে ব্যবহার করা যেতে পারে। এখন অবধি, আমি এই (সেলেনিয়াম ওয়েবড্রাইভার) ইন্টিগ্রেশন টেস্টগুলি পরিচালনা করতে বড় পরীক্ষা ব্যবহার করেছি। তবে আমি মনে করি https://github.com/nunit/docs/wiki/Order- এ উপরের প্রস্তাবিত পোস্টটির অনেক যোগ্যতা রয়েছে। অর্ডার কেন অত্যন্ত মূল্যবান হতে পারে তার একটি উদাহরণ এখানে রয়েছে:

  • একটি রিপোর্ট ডাউনলোড করতে একটি পরীক্ষা চালানোর জন্য সেলেনিয়াম ওয়েবড্রাইভার ব্যবহার করছেন
  • প্রতিবেদনের রাজ্যটি (এটি ডাউনলোডযোগ্য এবং না হোক) 10 মিনিটের জন্য ক্যাশে করা হয়েছে
  • তার মানে, প্রতিটি পরীক্ষার আগে আমাকে রিপোর্টের অবস্থাটি পুনরায় সেট করতে হবে এবং তারপরে 10 মিনিট পর্যন্ত অপেক্ষা করতে হবে রাষ্ট্রটির পরিবর্তন হয়েছে কিনা তা নিশ্চিত হওয়ার আগে এবং তারপরে রিপোর্টটি ডাউনলোডগুলি সঠিকভাবে যাচাই করুন।
  • জটিলতার কারণে পরীক্ষার কাঠামোর মধ্যে বিদ্রূপ বা অন্য কোনও ব্যবস্থার মাধ্যমে রিপোর্টগুলি ব্যবহারিক / সময়োপযোগী ফ্যাশনে উত্পন্ন করা যায় না।

এই 10 মিনিটের অপেক্ষার সময়টি পরীক্ষার স্যুটটি ধীর করে দেয়। আপনি যখন বহু পরীক্ষার অনুরূপ ক্যাশে বিলম্বকে বহুগুণ করেন তখন এটি অনেক সময় ব্যয় করে। অর্ডারিং টেস্টগুলি টেস্ট স্যুটটির শুরুতে ডেটা সেটআপটিকে "টেস্ট" হিসাবে সম্পন্ন করার অনুমতি দিতে পারে, পরীক্ষাগুলি ক্যাশের উপর নির্ভর করে পরীক্ষা চালানোর শেষের দিকে চালানো হয়।


2

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

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


আমার যে সমস্যাটি রয়েছে সে সম্পর্কে আপনি কি আমাকে সহায়তা করতে পারেন, এখানে লিঙ্কটি দেওয়া হয়েছে: stackoverflow.com/questions/31281395/…
মরগান সোরেন

1

আমি অবাক হয়ে NUnit সম্প্রদায় কিছু নিয়ে আসেনি, তাই আমি নিজেই এই জাতীয় কিছু তৈরি করতে গিয়েছিলাম।

আমি বর্তমানে একটি ওপেন-সোর্স লাইব্রেরি বিকাশ করছি যা আপনাকে NUnit দিয়ে আপনার পরীক্ষাগুলি অর্ডার করতে দেয়। আপনি টেস্ট ফিক্সচারগুলি অর্ডার করতে পারেন এবং একইভাবে "অর্ডার করা টেস্টের নির্দিষ্টকরণগুলি" অর্ডার করতে পারেন।

গ্রন্থাগারটি নিম্নলিখিত বৈশিষ্ট্যগুলি সরবরাহ করে:

  • জটিল পরীক্ষার ক্রমক্রমক্রমক্রমগুলি তৈরি করুন
  • যদি কোনও পরীক্ষার ক্রম ব্যর্থ হয় তবে পরবর্তী পরীক্ষাগুলি এড়িয়ে যান
  • পূর্ণসংখ্যার আদেশের পরিবর্তে নির্ভরতার দ্বারা আপনার পরীক্ষার পদ্ধতিগুলি অর্ডার করুন
  • আনর্ডারড পরীক্ষার পাশাপাশি পাশাপাশি ব্যবহার সমর্থন করে। অর্ডারযুক্ত পরীক্ষাগুলি প্রথমে কার্যকর করা হয়।

লাইব্রেরিটি আসলে এমএসটিস্টে কীভাবে .orderedtestফাইলগুলির সাথে টেস্টের অর্ডার দেয় in নীচের উদাহরণ দেখুন।

[OrderedTestFixture]
public sealed class MyOrderedTestFixture : TestOrderingSpecification {
    protected override void DefineTestOrdering() {
        TestFixture<Fixture1>();

        OrderedTestSpecification<MyOtherOrderedTestFixture>();

        TestFixture<Fixture2>();
        TestFixture<Fixture3>();
    }

    protected override bool ContinueOnError => false; // Or true, if you want to continue even if a child test fails
}

1

আপনি যদি ব্যবহার করেন [TestCase]তবে যুক্তিটি TestNameপরীক্ষার জন্য একটি নাম সরবরাহ করে।

যদি নির্দিষ্ট না করা থাকে তবে পদ্ধতির নাম এবং প্রদত্ত যুক্তিগুলির ভিত্তিতে একটি নাম উত্পন্ন হয়।

আপনি নীচে প্রদত্ত পরীক্ষার ক্রয়ের আদেশ নিয়ন্ত্রণ করতে পারেন:

                    [Test]
            [TestCase("value1", TestName = "ExpressionTest_1")]
            [TestCase("value2", TestName = "ExpressionTest_2")]
            [TestCase("value3", TestName = "ExpressionTest_3")]
            public void ExpressionTest(string  v)
            {
                //do your stuff
            }

এখানে আমি "ExpressionTest"একটি সংখ্যার সাথে পদ্ধতির নাম প্রত্যয় ব্যবহার করেছি ।

আপনি বর্ণনামূলকভাবে অর্ডার করা কোনও নাম টেস্ট কেস অ্যাট্রিবিউট দেখতে ব্যবহার করতে পারেন


0

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

আমি কিছুটা গুগল করেছিলাম। যথারীতি, কিছু লোক ছদ্মবেশী কৌশল অবলম্বন করেছে (অন্তর্নিহিত টেস্টাবিলিটি / ডিজাইনের সমস্যাটি সমাধান করার পরিবর্তে)

  • পরীক্ষাগুলিকে বর্ণানুক্রমিকভাবে অর্ডার করে নামকরণ করা যাতে পরীক্ষাগুলি ক্রম সম্পাদনের জন্য তাদের 'প্রয়োজনীয়' ক্রমে উপস্থিত হয়। তবে নুনিত পরবর্তী প্রকাশের সাথে এই আচরণটি পরিবর্তন করতে পারে এবং তারপরে আপনার পরীক্ষাগুলি বাতিল করা হবে। সোর্স কন্ট্রোলের বর্তমান নুনিট বাইনারিগুলিতে আরও ভাল চেক।
  • ভিএস (আইএমএইচও তাদের 'চৌকস সরঞ্জামগুলি' দিয়ে ভুল আচরণকে উত্সাহিত করে) এর এমএস পরীক্ষার কাঠামোর মধ্যে "অর্ডারড টেস্টস" নামে কিছু আছে। আমি পড়তে কোনও সময় নষ্ট করি নি তবে মনে হয় এটি একই শ্রোতার দিকে লক্ষ্যযুক্ত

আরও দেখুন: একটি ভাল পরীক্ষার বৈশিষ্ট্য


এমন অনুষ্ঠানগুলি রয়েছে যেখানে আপনি দীর্ঘ চলমান পরীক্ষাগুলির আগে বিশেষত সংহতকরণ এবং গ্রহণযোগ্যতা পরীক্ষাগুলির আগে দ্রুত চলমান টেস্টগুলি কার্যকর করতে চান। উদাহরণস্বরূপ, একটি ব্লগিং অ্যাপে: আপনি প্রথমে লগইনটি পরীক্ষা করেন, কারণ যদি সেই বৈশিষ্ট্যটি কাজ না করে তবে পোস্টিং কাজ করবে না সুতরাং সেই পরীক্ষাটি কার্যকর করার কোনও অর্থ নেই (আপনি নিজে রানারকে থামিয়ে দিতে পারেন)। তবে আপনি যদি চলমান পরীক্ষা চালিয়ে যাওয়ার চেষ্টা করেন, তবে এতে আরও সময় লাগবে।
মার্সেল ভালদেজ ওরোজকো

@ মার্সেলভাল্ডেজ ওরোজকো - আপনি বিভিন্ন শারীরিক dll এর মাধ্যমে অথবা ট্যাগ / বিভাগ ব্যবহার করে আপনার পরীক্ষাগুলি ভাগ করে এই লক্ষ্য অর্জন করতে পারেন। আপনি নিজের বিল্ড স্ক্রিপ্টগুলি dls / বিভাগগুলি ক্রমান্বয়ে চালানোর জন্য তৈরি করতে পারেন। সাধারণভাবে, পরীক্ষার ক্রম মঞ্জুরি দেওয়ার ফলে সংযুক্ত পরীক্ষাগুলির দিকে পরিচালিত হয় যা প্রতিবেশী পরীক্ষাগুলির উপর নির্ভরতা বিকাশ করে (অবশ্যই সময়ের সাথে সাথে)। নূনিতের পরবর্তী বড় রিলিজে আফয়ার, এটি পরীক্ষার বিভিন্ন ক্রমকে সমর্থন করবে, যেমন এলোমেলো ইত্যাদি
গিশু

2
একই ধরণের পরীক্ষাগুলি (যেমন গ্রহণযোগ্যতা পরীক্ষাগুলি) উদাহরণস্বরূপ বিভাজন করা কোনও অর্থবোধ করে না এবং এগুলি অন্য ডিএলএলে পৃথক করে অকারণে জটিলতা বাড়ায়: উত্স কোড, স্ক্রিপ্টগুলি তৈরি করুন, স্ক্রিপ্টগুলি পরীক্ষা করুন, প্রকল্পের কাঠামো ইত্যাদি। কেবলমাত্র একটি সরল পুনর্বিন্যাসের জন্য পরীক্ষাগুলো.
মার্সেল ভালদেজ ওরোজকো

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

6
এটি বেশ পৃষ্ঠপোষকতার উত্তর এবং এটি মজার করে তোলে কারণ এটি কেবলমাত্র ইউনিট পরীক্ষায় প্রয়োগ হয় এবং বাস্তববাদী হওয়ার পক্ষে সম্পূর্ণ উপেক্ষা করে।
tymtam

0

TestCaseSourceকীটি ব্যবহারের ক্ষেত্রে override string ToStringপদ্ধতিটি হল , এটি কীভাবে কাজ করে:

ধরুন আপনার টেস্টকেস ক্লাস রয়েছে

public class TestCase
{
    public string Name { get; set; }
    public int Input { get; set; }
    public int Expected { get; set; }
}

এবং টেস্ট কেসগুলির একটি তালিকা:

private static IEnumerable<TestCase> TestSource()
{
    return new List<TestCase>
    {
        new TestCase()
        {
           Name = "Test 1",
           Input = 2,
           Expected = 4
        },
        new TestCase()
        {
            Name = "Test 2",
            Input = 4,
            Expected = 16
        },
        new TestCase()
        {
            Name = "Test 3",
            Input = 10,
            Expected = 100
        }
    };
}

এখন এটি একটি পরীক্ষার পদ্ধতি সহ ব্যবহার করুন এবং দেখুন কী ঘটে:

[TestCaseSource(nameof(TestSource))]
public void MethodXTest(TestCase testCase)
{
    var x = Power(testCase.Input);
    x.ShouldBe(testCase.Expected);
}

এটি ক্রমে পরীক্ষা করবে না এবং আউটপুটটি এর মতো হবে:

এখানে চিত্র বর্ণনা লিখুন

সুতরাং আমরা যদি override string ToStringআমাদের ক্লাসে যুক্ত করি তবে :

public class TestCase
{
    public string Name { get; set; }
    public int Input { get; set; }
    public int Expected { get; set; }

    public override string ToString()
    {
        return Name;
    }
}

ফলাফল পরিবর্তন হবে এবং আমরা পরীক্ষার অর্ডার এবং নামটি পেয়েছি:

এখানে চিত্র বর্ণনা লিখুন

বিঃদ্রঃ:

  1. পরীক্ষায় নাম ও অর্ডার কীভাবে পাওয়া যায় তা বোঝানোর জন্য এটি কেবল উদাহরণ, আদেশটি সংখ্যা / বর্ণানুক্রমিকভাবে নেওয়া হয় সুতরাং আপনার যদি দশের বেশি পরীক্ষা হয় তবে আমি টেস্ট 01, টেস্ট 02 .... টেস্ট 10, টেস্ট 11 ইত্যাদি করার পরামর্শ দিই কারণ যদি আপনি টেস্ট 1 তৈরি করেন এবং কোনও সময় 10 এর চেয়ে টেস্ট 10 হবে টেস্ট 1, টেস্ট 10, টেস্ট 2 .. ইত্যাদি than
  2. ইনপুট এবং প্রত্যাশিত যে কোনও প্রকার, স্ট্রিং, অবজেক্ট বা কাস্টম শ্রেণি হতে পারে।
  3. অর্ডার পাশাপাশি, এখানে ভাল জিনিস আপনি পরীক্ষার নাম দেখতে চান যা আরও গুরুত্বপূর্ণ।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.