উপহাস কি খোলা / বন্ধ নীতি লঙ্ঘন করে?


13

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

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

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

আমার প্রশ্নগুলি হবে:

  1. উপহাস কি খোলা / বন্ধ নীতি লঙ্ঘন করে?
  2. শেষ অনুচ্ছেদে স্টাবগুলির পক্ষে যুক্তিতে কিছু গায়েব আছে যা স্টাবগুলি এত দুর্দান্ত বনাম উপহাস করে না?
  3. যদি তা হয়, কখন উপহাস করার জন্য ভাল ব্যবহারের পরিস্থিতি হবে এবং কখন স্টাব ব্যবহার করার জন্য ভাল ব্যবহারের ক্ষেত্রে হবে?


8
Since mocking relays heavily on expectation calls from system under test's dependencies...আমি মনে করি আপনি যেখানে অস্থির হয়ে যাচ্ছেন এখানেই। মক হ'ল বাহ্যিক পদ্ধতির কিছু কৃত্রিম উপস্থাপনা। এটি বাহ্যিক সিস্টেমকে কোনও উপায়েই উপস্থাপন করে না, ইনসোফার ব্যতীত যেমন এটি বাহ্যিক সিস্টেমকে এমনভাবে অনুকরণ করে যা বলেছিল যে বাহ্যিক সিস্টেমে নির্ভরতা থাকা কোডের বিরুদ্ধে পরীক্ষা চালানো যেতে পারে। আপনার কোডটি বাস্তব, আনমকড সিস্টেমের
রবার্ট হার্ভে

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

3
"অন্য কথায়, পদ্ধতিটি যদি কাজ না করে তবে একটি পরীক্ষা ব্যর্থ হওয়া উচিত, তবে বাস্তবায়ন পরিবর্তিত হওয়ার কারণে নয়", এটি সর্বদা সত্য নয়। প্রচুর পরিস্থিতিতে রয়েছে যেখানে আপনার বাস্তবায়ন এবং পরীক্ষা উভয়ই পরিবর্তন করা উচিত।
কিসস

উত্তর:


4
  1. আমি দেখতে পাচ্ছি না যে বিদ্রূপগুলি উন্মুক্ত / বদ্ধ নীতি লঙ্ঘন করবে। আপনি যদি তাদের কেন মনে করেন তা যদি আপনি আমাদের ব্যাখ্যা করতে পারেন তবে আমরা আপনার উদ্বেগগুলি হ্রাস করতে সক্ষম হতে পারি।

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

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

দ্রষ্টব্য ব্যক্তি আপনি উল্লেখ করা হয় আমাকে হয়েছে থাকতে পারে আমার অন্যান্য পরীক্ষামূলক সংক্রান্ত উত্তর programmers.stackexchange.com এখানে এক, উদাহরণস্বরূপ এই এক


an alternative implementation would be a full-blown in-memory RDBMS- অগত্যা আপনাকে স্টাব দিয়ে এতদূর যেতে হবে না।
রবার্ট হার্ভে

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

9
  1. ওপেন / ক্লোজড নীতিটি বেশিরভাগই কোনও শ্রেণীর পরিবর্তন না করেই আচরণের পরিবর্তন করতে সক্ষম হওয়া সম্পর্কে। অতএব, পরীক্ষার অধীনে কোনও শ্রেণির মধ্যে একটি উপহাস উপাদান নির্ভরতা ইনজেকশন এটি লঙ্ঘন করে না।

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

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


6

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

আমি নিশ্চিত নই যে আপনি কেন মনে করেন যে sensক্যমত্য স্টাব ব্যবহার করবে, উদাহরণস্বরূপ এটি মকিতো ডকুমেন্টেশনের ঠিক বিপরীত

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

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

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


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

2

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

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

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

টিএল / ডঃ এটি "বইয়ের দ্বারা" করা ভাল, তবে যখন ধাক্কা খেয়ে আসে, শুক্রবারের মধ্যে আপনার বসের ডেস্কে একটি পণ্য রাখা বুক-বুক টেস্ট স্যুটের চেয়ে বেশি দরকারী যা গ্রীষ্মের উত্তাপজনিত মৃত্যুর আগ পর্যন্ত লাগে মহাবিশ্ব কনফরমেশন নিশ্চিত করতে।

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