ইউনিট পরীক্ষায় নাল প্যারামিটার সহ অবজেক্টগুলি তৈরি করা কি ঠিক আছে?


37

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

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

public class CarRadio
{...}


public class Motor
{
    public void SetSpeed(float speed){...}
}


public class Car
{
    public Car(CarRadio carRadio, Motor motor){...}
}


public class SpeedLimit
{
    public bool IsViolatedBy(Car car){...}
}

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

public class SpeedLimitTest
{
    public void TestSpeedLimit()
    {
        Motor motor = new Motor();
        motor.SetSpeed(10f);
        Car car = new Car(null, motor);

        SpeedLimit speedLimit = new SpeedLimit();
        Assert.IsTrue(speedLimit.IsViolatedBy(car));
    }
}

পরীক্ষা ঠিকঠাক হয়। SpeedLimitএকটি প্রয়োজন Carএকটি সঙ্গে Motorযাতে এর জিনিস করতে হবে। এটি মোটেও আগ্রহী CarRadioনয়, তাই আমি এটির জন্য শূন্যতা সরবরাহ করেছি।

আমি ভাবছি পুরোপুরি নির্মাণ না করে সঠিক কার্যকারিতা সরবরাহকারী কোনও বিষয়টি এসআরপি বা কোড গন্ধ লঙ্ঘন কিনা। আমার এই উত্তেজনাপূর্ণ অনুভূতিটি এটি অনুভব করে তবে speedLimit.IsViolatedBy(motor)তা ঠিক অনুভব করে না - একটি গতির সীমা গাড়ি দ্বারা নয়, মোটর দ্বারা লঙ্ঘিত হয়। ওয়ার্কিং কোড ইউনিট টেস্টের জন্য সম্ভবত আমার আলাদা দৃষ্টিভঙ্গি দরকার কারণ পুরো উদ্দেশ্যটি কেবলমাত্র একটি অংশের পরীক্ষা করা।

ইউনিট পরীক্ষায় নাল দিয়ে বস্তুগুলি তৈরি করা কি কোনও কোডের গন্ধে পরীক্ষা করে?


24
কিছুটা অফ-টপিক, তবে Motorসম্ভবত এটিকে মোটেও নেওয়া উচিত নয় speed। এটির বর্তমান এবং এর উপর ভিত্তি করে একটি throttleএবং গণনা করা উচিত । এটি একটি বর্তমান গতিতে সংহত করার জন্য এটি ব্যবহার করা এবং এটি আবার সংকেত হিসাবে ফিরিয়ে আনাই গাড়ীটির কাজ ... তবে আমার ধারণা, আপনি যাইহোক বাস্তবেবাদের পক্ষে ছিলেন না, আপনি কি ছিলেন? torquerpmthrottleTransmissionrpmMotor
মাস্টার

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

4
নাল-অবজেক্ট প্যাটার্নটি বিবেচনা করুন । এটি প্রায়শই কোডটিকে সহজতর করে এনপিই-নিরাপদ করে তোলে।
বাকুরিউ 18

17
অভিনন্দন : আপনি পরীক্ষা করেছেন যে একটি nullরেডিও দিয়ে, গতির সীমাটি সঠিকভাবে গণনা করা হয়েছে। এখন আপনি রেডিওর সাথে গতির সীমাটি বৈধ করার জন্য একটি পরীক্ষা তৈরি করতে চাইতে পারেন ; আচরণের পার্থক্য থাকলে ...
ম্যাথিউ এম।

3
এই উদাহরণ সম্পর্কে নিশ্চিত নয়, তবে কখনও কখনও আপনি কেবল অর্ধ শ্রেণির পরীক্ষা করতে চান এমন একটি সূত্র যা কিছু ভেঙে ফেলা উচিত
Owen

উত্তর:


70

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

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


44
এবং একটি Carছাড়া একটি নির্মাণ করা যায় না তা পরীক্ষা করার জন্য ইউনিট পরীক্ষা লিখতে ভুলবেন না SteeringWheel...
মাস্টার

