ইউনিট পরীক্ষার জন্য স্থিতিশীল কী সর্বজনীন "দুষ্ট" এবং যদি তাই হয় তবে কেন রেশার্পার এটির সুপারিশ করে? [বন্ধ]


85

আমি দেখতে পেয়েছি যে ইউনিট টেস্টের (মক / স্টাব) নির্ভরতাগুলি কেবলমাত্র # # নেট এ স্থিতিশীল to

এগুলির দুটি নিখরচায় নয় এবং একটি মুক্তি দিতে পারে না তা দেওয়া 1.0, স্ট্যাটিক স্টাফগুলি উপহাস করা খুব সহজ নয়।

এটি কি স্থির পদ্ধতি এবং এই জাতীয় "দুষ্টু" তৈরি করে (ইউনিট পরীক্ষার অর্থে)? এবং যদি তা হয় তবে কেন পুনরায় ভাগ করে নিতে চাইলে আমি স্থির, স্থির হতে পারে এমন কোনও কিছু তৈরি করবো? (ধরে নিলাম পুনরায় ভাগ করাও "মন্দ" নয়))

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


3
TheLQ: আপনি পারেন। আমি বিশ্বাস করি তিনি স্থিতিশীল পদ্ধতিগুলি পরীক্ষা করতে সক্ষম না হওয়ার বিষয়ে কথা বলছেন কারণ এটি বেশিরভাগ সময় স্থিতিশীল ভেরিয়েবলগুলিকে স্পর্শ করে। এভাবে পরীক্ষার পরে এবং এর মধ্যে রাষ্ট্র পরিবর্তন করা।

26
ব্যক্তিগতভাবে আমি মনে করি আপনি "ইউনিট" এর সংজ্ঞাটি খুব বেশি নিচ্ছেন। "ইউনিট" "ক্ষুদ্রতম ইউনিট হওয়া উচিত যা বিচ্ছিন্নতাতে পরীক্ষা করার জন্য বোঝায়"। এটি কোনও পদ্ধতি হতে পারে, এটি এর চেয়ে বেশিও হতে পারে। যদি স্থির পদ্ধতির কোনও রাষ্ট্র না থাকে এবং ভালভাবে পরীক্ষিত হয় তবে দ্বিতীয় ইউনিট পরীক্ষার কল করা এটি (আইএমও) কোনও সমস্যা নয়।
mlk

10
"ব্যক্তিগতভাবে আমার ধারণা আপনি খুব" ইউনিট "এর সংজ্ঞা নিচ্ছেন।" না এটি ঠিক যে তিনি স্ট্যান্ডার্ড ব্যবহারের সাথে চলেছেন এবং আপনি নিজের সংজ্ঞাটি প্রস্তুত করছেন।

7
"কেন রিশার্পার আমাকে এমন কিছু করতে চান যা স্থির, স্থির হতে পারে?" Resharper নেই চান আপনি কিছু করতে। এটি কেবল আপনাকে সচেতন করে তুলছে যে কোনও কোড বিশ্লেষণ পিওভের মাধ্যমে পরিবর্তনটি সম্ভব এবং সম্ভবত কাঙ্ক্ষিত। পুনরায় ভাগ করা আপনার নিজের বিচারের প্রতিস্থাপন নয়!
অ্যাডাম নায়লর

4
@ acidzombie24। নিয়মিত পদ্ধতিগুলি স্থিতিশীল অবস্থাকেও সংশোধন করতে পারে তাই এগুলি স্থির পদ্ধতির মতোই "খারাপ" হবে। সংক্ষিপ্ত জীবনচক্রের সাথে তারা রাষ্ট্রকেও সংশোধন করতে পারে এ বিষয়টি তাদের আরও বিপজ্জনক করে তোলে। (আমি স্থিতিশীল পদ্ধতির পক্ষে নই, তবে রাষ্ট্র পরিবর্তন সম্পর্কে কথাটি নিয়মিত পদ্ধতির পক্ষে আরও বেশি আঘাত, আরও বেশি)
মাইকে 30

উত্তর:


105

