ব্যবসায়ের যুক্তি পরিবর্তিত হলে একটি ইউনিট পরীক্ষা ভঙ্গুর হিসাবে বিবেচিত হয়?


27

দয়া করে নীচের কোডটি দেখুন; এটি মহিলা লিঙ্গ সহ কোনও ব্যক্তি অফার 1 এর জন্য উপযুক্ত কিনা তা পরীক্ষা করে দেখে:

[Fact]
public void ReturnsFalseWhenGivenAPersonWithAGenderOfFemale()
{
    var personId = Guid.NewGuid();
    var gender = "F";
    var person = new Person(personId, gender);

    var id = Guid.NewGuid();
    var offer1 = new Offer1(id,"Offer1");
    Assert.False(offer1.IsEligible(person));
}

এই ইউনিট পরীক্ষা সফল। তবে, ভবিষ্যতে যদি 'অফার 1' মহিলাদের কাছে দেওয়া হয় তবে এটি ব্যর্থ হবে।

এটি কি গ্রহণযোগ্য বলে মনে হয় - যদি ব্যবসার যুক্তি চারপাশে 1 টি পরিবর্তন করে তবে ইউনিট পরীক্ষাটি অবশ্যই পরিবর্তন করতে হবে। দয়া করে মনে রাখবেন যে কিছু ক্ষেত্রে (কিছু অফারগুলির জন্য) ব্যবসার যুক্তিটি ডাটাবেজে এই জাতীয় পরিবর্তিত হয়:

update Offers set Gender='M' where offer=1;

এবং কিছু ক্ষেত্রে ডোমেন মডেলটিতে এটির মতো:

if (Gender=Gender.Male)
{
  //do something
}

দয়া করে মনে রাখবেন যে কিছু ক্ষেত্রে ডোমেন লজিক নিয়মিত পরিবর্তনের প্রস্তাব দেয় এবং কিছু ক্ষেত্রে তা হয় না।


2
অন্য একটি কোণ থেকে চিন্তা করুন: আপনি যখন পরীক্ষার অধীনে সিস্টেমে যুক্তি পরিবর্তন করেন তখন আপনি কী পরীক্ষা করতে চান যা ব্যর্থ হয়নি?
ফ্যাবিও

উত্তর:


77

এটি স্বাভাবিক অর্থে ভঙ্গুর নয়। একটি ইউনিট পরীক্ষা ভঙ্গুর হিসাবে বিবেচিত হয় যদি এটি প্রয়োগের পরিবর্তনের কারণে ভেঙে যায় যা পরীক্ষার অধীনে আচরণকে প্রভাবিত করে না। তবে যদি ব্যবসায়ের যুক্তি নিজেই পরিবর্তিত হয়, তবে এই যুক্তির একটি পরীক্ষা ভাঙ্গার কথা

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

পরীক্ষার নাম Returns False When Given A Person With A Gender Of Femaleকোনও ব্যবসায়িক বিধি বর্ণনা করে না। একটি ব্যবসায়িক নিয়ম এমন কিছু হবে Offers Applicable to M should not be applied to persons of gender F

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


@ জাকসবি, তাহলে এটি ইউনিটের পরীক্ষা হবে না? বা এটা হবে? আমি বিশ্বাস করি এটি ডাটাবেস জড়িত থাকলে এটি একটি ইন্টিগ্রেশন পরীক্ষা হবে। এটা কি সঠিক? আপনি কি বলছেন যে ব্যবসায়ের যুক্তি অনেক পরিবর্তন হলে ইউনিট পরীক্ষা ব্যবহার করবেন না?
w0051977

@ w0051977: আপনি পরীক্ষা কীভাবে লিখবেন তা নির্ভর করে। যদি পরীক্ষায় কোনও ডাটাবেজে কোনও পরিবর্তন পরিবর্তনের অন্তর্ভুক্ত থাকে তবে এটি একটি সংহতকরণ পরীক্ষা হবে।
জ্যাকবিবি