13
আমি কিছু অনুপস্থিত করা যেতে পারে, কিন্তু যদি এটা সম্ভব এবং এমনকি এর সাধারণ একটি তৈরি করতে Carএকটি ছাড়া CarRadio, এটা জানার জন্য না একটি কন্সট্রাকটর প্রয়োজন হয় না যে এক পাশ করা প্রয়োজন এবং এ সব একটি সুনির্দিষ্ট নাল সম্পর্কে চিন্তা করতে হবে না তৈরি করতে ?
এয়ারউইগ

16
স্ব-ড্রাইভিং গাড়িগুলির একটি স্টিয়ারিং হুইল নাও থাকতে পারে। কথা মাত্র. ☺
ব্ল্যাকজ্যাক

1
@ জেমস_পারসনস আমি এটি যোগ করতে ভুলে গেছি যে এটি এমন একটি শ্রেণীর সম্পর্কে যা নাল চেকগুলি ছিল না কারণ এটি কেবল অভ্যন্তরীণভাবে ব্যবহৃত হত এবং সর্বদা নন-নাল প্যারামিটার প্রাপ্ত হত। অন্যান্য পদ্ধতিগুলি Carকোনও শূন্যের সাথে একটি এনআরই নিক্ষেপ করত CarRadioতবে প্রাসঙ্গিক কোডটি SpeedLimitতা করবে না। প্রশ্ন হিসাবে পোস্ট হিসাবে পোস্ট এখন আপনি সঠিক হতে হবে এবং আমি সত্যিই এটি করতে হবে।
আর শ্মিতজ

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

23

ইউনিট পরীক্ষায় নাল দিয়ে বস্তুগুলি তৈরি করা কি কোনও কোডের গন্ধে পরীক্ষা করে?

হ্যাঁ। কোড গন্ধের সি 2 সংজ্ঞাটি নোট করুন : "একটি কোডসেল একটি ইঙ্গিত যা কিছু ভুল হতে পারে, একটি নির্দিষ্টতা নয়" "

পরীক্ষা ঠিকঠাক হয়। স্পিডলিমিটের কাজটি করার জন্য মোটর সহ একটি গাড়ি দরকার। এটি কোনও CarRadio এ মোটেই আগ্রহী নয়, তাই আমি এটির জন্য শূন্যতা সরবরাহ করেছি।

যদি আপনি এটি প্রদর্শনের চেষ্টা করছেন speedLimit.IsViolatedBy(car)যা CarRadioনির্মাতার কাছে দেওয়া আর্গুমেন্টের উপর নির্ভর করে না , তবে ভবিষ্যতে রক্ষণাবেক্ষণকারীদের কাছে এটি পরীক্ষা করাতে ব্যর্থ হলে পরীক্ষার ক্ষেত্রে দ্বিগুণ পরীক্ষার প্রবর্তন করে সেই সীমাবদ্ধতা স্পষ্ট করে তুলতে হবে।

যদি সম্ভবত আরও বেশি সম্ভাবনা থাকে তবে আপনি কেবল নিজের তৈরির কাজটি সংরক্ষণ করার চেষ্টা করছেন CarRadioযা আপনি জানেন যে এই ক্ষেত্রে ব্যবহৃত হয় না, আপনার লক্ষ্য করা উচিত

  • এটি এনক্যাপসুলেশনের লঙ্ঘন (আপনি যে সত্যটি CarRadioব্যবহার করেননি তা পরীক্ষায় ফাঁস হতে দিচ্ছেন)
  • আপনি কমপক্ষে একটি কেস সন্ধান করেছেন যেখানে আপনি Carকোনও উল্লেখ না করেই তৈরি করতে চানCarRadio

আমি দৃ strongly়ভাবে সন্দেহ করি যে কোডটি আপনাকে বলার চেষ্টা করছে যে আপনি দেখতে এমন কোনও নির্মাণকারীর চান

public Car(IMotor motor) {...}

এবং তারপর যে কন্সট্রাকটর সিদ্ধান্ত নিতে পারেন কোন নেই আসলে কিছু করারCarRadio