এখানে অন্যান্য উত্তরগুলির দিকে তাকিয়ে আমার ধারণা আমি স্থির পদ্ধতিগুলির মধ্যে কিছু বিভ্রান্তি থাকতে পারে যা স্থির অবস্থা রাখে বা পার্শ্ব-প্রতিক্রিয়া সৃষ্টি করে (যা আমার কাছে সত্যই খারাপ ধারণা বলে মনে হয়), এবং স্থির পদ্ধতিগুলি যা কেবল একটি মান ফেরায়।

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


44
স্ট্যাটিক পদ্ধতিটি ইউনিট পরীক্ষামূলক, তবে স্ট্যাটিক পদ্ধতিটি যে পদ্ধতিগুলি কল করে সেগুলি সম্পর্কে কী বলা যায়? যদি কলকারীরা অন্য শ্রেণিতে থাকে তবে তাদের একটি নির্ভরতা রয়েছে যা ইউনিট পরীক্ষা করার জন্য ডিকপল করা দরকার।
ভ্যাকাকানো

22
@ ভ্যাকানো: তবে আপনি যদি স্থিতিশীল পদ্ধতিগুলি লিখেন যা রাষ্ট্রকে ধরে রাখে না এবং এর কোনও পার্শ্ব প্রতিক্রিয়া নেই, সেগুলি যেহেতু কমবেশি কার্যকরভাবে একটি স্টাবের সমতুল্য।
রবার্ট হার্ভে

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

20
@ ভ্যাকানো: স্ট্যাটিক পদ্ধতিতে আউটপুট বা এলোমেলো ব্যতিক্রম রয়েছে যার পার্শ্ব-প্রতিক্রিয়া রয়েছে।
টিখন জেলভিস

10
@TikhonJelvis রবার্ট হয়েছিল আউটপুট সম্পর্কে কথা বলা; এবং "এলোমেলো" ব্যতিক্রমগুলি কোনও পার্শ্ব প্রতিক্রিয়া হওয়া উচিত নয়, এগুলি মূলত আউটপুট একটি ফর্ম। মুল বক্তব্যটি হ'ল আপনি যখনই এমন কোনও পদ্ধতির পরীক্ষা করেন যা স্ট্যাটিক পদ্ধতিটিকে কল করে আপনি সেই পদ্ধতিটি এবং এর সম্ভাব্য আউটপুটটির সমস্ত ক্রমটি আবদ্ধ করছেন এবং আপনার পদ্ধতিটি বিচ্ছিন্নভাবে পরীক্ষা করতে পারবেন না।
নিকোল

26

আপনি স্থির ডেটা এবং স্থির পদ্ধতিগুলি বিভ্রান্ত করছেন বলে মনে হচ্ছে । পুনরায় ভাগ করা, যদি আমি সঠিকভাবে মনে করি তবে ক্লাসের স্থিতির privateমধ্যে পদ্ধতিগুলি তৈরি করা যায় যদি সেগুলি তৈরি করা যায় তবে সেগুলি প্রস্তাব দেয় - আমি বিশ্বাস করি এটির ফলে একটি ছোট্ট পারফরম্যান্স সুবিধা পাওয়া যায়। এটি "স্থির হতে পারে এমন কোনও কিছু" করার প্রস্তাব দেয় না !

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

public static long Square(int x)
{
    return x * x;
}

তাহলে এটি অত্যন্ত পরীক্ষামূলক এবং এর কোনও পার্শ্ব প্রতিক্রিয়া নেই। আপনি কেবল এটি পরীক্ষা করে দেখুন যে আপনি যখন প্রবেশ করবেন তখন বলুন, 20 আপনি 400 ফিরে পেয়েছেন No


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

3
কিছুই ঘটেনি. কেন হবে? .NET ফ্রেমওয়ার্কটি স্থির পদ্ধতিতে পূর্ণ। আপনি কি বলছেন যে আপনি যে কোন পদ্ধতিতে ইউনিট পরীক্ষা করতে চান সেগুলিতে এগুলি ব্যবহার করতে পারবেন না?
ড্যান ডিপো

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

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

