আপডেট সেপ্টেম্বর 2019: স্প্রিং বুটের দ্বারা সমর্থিত একমাত্র মশকরা ফ্রেমওয়ার্ক হ'ল মকিতো । আপনি যদি বসন্ত ব্যবহার করেন তবে উত্তরটি বেশ স্পষ্ট।
আমি বলব প্রতিযোগিতাটি জোকিমিট এবং পাওয়ারমকের মধ্যে , তারপরে মকিতো ।
আমি "সরল" jMock এবং EasyMock ছেড়ে যাব কারণ তারা কেবল প্রক্সি এবং সিজিএলআইবি ব্যবহার করে এবং জাভা 5 ইনস্ট্রুমেন্টটি নতুন ফ্রেমওয়ার্কগুলির মতো ব্যবহার করে না।
jMock 4 বছরেরও বেশি সময় ধরে স্থিতিশীল প্রকাশ পায় নি। আরএম 1 থেকে আরসি 2 এ যেতে jMock 2.6.0 এর জন্য 2 বছর প্রয়োজন ছিল এবং তারপরে এটি প্রকাশিত হওয়ার আরও 2 বছর আগে।
প্রক্সি এবং সিজিএলআইবি বনাম উপকরণ সম্পর্কিত:
(ইজিমক এবং জেমক) java.lang.reflect.Proxy এর উপর ভিত্তি করে তৈরি করা হয়েছে, যার প্রয়োগ করার জন্য একটি ইন্টারফেস প্রয়োজন। অধিকন্তু, তারা সিজিএলআইবি সাবক্লাস জেনারেশনের মাধ্যমে ক্লাসগুলির জন্য মক অবজেক্ট তৈরির পক্ষে সমর্থন করে। এ কারণে, ক্লাসগুলি চূড়ান্ত হতে পারে না এবং কেবলমাত্র ওভাররিডযোগ্য উদাহরণ পদ্ধতিগুলি উপহাস করা যায়। সবচেয়ে গুরুত্বপূর্ণ, তবে, এই সরঞ্জামগুলি ব্যবহার করার সময় পরীক্ষার অধীনে কোডের নির্ভরতা (যা অন্যান্য শ্রেণীর অবজেক্টগুলি যার উপর পরীক্ষা দেওয়া হয় এমন শ্রেণি নির্ভর করে) অবশ্যই পরীক্ষাগুলি দ্বারা নিয়ন্ত্রণ করা উচিত, যাতে মক দৃষ্টান্তগুলি ক্লায়েন্টদের কাছে যেতে পারে যারা নির্ভরতা। অতএব, নির্ভরতা কেবল ক্লায়েন্ট শ্রেণিতে নতুন অপারেটরের সাথে ইনস্ট্যান্ট করা যায় না যার জন্য আমরা ইউনিট পরীক্ষা লিখতে চাই।
শেষ পর্যন্ত, প্রচলিত উপহাস সরঞ্জামগুলির প্রযুক্তিগত সীমাবদ্ধতাগুলি উত্পাদন কোডে নিম্নলিখিত নকশার সীমাবদ্ধতা আরোপ করে:
- পরীক্ষায় ঠাট্টা-বিদ্রূপ করার প্রয়োজন হতে পারে এমন প্রতিটি শ্রেণীর একটি পৃথক ইন্টারফেস প্রয়োগ করতে হবে বা চূড়ান্ত হওয়া উচিত নয়।
- পরীক্ষার জন্য প্রতিটি শ্রেণীর নির্ভরতা হয় কনফিগারযোগ্য উদাহরণ তৈরি পদ্ধতি (কারখানা বা কোনও সার্ভিস লোকেটার) এর মাধ্যমে পাওয়া উচিত, বা নির্ভরতা ইনজেকশনের জন্য উন্মুক্ত করা উচিত। অন্যথায়, ইউনিট পরীক্ষাগুলি পরীক্ষার অধীনে ইউনিটের উপর নির্ভরশীলতার মক প্রয়োগগুলি পাস করতে সক্ষম হবে না।
- যেহেতু শুধুমাত্র উদাহরণের পদ্ধতিগুলি উপহাস করা যায়, তাই ইউনিট পরীক্ষার জন্য ক্লাসগুলি তাদের নির্ভরতার উপর কোনও স্থিতিশীল পদ্ধতি কল করতে পারে না, বা কোনও নির্মাণকারী ব্যবহার করে তা ইনস্ট্যান্ট করতে পারে না।
উপরেরটি http://jmockit.org/about.html থেকে অনুলিপি করা হয়েছে । আরও, এটি নিজের (জেমকিত), পাওয়ারমক এবং মকিতোকে বিভিন্ন উপায়ে তুলনা করে:
জাভার জন্য এখন অন্যান্য উপহাসের সরঞ্জাম রয়েছে যা প্রচলিতগুলির সীমাবদ্ধতাগুলিও অতিক্রম করে, তাদের মধ্যে পাওয়ারমক, জেসিস্টেস্ট এবং মকআইজেক্ট। জেমকিতের ফিচার সেটের সবচেয়ে কাছাকাছি আসাটি হ'ল পাওয়ারমক, সুতরাং আমি এখানে সংক্ষেপে এটি মূল্যায়ন করব (এ ছাড়া, অন্য দুটি আরও সীমাবদ্ধ এবং সক্রিয়ভাবে আর বিকাশিত বলে মনে হয় না)।
জেমকিত বনাম পাওয়ারমক
- প্রথমত, পাওয়ারমক বিদ্রূপের জন্য একটি সম্পূর্ণ এপিআই সরবরাহ করে না, পরিবর্তে অন্য সরঞ্জামে এক্সটেনশন হিসাবে কাজ করে যা বর্তমানে ইজিমক বা মকিতো হতে পারে। এটি অবশ্যই সেই সরঞ্জামগুলির বিদ্যমান ব্যবহারকারীদের জন্য একটি সুবিধা।
- অন্যদিকে, জেএমকিত সম্পূর্ণ নতুন এপিআই সরবরাহ করে, যদিও এর মূল এপিআই (প্রত্যাশা) ইজিমক এবং জেমক উভয়ের সমান। যদিও এটি দীর্ঘতর লার্নিং কার্ভ তৈরি করে, এটি জেএমকিতকে একটি সহজ, আরও সুসংগত এবং সহজে API ব্যবহারের সুযোগ দেয়।
- জেমকিত প্রত্যাশা এপিআইয়ের তুলনায়, পাওয়ারমক এপিআই আরও "নিম্ন-স্তরের", ব্যবহারকারীদের পরীক্ষার জন্য কোন ক্লাস প্রস্তুত করার প্রয়োজন তা নির্দিষ্ট করতে বাধ্য করে (@ প্রিপার্পেয়ারটেষ্ট ({ClassA.class, ...}) টীকা সহ ) এবং উত্পাদন কোডে উপস্থিত হতে পারে এমন বিভিন্ন ধরণের ভাষা নির্মানের সাথে মোকাবিলা করার জন্য নির্দিষ্ট এপিআই কলগুলির প্রয়োজন: স্থির পদ্ধতি (মকস্ট্যাটিক (ClassA.class)), নির্মাণকারী (দমন (কনস্ট্রাক্টর (ClassXyz.class))), কনস্ট্রাক্টর আহ্বান ( প্রত্যাশী নতুন (AClass.class), আংশিক mock (createPartialMock (ClassX.class, "মেথডোমক")) ইত্যাদি)
- জেমকিত প্রত্যাশার সাথে, সমস্ত ধরণের পদ্ধতি এবং নির্মাতাকে বিশুদ্ধভাবে ঘোষিত উপায়ে ঠাট্টা-বিদ্রূপ করা হয়, নিয়মিত প্রকাশের মাধ্যমে @ মস্কৃত টীকায়নের মাধ্যমে বা সদস্যদের কোনভাবেই রেকর্ড করা প্রত্যাশা ছাড়াই কেবল "আন-বিদ্রূপ" দ্বারা নির্দিষ্ট করা হয়; এটি হ'ল বিকাশকারী পরীক্ষার শ্রেণীর জন্য কিছু ভাগ করে নেওয়া "মক ফিল্ডস" বা স্বতন্ত্র পরীক্ষার পদ্ধতিগুলির জন্য কিছু "স্থানীয় মক ক্ষেত্র" এবং / অথবা "মক প্যারামিটার" ঘোষণা করে (এবং এই শেষের ক্ষেত্রে @ মকড টীকাগুলি প্রায়শই তা করবে না প্রয়োজন)।
- জেএমকিত-এ কিছু উপলব্ধ ক্ষমতা যেমন মক্কের সমতুল্য এবং হ্যাশকোড, ওভাররাইড পদ্ধতি এবং অন্যদের জন্য সমর্থন বর্তমানে পাওয়ারমকটিতে সমর্থিত নয়। এছাড়াও, পরীক্ষার কার্য সম্পাদন হিসাবে নির্দিষ্ট বেস প্রকারের দৃষ্টান্তগুলি এবং মক প্রয়োগগুলিকে ক্যাপচার করার জেএমকিতের ক্ষমতার সমতুল্য নেই, পরীক্ষার কোডটি সত্যিকারের বাস্তবায়ন ক্লাস সম্পর্কে কোনও জ্ঞান না রেখে।
- পাওয়ারমক উপহাসকৃত ক্লাসগুলির পরিবর্তিত সংস্করণ উত্পন্ন করার জন্য কাস্টম শ্রেণির লোডারগুলি (সাধারণত পরীক্ষার শ্রেণিতে প্রতিটি) ব্যবহার করে। কাস্টম শ্রেণীর লোডারগুলির এইরকম ভারী ব্যবহার তৃতীয় পক্ষের লাইব্রেরিগুলির সাথে দ্বন্দ্বের জন্ম দিতে পারে, তাই পরীক্ষার ক্লাসগুলিতে মাঝে মধ্যে @ পাওয়ারমকআইগনোর ("package.to.be.ignored") টিকা ব্যবহার করার প্রয়োজন হয়।
- জেএমকিট (একটি "জাভা এজেন্ট" মাধ্যমে রানটাইম উপকরণ) দ্বারা ব্যবহৃত পদ্ধতিটি সহজ এবং নিরাপদ, যদিও এটি জেডিএম 1.5 তে বিকাশকালে জেভিএমের "-জাভাজনেন্ট" পরামিতিটি পাস করার প্রয়োজন হয় না; জেডিকে ১.6++ তে (যা সর্বদা উন্নয়নের জন্য ব্যবহার করা যেতে পারে, এমনকি এটি পুরানো সংস্করণে প্রযোজ্য হলেও) এরকম কোনও প্রয়োজন নেই, যেহেতু জেমকিত সংযুক্তি এপিআই ব্যবহার করে জাভা এজেন্টকে স্বচ্ছভাবে চাহিদা অনুযায়ী লোড করতে পারে।
সাম্প্রতিক আর একটি উপহাসের সরঞ্জাম হ'ল মকিতো। যদিও এটি পুরানো সরঞ্জামগুলির সীমাবদ্ধতা (jMock, EasyMock) কাটিয়ে উঠার চেষ্টা করে না, তবুও এটি উপহাসের সাথে আচরণের পরীক্ষা করার একটি নতুন স্টাইল প্রবর্তন করে। জেএমকিতও এই বিকল্প শৈলীটি যাচাইকরণ API এর মাধ্যমে সমর্থন করে।
জেমকিত বনাম মকিতো
- রেকর্ডের (যখন (...)) এবং যাচাইকরণ (যাচাইকরণ (...)) এর মধ্যে কোড পৃথক করার জন্য মকিতো তার এপিআই-তে স্পষ্ট কলগুলিতে নির্ভর করে। এর অর্থ হল পরীক্ষার কোডে কোনও মক অবজেক্টের যে কোনও আহ্বানের জন্য মকিং এপিআইতে কল প্রয়োজন হবে। অতিরিক্তভাবে, এটি যখন (...) এবং যাচাই (মক) ... কলগুলি পুনরাবৃত্তি করতে পারে।
- জেমকিতের সাথে, অনুরূপ কোনও কল উপস্থিত নেই। অবশ্যই, আমাদের কাছে নতুন নন-স্ট্রাইকএক্সপ্যাক্টিকেশনস () এবং নতুন যাচাইকরণ () কনস্ট্রাক্টর কল রয়েছে তবে সেগুলি পরীক্ষায় একবার (সাধারণত) ঘটে এবং তা বিদ্রূপ পদ্ধতি এবং কনস্ট্রাক্টরের কাছে আমন্ত্রণ থেকে সম্পূর্ণ পৃথক।
- মকিতো এপিআইতে উপহাসের পদ্ধতিগুলিতে অনুরোধের জন্য ব্যবহৃত সিনট্যাক্সে বেশ কয়েকটি অসঙ্গতি রয়েছে। রেকর্ড পর্যায়ে, আমাদের কাছে যখন কল হয়েছে (মক.মকডমথোড (আরগস)) ... যাচাইকরণের পর্যায়ে এই একই কলটি যাচাই (মক) .মোকড ম্যাথোড (আরগস) হিসাবে লেখা হবে। লক্ষ্য করুন যে প্রথম ক্ষেত্রে উপহাসকৃত ম্যাথোডে আমন্ত্রণ সরাসরি মক অবজেক্টে করা হয়, অন্য ক্ষেত্রে এটি যাচাই (মোকার) দ্বারা ফেরত বস্তুর উপর করা হয়।
- জেএমকিতের তেমন কোনও অসঙ্গতি নেই কারণ উপহাসের পদ্ধতিগুলিতে আমন্ত্রণগুলি সর্বদা মশকরা দৃষ্টান্তগুলিতে সরাসরি করা হয়। (কেবলমাত্র একটি ব্যতিক্রম সহ: একই বিদ্রূপিত দৃষ্টিতে অনুরোধের সাথে মিল রাখতে, একটি onInstance (মক) কল ব্যবহার করা হয়, যার ফলে onInstance (mock) .mockMethod (আরগস) এর মতো কোড হয়; তবে বেশিরভাগ পরীক্ষাগুলি এটি ব্যবহারের প্রয়োজন হবে না। )
- অন্য উপহাসের সরঞ্জামগুলির মতো যা পদ্ধতিতে শৃঙ্খলাবদ্ধ / মোড়কের উপরে নির্ভর করে, শূন্য পদ্ধতিতে স্ট্যাবি করার সময় মকিতোও বেমানান সিনট্যাক্সে চলে। উদাহরণস্বরূপ, আপনি যখন লিখেছেন (মকোডলিস্ট.জেট (1)) তারপর থ্রো করুন (নতুন রানটাইম এক্সেকশন ()); একটি অ-শূন্য পদ্ধতি এবং doThrow (নতুন রানটাইম এক্সেকশন ()) এর জন্য when একটি অকার্যকর জন্য। জেমকিতের সাথে এটি সর্বদা একই বাক্য গঠন: মকডলিস্টক্লিয়ার (); ফলাফল = নতুন রানটাইম এক্সেকশন ();।
- তবুও মকিতো গুপ্তচরদের ব্যবহারের ক্ষেত্রে আরও একটি অসঙ্গতি দেখা দেয়: "মকস" যা গুপ্তচর দৃষ্টিতে বাস্তব পদ্ধতিগুলি কার্যকর করতে দেয়। উদাহরণস্বরূপ, যদি গুপ্তচর একটি ফাঁকা তালিকাকে বোঝায়, তারপরে লেখার পরিবর্তে (স্পাই.জেট (0)) .পরে রিটার্ন ("foo") আপনাকে doReturn ("foo") লিখতে হবে। যখন (গুপ্তচর)। 0)। জেমকিতের সাহায্যে গতিশীল বিদ্রূপ বৈশিষ্ট্যটি গুপ্তচরদের অনুরূপ কার্যকারিতা সরবরাহ করে, তবে এই সমস্যাটি ছাড়াই বাস্তব পদ্ধতিগুলি কেবল রিপ্লে পর্যায়ে কার্যকর করা হয় during
- ইজিমোক এবং জেমক, জাভার জন্য প্রথম বিদ্রূপকারী এপিআইগুলিতে, মোক অবজেক্টগুলির জন্য (পূর্বনির্ধারিতভাবে) অপ্রত্যাশিত নিমন্ত্রণগুলি মঞ্জুরি দেয় না এমন জোক পদ্ধতিগুলির প্রত্যাশিত অনুরোধগুলির রেকর্ডিংয়ের উপর পুরোপুরি দৃষ্টি নিবদ্ধ ছিল। সেই এপিআইগুলি এমন মক অবজেক্টগুলির জন্য অনুমোদিত আমন্ত্রণগুলির রেকর্ডিং সরবরাহ করে যা অপ্রত্যাশিত নিমন্ত্রণগুলি মঞ্জুরি দেয় তবে এটি দ্বিতীয় শ্রেণীর বৈশিষ্ট্য হিসাবে বিবেচিত হয়েছিল। অধিকন্তু, এই সরঞ্জামগুলির সাহায্যে পরীক্ষার অধীনে কোডটি প্রয়োগ করার পরে বিদ্রূপগুলিতে স্পষ্টভাবে আমন্ত্রণগুলি যাচাই করার কোনও উপায় নেই। এই জাতীয় সমস্ত যাচাই স্পষ্টভাবে এবং স্বয়ংক্রিয়ভাবে সঞ্চালিত হয়।
- মকিতোতে (এবং ইউনিটিলস মোকতেও), বিপরীত দৃষ্টিভঙ্গি নেওয়া হয়। পরীক্ষার সময় যে বস্তুগুলি ঘটতে পারে তা বিদ্রূপ করার সমস্ত আহ্বানগুলি রেকর্ড করা আছে কি না, অনুমোদিত, কখনও প্রত্যাশিত নয়। পরীক্ষার অধীনে কোডটি প্রয়োগ করার পরে যাচাইকরণ স্পষ্টভাবে সম্পাদিত হয়, স্বয়ংক্রিয়ভাবে কখনই না।
- উভয় পন্থা অত্যন্ত চরম এবং ফলস্বরূপ অনুকূল থেকে কম। জেমকিত প্রত্যাশা ও যাচাইকরণগুলি এমন একমাত্র এপিআই যা বিকাশকারীকে প্রতিটি পরীক্ষার জন্য নির্বিঘ্নে কঠোর (ডিফল্ট দ্বারা প্রত্যাশিত) এবং অ-কঠোর (ডিফল্টরূপে অনুমোদিত) মক অনুরোধের সর্বোত্তম সমন্বয় চয়ন করতে দেয় choose
- আরও স্পষ্ট করে বলার জন্য, মকিতো এপিআই-র নীচের সমস্যা রয়েছে। যদি আপনাকে যাচাই করা দরকার যে পরীক্ষার সময় একটি শূন্য-বিহীন বিদ্রূপ পদ্ধতিতে একটি অনুরোধ ঘটেছে, তবে পরীক্ষার জন্য সেই পদ্ধতি থেকে ফেরতের মান প্রয়োজন যা প্রত্যাবর্তনের ধরণের জন্য ডিফল্ট থেকে আলাদা হয়, তবে মকিতো পরীক্ষায় সদৃশ কোড থাকবে: একটি যখন (mock.someMethod ()) .তখন রেকর্ড পর্বে পুনরায় (xyz) কল এবং যাচাইকরণের পর্যায়ে একটি যাচাই (মক) .সোমমঠোড () জেমকিতের সাথে, একটি কঠোর প্রত্যাশা সর্বদা রেকর্ড করা যায়, যা স্পষ্টভাবে যাচাই করতে হবে না। বিকল্পভাবে, কোনও আহ্বান গণনার সীমাবদ্ধতা (বার = 1) কোনও রেকর্ডকৃত অ-কঠোর প্রত্যাশার জন্য নির্দিষ্ট করা যেতে পারে (মকিতো সহ এ জাতীয় সীমাবদ্ধতা কেবলমাত্র একটি যাচাই (মক, সীমাবদ্ধতা কল) এ নির্দিষ্ট করা যেতে পারে)।
- ক্রমানুসারে যাচাইকরণের জন্য এবং সম্পূর্ণ যাচাইয়ের জন্য মকিতোর দুর্বল সিনট্যাক্স রয়েছে (এটি যা উপহাসের জন্য সমস্ত অনুরোধগুলি সুস্পষ্টভাবে যাচাই করা হয়েছে তা যাচাই করে)। প্রথম ক্ষেত্রে, একটি অতিরিক্ত অবজেক্ট তৈরি করা দরকার, এবং এটিতে যাচাই করার জন্য কল করা হয়: InOrder inOrder = inOrder (mock1, mock2, ...)। দ্বিতীয় ক্ষেত্রে, যাচাইকরণমোরইন্ট্রেকশনস (মক) বা যাচাইকরণজিরো ইন্টারন্টেকশনস (মক 1, মক 2) এর মতো কল করা দরকার।
- জেমকিতের সাহায্যে আপনি কেবল নতুন যাচাইকরণের পরিবর্তে নতুন ভেরিফিকেশনসইনআর্ডার () বা নতুন ফুলওয়ারিফিকেশন () লিখুন (বা উভয় প্রয়োজনীয়তা একত্রিত করার জন্য নতুন ফুলওয়ারিফিকেশনআইনআর্ডার ())। কোন মক অবজেক্ট জড়িত তা নির্দিষ্ট করার দরকার নেই। কোনও অতিরিক্ত উপহাস API কল নেই। এবং একটি বোনাস হিসাবে, একটি আদেশযুক্ত যাচাইকরণ ব্লকের অভ্যন্তরে যাচাই করা না হওয়া () যাচাইকরণের মাধ্যমে আপনি অর্ডার-সংক্রান্ত যাচাইকরণগুলি করতে পারেন যা মকিতোতে কেবল অসম্ভব।
পরিশেষে, একটি সম্পূর্ণ এবং পরিশীলিত বিকাশকারী পরীক্ষার সমাধান সরবরাহ করার জন্য জেএমকিট টেস্টিং টুলকিটটির বিদ্রূপকারী অন্যান্য সরঞ্জামকিটগুলির চেয়ে বিস্তৃত সুযোগ এবং আরও উচ্চাকাঙ্ক্ষী লক্ষ্য রয়েছে। কৃত্রিম সীমাবদ্ধতা ব্যতীত বিদ্রূপের জন্য একটি ভাল এপিআই পরীক্ষামূলক উত্পাদনশীল সৃষ্টির জন্য পর্যাপ্ত নয়। একটি আইডিই-অজোনস্টিক, সহজেই ব্যবহারযোগ্য, এবং ভাল সংহত কোড কভারেজ সরঞ্জামটিও অপরিহার্য এবং জেমকিত কভারেজ প্রদানের লক্ষ্যটি। বিকাশকারী টেস্টিং টুলসেটের আরেকটি অংশ যা পরীক্ষার স্যুট আকারে বাড়ার সাথে সাথে আরও দরকারী হয়ে উঠবে তা হ'ল উত্পাদন কোডে স্থানীয় পরিবর্তনের পরে পরীক্ষাগুলি পুনরায় চালনার ক্ষমতা; এটিও কভারেজ সরঞ্জামের অন্তর্ভুক্ত।
(অনুমোদিত, উত্স পক্ষপাতদুষ্ট হতে পারে, তবে ভাল ...)
আমি জেমকিতের সাথে যেতে চাই । এটি ব্যবহার করা সবচেয়ে সহজ, নমনীয় এবং আপনি যখন ক্লাস পরীক্ষা করার জন্য ক্লাসকে নিয়ন্ত্রণ করতে না পারেন (বা সামঞ্জস্যের কারণে আপনি এটি ভেঙে ফেলতে পারেন না) তখন এমনকি সমস্ত ক্ষেত্রে এমনকি জটিল এবং পরিস্থিতিগুলির পক্ষেও কাজ করে।
জেমকিতের সাথে আমার অভিজ্ঞতাগুলি খুব ইতিবাচক হয়েছে।