public Car(IMotor motor) {
    this(null, motor);
}

অথবা

public Car(IMotor motor) {
    this( new ICarRadio() {...} , motor);
}

অথবা

public Car(IMotor motor) {
    this( new DefaultRadio(), motor);
}

প্রভৃতি

স্পিডলিমিট পরীক্ষা করার সময় অন্য কিছুতে শূন্য হয়ে যাওয়ার বিষয়টি সম্পর্কে। আপনি দেখতে পাচ্ছেন যে পরীক্ষাকে "স্পিডলিমিটটেষ্ট" বলা হয় এবং একমাত্র অ্যাসেট স্পিডলিমিটের একটি পদ্ধতি পরীক্ষা করে দেখছে।

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

এটি এমন একটি ইঙ্গিত হতে পারে যা কোনও সম্পূর্ণ গাড়ির প্রয়োজনের চেয়ে গাড়ি প্রয়োগ করে এমন SpeedLimit.isViolatedByএকটি রোল ইন্টারফেস গ্রহণ করা উচিত ।

interface IHaveSpeed {
    float speed();
}

class Car implements IHaveSpeed {...}

IHaveSpeedএকটি সত্যই লম্পট নাম; আশা করি আপনার ডোমেন ভাষার একটি উন্নতি হবে।

সেই ইন্টারফেসের জায়গায়, এর জন্য আপনার পরীক্ষাটি SpeedLimitআরও সহজ হতে পারে

public void TestSpeedLimit()
{
    IHaveSpeed somethingTravelingQuickly = new IHaveSpeed {
        float speed() { return 10f; }
    }

    SpeedLimit speedLimit = new SpeedLimit();
    Assert.IsTrue(speedLimit.IsViolatedBy(somethingTravelingQuickly));
}