6
@ ভ্যাকানকো তাই মাইক্রোসফ্ট কীভাবে .NET ফ্রেমওয়ার্কটি পরীক্ষা করে, তাহলে, হ্যাঁ? অন্যান্য ক্লাসে ফ্রেমওয়ার্ক রেফারেন্স স্ট্যাটিক পদ্ধতিতে ক্লাসগুলির অনেকগুলি (যেমন System.Math) স্থির কারখানার পদ্ধতিগুলির প্রাচুর্যের কথা উল্লেখ না করা ইত্যাদি। আপনি কখনও কোনও বর্ধন পদ্ধতি ব্যবহার করতে সক্ষম হবেন না। সত্য কথাটি হ'ল সাধারণ কাজগুলি আধুনিক ভাষার মৌলিক। আপনি এগুলিকে বিচ্ছিন্নভাবে পরীক্ষা করতে পারেন (যেহেতু তারা সাধারণত নিরোধক হবে) এবং তারপরে কোনও উদ্বেগ ছাড়াই এগুলি আপনার ক্লাসে ব্যবহার করুন। এইটা সমস্যা না!
ড্যান ডিপ্লো

18

যদি এখানে আসল প্রশ্নটি হয় "আমি এই কোডটি কীভাবে পরীক্ষা করব?":

public class MyClass
{
   public void MethodToTest()
   {
       //... do something
       MyStaticClass.StaticMethod();
       //...more
   }
}

তারপরে, কেবল কোডটি রিফ্যাক্টর করুন এবং যথারীতি স্ট্যাটিক ক্লাসে কলটি ইনজেক্ট করুন:

public class MyClass
{
   private readonly IExecutor _externalExecutor;
   public MyClass(_IExecutor executor)
   {
       _exeternalExecutor = executor;
   }

   public void MethodToTest()
   {
       //... do something
       _exetrnalExecutor.DoWork();
       //...more
   }
}

public class MyStaticClassExecutor : IExecutor
{
    public void DoWork()
    {
        MyStaticClass.StaticMethod();
    }
}

9
ভাগ্যক্রমে আমাদের কাছেও কোড পাঠযোগ্যতা এবং
এসআই

একজন প্রতিনিধি কি সহজ হবে না এবং একই কাজ করবে?
জে কে।

@ জে কে হতে পারে তবে আইওসি ধারকটি ব্যবহার করা তখন পক্ষে শক্ত।
সানি

15

পরিসংখ্যানগুলি অগত্যা দুষ্ট নয়, তবে যখন এটি জাল / উপহাস / স্টাবগুলির সাথে ইউনিট-টেস্টিংয়ের কথা আসে তখন তারা আপনার বিকল্পগুলি সীমাবদ্ধ করতে পারে।

বিদ্রূপ করার জন্য দুটি সাধারণ পন্থা রয়েছে।

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

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

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


14

এটি পরীক্ষা করে দেখুন: "স্ট্যাটিক পদ্ধতি হ'ল মৃত্যুর কাছে পরীক্ষার ক্ষমতা" । যুক্তির সংক্ষিপ্তসার:

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


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

4
@ রবার্ট হার্ভে - আপনি কীভাবে এমন একটি ইউনিট পরীক্ষা করেন যা অন্য শ্রেণীর স্ট্যাটিক পদ্ধতি ব্যবহার করে (যেমন এটি স্ট্যাটিক পদ্ধতির উপর নির্ভরশীলতা)। আপনি যদি কেবল এটির কল করতে দেন তবে আপনি "ইউনিট টেস্টিং" নন আপনি "সংহতকরণ পরীক্ষা"
ভ্যাকানকো

10
কেবল ব্লগ নিবন্ধটি পড়বেন না, এর সাথে একমত নন এমন অনেক মন্তব্য পড়ুন। একটি ব্লগ একটি মতামত, একটি সত্য নয়।
ড্যান ডিপো

8
@ ভ্যাকানো: কোনও পার্শ্ব-প্রতিক্রিয়া বা বাহ্যিক রাষ্ট্রবিহীন একটি স্ট্যাটিক পদ্ধতি কার্যত একটি মানের সমতুল্য। এটি জেনেও, এটি একটি ইন্টিজার তৈরি করে এমন পদ্ধতির পরীক্ষার চেয়ে আলাদা নয়। এটি কার্যকরী প্রোগ্রামিং আমাদেরকে দেয় এমন অন্তর্দৃষ্টিগুলির মধ্যে একটি।
স্টিভেন এভার্স

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

5

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

