শুধুমাত্র ইউনিট পরীক্ষার সময় যে পদ্ধতিগুলি ব্যবহৃত হয় তা চালু করা কি ঠিক?


12

সম্প্রতি আমি একটি কারখানার পদ্ধতিতে টিডিডিং করছিলাম। পদ্ধতিটি হ'ল হয় একটি সরল বস্তু তৈরি করা বা একটি সাজসজ্জারে আবৃত একটি বস্তু তৈরি করা। সজ্জিত অবজেক্টটি সমস্ত প্রসারিত স্ট্র্যাটেজিক্লাসের মধ্যে বিভিন্ন ধরণের একটি হতে পারে।

আমার পরীক্ষায় আমি যাচাই করতে চেয়েছিলাম, প্রত্যাশিত অবজেক্টের ক্লাসটি কিনা as প্লেইন অবজেক্ট ওস ফিরে এলে এটি সহজ, কিন্তু যখন এটি কোনও ডেকোরেটরের মধ্যে আবৃত থাকে তখন কী করতে হবে?

আমি পিএইচপিতে কোড করি যাতে আমি ext/Reflectionএকটি ক্লাসযুক্ত মোড়কযুক্ত বস্তুর সন্ধান করতে পারি তবে আমার কাছে মনে হয় এটি অত্যধিক জটিল জিনিস এবং কিছুটা আবার টিডিডি-র বিধিবিধানের বিরুদ্ধে রয়েছে।

পরিবর্তে আমি getClassName()স্ট্র্যাটেজিক্লাস থেকে ডাকা হলে অবজেক্টের শ্রেণির নামটি ফিরিয়ে আনব তা প্রবর্তন করার সিদ্ধান্ত নিয়েছি । ডেকোরেটারের কাছ থেকে কল করার পরে, এটি সাজানো বস্তুতে একই পদ্ধতি দ্বারা ফেরত মানটি ফিরিয়ে দেয়।

এটি আরও স্পষ্ট করার জন্য কিছু কোড:

interface StrategyInterface {
  public function getClassName();
}

abstract class StrategyClass implements StrategyInterface {
  public function getClassName() {
    return \get_class($this);
  }
}

abstract class StrategyDecorator implements StrategyInterface {

  private $decorated;

  public function __construct(StrategyClass $decorated) {
    $this->decorated = $decorated;
  }

  public function getClassName() {
    return $this->decorated->getClassName();
  }

}

এবং একটি PHPUnit পরীক্ষা

 /**
   * @dataProvider providerForTestGetStrategy
   * @param array $arguments
   * @param string $expected
   */
  public function testGetStrategy($arguments, $expected) {

    $this->assertEquals(
      __NAMESPACE__.'\\'.$expected,  
      $this->object->getStrategy($arguments)->getClassName()
    )
  }

//below there's another test to check if proper decorator is being used

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


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

উত্তর:


13

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

চিন্তাভাবনার পরিবর্তে, "আমি কি সঠিক কৌশল শ্রেণি পেয়েছি" মনে করি " এই অনুমানটি যা পরীক্ষা করার চেষ্টা করছে সে ক্লাসটি আমি কী সম্পাদন করব ?" এটি খুব ভাল যখন আপনি অভ্যন্তরীণ নদীর গভীরতানির্ণয় পরীক্ষা করতে পারেন তবে আপনার দরকার নেই, কেবল গিঁট ঘুরিয়ে পরীক্ষা করে দেখুন যে আপনি গরম বা ঠান্ডা জল পান কিনা।


+1 ওপি 'ক্লিয়ার বক্স' ইউনিট পরীক্ষার বিবরণ দিচ্ছে, টিডিডি বৈশিষ্ট্য পরীক্ষার নয়
স্টিভেন এ লো লো

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

অন্যদিকে এবং এই প্রশ্নের আলোকে: প্রোগ্রামারস.স্ট্যাকেক্সেঞ্জার
প্রশ্নস

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

5

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

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

উত্পাদন ধরণের শ্রেণি:

class ProdObj
{
  ...
  protected:
     virtual bool checkCertainState();
};

পরীক্ষার সহায়ক শ্রেণি:

class TestHelperProdObj : public ProdObj
{
  ...
  public:
     virtual bool checkCertainState() { return ProdObj::checkCertainState(); }
};

এইভাবে, আপনি কমপক্ষে এমন অবস্থানে রয়েছেন যেখানে আপনাকে আপনার প্রধান অবজেক্টে 'পরীক্ষা' টাইপ ফাংশন প্রকাশ করতে হবে না।


একটি আকর্ষণীয় পদ্ধতির। আমি এটি কীভাবে খাপ
খাইয়ে নেব

3

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

পরীক্ষা করা গুরুত্বপূর্ণ, যদি প্রয়োজন হয় তবে এর জন্য কিছু যুক্ত করুন।

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

আপনার প্রসঙ্গে আপনি সাজসজ্জারের মধ্যে সঠিক রচনাটি পরীক্ষা না করার সিদ্ধান্ত নিতে পারেন, তবে সজ্জায় থাকা প্রত্যাশিত আচরণটি পরীক্ষা করতে পারেন। এটি সম্ভবত প্রত্যাশিত সিস্টেমের আচরণের দিকে আরও বেশি মনোযোগ দেবে এবং প্রযুক্তিগত স্পেসিফিকেশনে এতটা নয় (ডেকোরেটর প্যাটার্ন আপনাকে কার্যক্ষম দৃষ্টিকোণ থেকে কী কিনে?)


1

আমি একেবারে টিডিডি নবাগত, তবে মনে হচ্ছে এটি পদ্ধতিটি যুক্ত হওয়ার উপর নির্ভর করে। আমি টিডিডি সম্পর্কে যা বুঝি, সেগুলি থেকে আপনার পরীক্ষাগুলি আপনার এপিআই তৈরির কিছুটা ডিগ্রী "চালনা" করার কথা।

যখন এটি ঠিক আছে:

  • যতক্ষণ না পদ্ধতিটি এনক্যাপসুলেশনটি ভেঙে না ফেলে এবং অবজেক্টের দায়বদ্ধতার সাথে সঙ্গতিপূর্ণ এমন কোনও উদ্দেশ্য করে।

যখন এটি ঠিক না:

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