আপনার শেষ উদাহরণে আমি ধারণা করছি আপনাকে এমন একটি মক ক্লাস তৈরি করতে হবে যা IHaveSpeedইন্টারফেসটি কার্যকর করে (কমপক্ষে সি # তে) আপনি কোনও ইন্টারফেস নিজেই ইনস্ট্যান্ট করতে সক্ষম হবেন না।
রায়ান সেরেল

1
এটি ঠিক - কার্যকর বানানটি নির্ভর করে আপনি আপনার পরীক্ষাগুলির জন্য কোন ব্লাবের স্বাদ ব্যবহার করছেন।
ভয়েসফুউনরেজন

18

ইউনিট পরীক্ষায় নাল দিয়ে বস্তুগুলি তৈরি করা কি কোনও কোডের গন্ধে পরীক্ষা করে?

না

একেবারেই না. বিপরীতে, যদি NULLএকটি মান হয় যা আর্গুমেন্ট হিসাবে উপলব্ধ (কিছু ভাষায় এমন কন্সট্রাক্ট থাকতে পারে যা নাল পয়েন্টারটি পাস করার অনুমতি দেয় না), আপনার এটি পরীক্ষা করা উচিত

আর একটি প্রশ্ন আপনি পাস করার পরে কি হয় NULL। কিন্তু যে ঠিক উপার্জন নিশ্চিত কি একটি ইউনিট পরীক্ষা সম্পর্কে সংজ্ঞায়িত ফলাফলের যখন প্রতিটি সম্ভাব্য ইনপুট জন্য ঘটছে। আর NULL হয় যাতে আপনি আপনার সংজ্ঞায়িত ফলাফলের থাকা উচিত এবং আপনি যে জন্য একটি পরীক্ষা থাকা উচিত, একটি সম্ভাব্য ইনপুট।

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

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


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


দেখে মনে হচ্ছে আপনি Carএখানে বাউট টেস্ট লিখছেন । আমি কোনও ভুল বিবৃতি বিবেচনা করব না এমন কিছু না দেখলেও প্রশ্নটি পরীক্ষার বিষয়ে SpeedLimit
আর স্মিটজ

@ আর.শ্মিট্জ আপনার অর্থ কী তা নিশ্চিত নয়। আমি প্রশ্নটি উদ্ধৃত করেছি, এটি NULLনির্মাণকারীর কাছে যাওয়ার বিষয়ে Car
চালিত

1
এটি পরীক্ষা করার সময়SpeedLimit অন্য কিছুতে নাল পাস করার বিষয়ে । আপনি দেখতে পাচ্ছেন যে পরীক্ষাকে "স্পিডলিমিটটেষ্ট" বলা হয় এবং কেবলমাত্র Assertএকটি পদ্ধতি পরীক্ষা করা হয় SpeedLimit। পরীক্ষা Car- উদাহরণস্বরূপ "যদি আপনার গাড়িটি রেডিও ছাড়াই নির্মাণযোগ্য বলে মনে করা হয় তবে আপনার জন্য একটি পরীক্ষা লিখতে হবে" - এটি একটি ভিন্ন পরীক্ষায় ঘটবে।
আর স্মিটজ

7

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

class Car
{
   private readonly ICarRadio _carRadio;
   private readonly IMotor _motor;

   public Car(ICarRadio carRadio, IMotor motor)
   {
      if (carRadio == null)
         throw new ArgumentNullException(nameof(carRadio));

      if (motor == null)
         throw new ArgumentNullException(nameof(motor));

      _carRadio = carRadio;
      _motor = motor;
   }
}

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

এটি বলার পরে, আপনি একবার দু'টি কাজ করার পরে এটি একটি নন-ইস্যুতে পরিণত হয়:

  1. ক্লাসের পরিবর্তে ইন্টারফেসে প্রোগ্রাম।
  2. শূন্যতার পরিবর্তে উপহাস নির্ভরতা ইনজেকশনের জন্য একটি উপহাস ফ্রেমওয়ার্ক (সি # এর জন্য মাকের মতো) ব্যবহার করুন।

সুতরাং আপনার উদাহরণের জন্য আপনার থাকতে হবে:

interface ICarRadio
{
   bool Tune(float frequency);
}

interface Motor
{
   bool SetSpeed(float speed);
}

...
var car = new Car(new Moq<ICarRadio>().Object, new Moq<IMotor>().Object);

মোক ব্যবহারের বিষয়ে আরও বিশদ এখানে পাওয়া যাবে

অবশ্যই, যদি আপনি এটি প্রথমে বিদ্রূপ না করে বুঝতে চান তবে আপনি যতক্ষণ ইন্টারফেস ব্যবহার করছেন ততক্ষণ আপনি এটি করতে পারেন। নিম্নলিখিত হিসাবে কেবল একটি ডামি CarRadio এবং মোটর তৈরি করুন এবং এর পরিবর্তে সেগুলি ইনজেক্ট করুন:

class DummyCarRadio : ICarRadio
{
   ...
}
class DummyMotor : IMotor
{
   ...
}

...
var car = new Car(new DummyCarRadio(), new DummyMotor())

3
এই আমি উত্তরটি লিখতে হবে
লিয়্যাথ

1
আমি এমনকি এতদূর যেতে চাই যে ডামি বস্তুগুলিকেও তাদের চুক্তিটি করতে হবে। যদি IMotorকোনও getSpeed()পদ্ধতি থাকে DummyMotorতবে সফলতার পরেও পরিবর্তিত গতি ফিরিয়ে আনতে হবে setSpeed
কমফ্রিচ

1

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

গন্ধ আছে? আচ্ছা ...

পরীক্ষা গন্ধ নেই। পরীক্ষাটি তার কাজ করছে। এটি ঘোষণা করছে যে "এই বিষয়টি নাল হতে পারে এবং পরীক্ষার কোডটি এখনও সঠিকভাবে কাজ করে"।

গন্ধটি বাস্তবায়নের মধ্যে রয়েছে। কোনও কনস্ট্রাক্টর আর্গুমেন্ট ঘোষণা করে, আপনি ঘোষণা করছেন যে " সঠিকভাবে কাজ করার জন্য এই শ্রেণীর এই জিনিসটির প্রয়োজন "। স্পষ্টতই, এটি অসত্য। কিছু অসত্য কিছুটা দুর্গন্ধযুক্ত।


1

আসুন প্রথম নীতিগুলিতে ফিরে আসি।

একটি ইউনিট পরীক্ষা একটি একক শ্রেণির কিছু দিক পরীক্ষা করে।

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

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

এ পর্যন্ত সব ঠিকই. যাইহোক, যদি NULL একটি বৈধ মান না হয় what ঠিক আছে, আপনি এখানে বিদ্রূপ, স্টাবস, ডামি এবং জালিয়াতির বিশ্রী জগতে প্রবেশ করছেন ।

যদি এই সমস্ত কিছু গ্রহণ করা আরও বেশি মনে হয় তবে আপনি ইতিমধ্যে কার কন্সট্রাক্টরটিতে NUL পাস করে একটি ডামি ব্যবহার করছেন কারণ এটি এমন একটি মান যা সম্ভাব্যভাবে ব্যবহার করা হবে না।

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


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

3
"ইউনিট" কে "শ্রেণি" এর জন্য শ্রুতিমধুর রূপ হিসাবে বিবেচনা করা দুর্ভাগ্যক্রমে চিন্তাভাবনার একটি সাধারণ উপায় তবে বাস্তবে এগুলি সবই ঘটে (ক) "আবর্জনা-আবর্জনা, আবর্জনা আউট" পরীক্ষাগুলিকে উত্সাহিত করে, যা পুরো পরীক্ষার বৈধতাকে পুরোপুরি ক্ষুণ্ন করতে পারে স্যুট এবং (খ) পরিবর্তনের জন্য মুক্ত হওয়া উচিত এমন সীমানা প্রয়োগ করে, যা উত্পাদনশীলতা পঙ্গু করতে পারে। আমি আশা করি আরও বেশি লোক তাদের যন্ত্রণা শুনবে এবং এই ধারণাকে চ্যালেঞ্জ জানাবে।
পিপীলিকা

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

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

1
রবিডি - আমি ঠিক এর বিপরীতে কথা বলছি। বিবেচনা করুন যে আপনিই হতে পারেন সাধারণ ভুল ধারণা পোষণকারী, আপনি "ইউনিট" কী বিবেচনা করেন তা পুনর্বিবেচনা করুন এবং ক্যানড বেক যখন টিডিডি সম্পর্কে কথা বলছিলেন তখন তিনি কী সত্যই কথা বলছিলেন তা সম্পর্কে আরও গভীর খনন করতে পারেন। বেশিরভাগ লোকেরা এখন টিডিডি যাকে বলে, এটি একটি কার্গো কাল্ট মনস্ট্রোসিটি। youtube.com/watch?v=EZ05e7EMOLM
পিঁপড়া পি

1

আপনার নকশা কটাক্ষপাত গ্রহণ, আমি সুপারিশ করবে যে একটি Carএকটি সেট গঠিত হয় Features। একটি বৈশিষ্ট্য হয়তো CarRadio, বা EntertainmentSystemযা ভালো জিনিস গঠিত হতে পারে CarRadio, DvdPlayerইত্যাদি

সুতরাং, সর্বনিম্ন, আপনাকে Carএকটি সেট দিয়ে একটি নির্মাণ করতে হবে FeaturesEntertainmentSystemএবং CarRadioইন্টারফেসের (জাভা, সি # ইত্যাদি) প্রয়োগকারী হবে এবং public [I|i]nterface Featureএটি সম্মিলিত নকশা প্যাটার্নের উদাহরণ হতে পারে।

অতএব, আপনি সবসময় এমন একটি গঠন করা হবে Carসঙ্গে Featuresএবং একটি ইউনিট পরীক্ষা instantiate না হবে Carকোনো ছাড়া Features। যদিও আপনি সম্ভবত BasicTestCarFeatureSetএটির সবচেয়ে বেশি মৌলিক পরীক্ষার জন্য ন্যূনতম কার্যকারিতার প্রয়োজন রয়েছে এমন একটিকে উপহাস করার বিষয়টি বিবেচনা করতে পারেন ।

শুধু কিছু চিন্তা।

জন

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