তবে এটিতে কোনও পরীক্ষার মূল সংজ্ঞা বৈশিষ্ট্য থাকবে না; ব্যর্থ হওয়া যখন জিনিসগুলি ভুল হয়, যখন তারা সঠিক হয় passing

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

এটি দেওয়া, তিনটি বিকল্প আছে:

  1. শ্রেণীর সমন্বয়ে গঠিত ইউনিটের পরীক্ষার জন্য ইউনিট পরীক্ষার সংজ্ঞা দিন এবং এটি হার্ড-কোডেড নির্ভরতা। এটি আপনাকে বিজ্ঞপ্তি নির্ভরতা এড়াতে সরবরাহ করে।

  2. আপনি পরীক্ষার জন্য দায়বদ্ধ ক্লাসগুলির মধ্যে কখনই সংকলন-সময় নির্ভরতা তৈরি করবেন না। এটি আপনাকে কার্যকর কোড শৈলীতে কিছু মনে না করে এমনটি কাজ করে।

  3. পরিবর্তে ইউনিট পরীক্ষা, সংহতকরণ পরীক্ষা করবেন না। কোনটি কাজ করে, তা সরবরাহ করে এটির জন্য আপনাকে ইন্টিগ্রেশন পরীক্ষার শব্দটি ব্যবহার করতে হবে এমন কোনও কিছুর সাথে দ্বন্দ্ব নেই।


3
এমন কিছুই নেই যা বলে যে ইউনিট পরীক্ষা একটি একক শ্রেণির পরীক্ষা is এটি একটি একক ইউনিটের পরীক্ষা। ইউনিট পরীক্ষার সংজ্ঞায়িত বৈশিষ্ট্য হ'ল তারা দ্রুত, পুনরাবৃত্তিযোগ্য এবং স্বতন্ত্র। Math.Piকোনও পদ্ধতিতে উল্লেখ করা কোনও যুক্তিসঙ্গত সংজ্ঞা দ্বারা এটি ইন্টিগ্রেশন টেস্ট করে না।
সারা

উদাহরণস্বরূপ বিকল্প ১। আমি সম্মত হলাম এটি সর্বোত্তম পন্থা, তবে অন্যান্য লোকেরা এই শর্তগুলি ভিন্নভাবে (যুক্তিযুক্ত বা না) ব্যবহার করে তা কার্যকর হতে পারে।
soru

4

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

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

আগে:

    public static DBConnection ConnectToDB( string dbName, string connectionInfo ) {
    }

পরে:

    public static Func<string, string, DBConnection> ConnectToDB (dbName, connectionInfo ) {
    };

দুটি কল-সামঞ্জস্যপূর্ণ। কলকারীদের পরিবর্তন করতে হবে না। ফাংশনের শরীর একই থাকে।

তারপরে আপনার ইউনিট-টেস্ট কোডগুলিতে আপনি এই কলটি তেমন স্ট্যাব করতে পারেন (ধরে নিলে এটি ডেটাবেস নামে একটি শ্রেণিতে রয়েছে):

        Database.ConnectToDB = (dbName, connectionInfo) => { return null|whatever; }

কাজটি শেষ হওয়ার পরে এটির মূল মূল্য দিয়ে প্রতিস্থাপন করতে সাবধান হন। আপনি চেষ্টা করে / শেষ পর্যন্ত বা আপনার ইউনিট-টেস্ট ক্লিন আপের মাধ্যমে এটি করতে পারেন, যা প্রতিটি পরীক্ষার পরে ডাকবে, কোড লিখুন যেমন:

    [TestCleanup]
    public void Cleanup()
    {
        typeof(Database).TypeInitializer.Invoke(null, null);
    }

যা আপনার শ্রেণীর স্থিতিশীল আরম্ভের পুনরায় প্রার্থনা করবে।

ল্যাম্বদা ফানসগুলি নিয়মিত স্থিতিশীল পদ্ধতির মতো সমর্থ হিসাবে সমৃদ্ধ নয়, সুতরাং এই পদ্ধতির নিম্নলিখিত অনাকাঙ্ক্ষিত পার্শ্ব-প্রতিক্রিয়া রয়েছে:

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

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