3
@ w0051977 আরও ভাল ধারণা - ব্যবসায়ের বিধি বাস্তবায়নের জন্য দায়বদ্ধ উপাদানটির নির্ভরতা হতে হবে না os একটি উচ্চ-স্তরের অর্কেস্টেশন করুন যা ভাণ্ডারগুলিকে কল করে এবং তারপরে ব্যবসায়ের নিয়মগুলি ডাকে। এখন আপনি ব্যবসায় বিধি বিচ্ছিন্নভাবে পরীক্ষা করতে পারবেন।
পিপীলিকা 14

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

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

14

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

ifবিবৃতি সহ যখন ডোমেন মডেলটিতে সম্পত্তিটি সংজ্ঞায়িত করা হয় , একই পরীক্ষাটি ইউনিট পরীক্ষা unit এবং এটি ভঙ্গুর হতে পারে। তবে আসল সমস্যাটি হচ্ছে কোডটি ভঙ্গুর। সাধারণ নিয়ম হিসাবে, ব্যবসায়ের আচরণটি হার্ড কোডিংয়ের পরিবর্তে কনফিগারযোগ্য হলে আপনার কোডটি আরও বেশি স্থিতিস্থাপক হবে। কারণ একটি ছোট কোডিং ত্রুটি ঠিক করার জন্য একটি ভিড় মোতায়েন বিরল হওয়া উচিত। তবে বিজ্ঞপ্তি ছাড়াই ব্যবসায়ের প্রয়োজনীয় পরিবর্তন হ'ল মঙ্গলবার (এমন কিছু যা সাপ্তাহিকভাবে ঘটে)।

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

আপনি যদি ইউনিট পরীক্ষা লিখতে থাকেন তবে আপনি উভয় personএবং offer1গ্রাউন্ড থেকে ডেটাবেস স্থিতির উপর কোনও নির্ভরতা ছাড়াই তৈরি করবেন । কিছুটা এইরকম

[Fact]
public void ReturnsFalseWhenGivenAPersonWithAGenderOfFemale()
{
    var personId = Guid.NewGuid();
    var gender = "F";
    var person = new Person(personId, gender);

    var id = Guid.NewGuid();
    var offer1 = new Offer1(id, "ReturnsFalseWhenGivenAPersonWithAGenderOfFemale");
    offer1.markLimitedToGender("M");

    Assert.False(offer1.IsEligible(person));
}

মনে রাখবেন যে ব্যবসায়ের যুক্তির ভিত্তিতে এটি পরিবর্তন হয় না। এটি জোর দিয়ে বলছে না যে মহিলা offer1প্রত্যাখ্যান করে। এটি এমন offer1অফার তৈরি করছে যা মহিলাদের প্রত্যাখ্যান করে।

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

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

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

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

টিএল; ডিআর : আপনি এভাবে পরীক্ষা লিখতে পারেন, তবে আপনার সফ্টওয়্যারটি লেখার চেয়ে আপনি আরও ভাল হতে পারেন তাই আপনাকে এটি করতে হবে না।


আমি আপনার উত্তরে কিছু ছোটখাটো বিশদ উন্নত করার স্বাধীনতার সরঞ্জামটি। আমি আপনার উদ্দেশ্য ঠিক আছে কিনা তা পরীক্ষা করুন।
ডক ব্রাউন 17

মূল পোস্টে কোনও ডাটাবেস জড়িত এমন কোনও ইঙ্গিত নেই। সুতরাং এটি দাবি করে যে এটি ধরে নিয়েছে যে অফার 1 ইতিমধ্যে ডেটাবেজে রয়েছে উদ্ভট।
উইনস্টন ইওয়ার্ট

2
@ উইনস্টোনওয়ার্ট: একটি স্পষ্ট ইঙ্গিত রয়েছে, আপনাকে প্রশ্নটি আরও মনোযোগ সহকারে পড়তে হবে। আমি প্রথম পড়ার সময়ও এটি বুঝতে পারি নি, তবে ওপি যা বলছে তা আসলে এটিই।
ডক ব্রাউন 17

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