সুতরাং বাস্তবে, যে কেউ স্থির পদ্ধতিগুলির স্টাবের প্রতিকারের পরামর্শ দেয় তাদের হ'ল উদাহরণ পদ্ধতি তৈরি করা, তারা উদাহরণস্বরূপ পদ্ধতিগুলির বিরুদ্ধেও যা ভার্চুয়াল বা ইন্টারফেসের অংশ নয়।

তাহলে কেন সি # এর স্থির পদ্ধতি রয়েছে? কেন এটি নন-ভার্চুয়াল উদাহরণ পদ্ধতিগুলির জন্য অনুমতি দেয়?

আপনি যদি এই "বৈশিষ্ট্যগুলি" ব্যবহার করেন তবে আপনি কেবল বিচ্ছিন্ন পদ্ধতি তৈরি করতে পারবেন না।

সুতরাং আপনি কখন তাদের ব্যবহার করবেন?

এগুলি যে কোনও কোডের জন্য ব্যবহার করুন যা আপনি কখনই স্টাব আউট করতে চান না। কয়েকটি উদাহরণ: স্ট্রিং ক্লাসের ফরম্যাট () পদ্ধতি কনসোল শ্রেণির রাইটলাইন () পদ্ধতিটি ম্যাথ শ্রেণির কোশ () পদ্ধতি

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


3
  1. আমি বিশ্বাস করি এটি আংশিক কারণ স্থির পদ্ধতিগুলি উদাহরণ পদ্ধতির চেয়ে কল করতে "দ্রুত"। (উদ্ধৃতিগুলিতে কারণ এটি মাইক্রো অপ্টিমাইজেশনের গন্ধযুক্ত) দেখুন http://dotnetperls.com/static-method
  2. এটি আপনাকে বলছে যে এটির রাষ্ট্রের প্রয়োজন নেই, সুতরাং যে কোনও জায়গা থেকে ডেকে আনা যেতে পারে, ইনস্টিটিশন ওভারহেড অপসারণ করা উচিত যদি কারও এটির প্রয়োজন হয়।
  3. যদি আমি এটি উপহাস করতে চাই, তবে আমি মনে করি এটি সাধারণত এমন একটি অনুশীলন যা এটি একটি ইন্টারফেসে ঘোষণা করা হয়।
  4. যদি এটি কোনও ইন্টারফেসে ঘোষিত হয় তবে আর # আপনাকে এটিকে স্থির করার পরামর্শ দিবে না।
  5. যদি এটি ভার্চুয়াল হিসাবে ঘোষিত হয়, তবে আর # আপনাকে এটিকে স্থির করার পরামর্শ দিবে না।
  6. স্ট্যাটিক্যালি স্টেট (ফিল্ড) হোল্ড করা এমন একটি বিষয় যা সর্বদা সাবধানতার সাথে বিবেচনা করা উচিত । স্থিতিশীল অবস্থা এবং থ্রেড লিথিয়াম এবং জলের মতো মিশ্রিত হয়।

আর # এই একমাত্র সরঞ্জাম নয় যা এই পরামর্শটি দেবে। এফএক্সকপ / এমএস কোড বিশ্লেষণও একই কাজ করবে।

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


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

1
না আপনি কোনও ইন্টারফেসে স্থির ঘোষণা করতে পারবেন না। এটা অর্থহীন হবে।
এমআইএ

3

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


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

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

1
প্রশ্নের সাথে প্রাসঙ্গিক নয়।
ইগবি লার্জম্যান

2

স্থিতিশীল পদ্ধতিটি যদি অন্য পদ্ধতির অভ্যন্তর থেকে কল করা হয় তবে এ জাতীয় কলটি প্রতিরোধ করা বা এটি বিকল্প করা সম্ভব নয়। এর অর্থ, এই দুটি পদ্ধতি একটি একক ইউনিট তৈরি করে; যে কোনও ধরণের ইউনিট পরীক্ষা তাদের উভয়কেই পরীক্ষা করে।

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


0

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

এখন টেস্টাব্লিটির জন্য এই পরিস্থিতিটি কোনও সমস্যা হওয়া উচিত নয় কারণ আপনার ব্যক্তিগত পদ্ধতি যেভাবেই পরীক্ষা করা উচিত নয়।

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


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

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