জাভাতে মক অবজেক্ট তৈরির সেরা ফ্রেমওয়ার্ক কী? কেন? প্রতিটি কাঠামোর পক্ষে কি কি?
জাভাতে মক অবজেক্ট তৈরির সেরা ফ্রেমওয়ার্ক কী? কেন? প্রতিটি কাঠামোর পক্ষে কি কি?
উত্তর:
আমি মকিতো ব্যবহার করে ভাল সাফল্য পেয়েছি ।
আমি যখন জেমক এবং ইজিমক সম্পর্কে শেখার চেষ্টা করেছি, আমি শিখনের বক্ররেখাটি কিছুটা খাড়া হয়ে উঠলাম (যদিও এটি কেবলমাত্র আমার)।
আমি মকিতোকে তার সহজ এবং পরিষ্কার বাক্য বাক্সের কারণে পছন্দ করি যা আমি খুব দ্রুত উপলব্ধি করতে সক্ষম হয়েছি। ন্যূনতম সিনট্যাক্সটি সাধারণ কেসগুলিকে খুব ভালভাবে সমর্থন করার জন্য ডিজাইন করা হয়েছে, যদিও আরও কয়েকবার আমাকে আরও জটিল করার দরকার হয়েছিল আমি খুঁজে পেলাম আমি যা চেয়েছিলাম তা সমর্থনযোগ্য এবং উপলব্ধি করা সহজ।
এখানে মকিতো হোমপেজ থেকে একটি (সংক্ষিপ্ত) উদাহরণ রয়েছে:
import static org.mockito.Mockito.*;
List mockedList = mock(List.class);
mockedList.clear();
verify(mockedList).clear();
এটি এর চেয়ে সহজ কিছু পায় না।
আমি কেবলমাত্র বড় ক্ষতি সম্পর্কে ভাবতে পারি তা হ'ল এটি স্থির পদ্ধতিগুলিকে ঠাট্টা করবে না।
আমি পাওয়ারমকের স্রষ্টা তাই স্পষ্টতই আমার এটি সুপারিশ করতে হবে! :-)
স্থির পদ্ধতি , চূড়ান্ত এবং এমনকি ব্যক্তিগত পদ্ধতিগুলি উপহাস করার ক্ষমতা সহ পাওয়ারজক ইজিমক এবং মকিতো উভয়কেই প্রসারিত করে। ইজিমক সমর্থনটি সম্পূর্ণ, তবে মকিতো প্লাগইনটির আরও কিছু কাজ প্রয়োজন। আমরা পাশাপাশি জেমক সমর্থন যুক্ত করার পরিকল্পনা করছি।
পাওয়ারমক অন্য ফ্রেমওয়ার্কগুলি প্রতিস্থাপনের উদ্দেশ্যে নয়, বরং অন্যান্য কৌশলগুলি যখন ঠাট্টা-বিদ্রূপের অনুমতি দেয় না তখন এটি জটিল পরিস্থিতিতে ব্যবহার করা যেতে পারে। পাওয়ারমকটিতে অন্যান্য কার্যকর বৈশিষ্ট্যও রয়েছে যেমন স্ট্যাটিক ইনিশিয়ালাইজার এবং কনস্ট্রাক্টর দমন করা ।
JMockit প্রকল্পের সাইটে বর্তমান বিদ্রূপকারী টুলকিট জন্য তুলনামূলক তথ্য প্রচুর রয়েছে।
বিশেষত, বৈশিষ্ট্য তুলনা ম্যাট্রিক্স পরীক্ষা করে দেখুন , যা ইজিমক, জেমক, মকিতো, ইউনিটিলস মক, পাওয়ারমক এবং অবশ্যই জেমকিতকে অন্তর্ভুক্ত করে। আমি যথাসম্ভব যথাযথ এবং আপ টু ডেট রাখার চেষ্টা করি।
আমি জেমকিতের সাথে সাফল্য পেয়েছি ।
এটি বেশ নতুন, এবং তাই এটি কিছুটা কাঁচা এবং ডকুমেন্টেড। এটি এএসএম ব্যবহার করে ক্লাস বাইটকোডকে গতিশীলভাবে নতুনভাবে সংজ্ঞায়িত করতে পারে, যাতে এটি স্ট্যাটিক, প্রাইভেট, কনস্ট্রাক্টর এবং স্ট্যাটিক ইনিশিয়েলজার সহ সমস্ত পদ্ধতিকে উপহাস করতে পারে। উদাহরণ স্বরূপ:
import mockit.Mockit;
...
Mockit.redefineMethods(MyClassWithStaticInit.class,
MyReplacementClass.class);
...
class MyReplacementClass {
public void $init() {...} // replace default constructor
public static void $clinit{...} // replace static initializer
public static void myStatic{...} // replace static method
// etc...
}
এটিতে একটি প্রত্যাশা ইন্টারফেস রয়েছে যা রেকর্ড / প্লেব্যাকের পরিস্থিতিতেও অনুমতি দেয়:
import mockit.Expectations;
import org.testng.annotations.Test;
public class ExpecationsTest {
private MyClass obj;
@Test
public void testFoo() {
new Expectations(true) {
MyClass c;
{
obj = c;
invokeReturning(c.getFoo("foo", false), "bas");
}
};
assert "bas".equals(obj.getFoo("foo", false));
Expectations.assertSatisfied();
}
public static class MyClass {
public String getFoo(String str, boolean bool) {
if (bool) {
return "foo";
} else {
return "bar";
}
}
}
}
খারাপ দিকটি এটির জন্য জাভা 5/6 প্রয়োজন।
গ্রোভিকে ব্যবহার করে আপনিও পরীক্ষা করতে পারেন। গ্রোভিতে আপনি 'হিসাবে' অপারেটরটি ব্যবহার করে জাভা ইন্টারফেসগুলি সহজেই উপহাস করতে পারেন:
def request = [isUserInRole: { roleName -> roleName == "testRole"}] as HttpServletRequest
এই বেসিক কার্যকারিতা ছাড়াও গ্রোভি শক্তিশালী MockFor
এবং StubFor
শ্রেণি সহ মজাদার ফ্রন্টে আরও অনেক কিছু সরবরাহ করে ।
আমি ইজিমক দিয়ে মক ব্যবহার শুরু করি । বুঝতে যথেষ্ট সহজ, তবে রিপ্লে পদক্ষেপটি ছিল বিরক্তিকর। Mockito এটিকে সরিয়ে দেয়, ক্লিনার সিনট্যাক্সও রয়েছে কারণ দেখে মনে হচ্ছে পাঠযোগ্যতা তার প্রাথমিক লক্ষ্যগুলির মধ্যে একটি ছিল। এটি কতটা গুরুত্বপূর্ণ তা আমি যথেষ্ট চাপ দিতে পারি না, যেহেতু বেশিরভাগ বিকাশকারী তাদের বিদ্যমান কোডটি পড়া এবং বজায় রাখতে তাদের সময় ব্যয় করবে, এটি তৈরি করে না not
আরেকটি সুন্দর বিষয় হ'ল ইজি ইন্টারফেস এবং বাস্তবায়ন ক্লাসগুলি একইভাবে পরিচালনা করা হয়, ইজিমকের মতো নয় যেখানে এখনও আপনাকে ইজিমক ক্লাস এক্সটেনশনটি ব্যবহার করার জন্য মনে রাখা (এবং পরীক্ষা করা) দরকার।
আমি জেএমকিতকে এক ঝলক দেখেছি সাম্প্রতিক , এবং বৈশিষ্ট্যগুলির লন্ড্রি তালিকা বেশ বিস্তৃত হলেও, আমি মনে করি যে এর দাম ফলাফলের কোডের সুসংগঠন, এবং আরও লিখতে হবে।
আমার জন্য, মকিতো মিষ্টি স্পটটি হিট করে, লিখতে এবং পড়তে সহজ হতে এবং বেশিরভাগ কোডের জন্য প্রয়োজন পরিস্থিতিতে বেশিরভাগ ক্ষেত্রেই আচরণ করে। ব্যবহার Mockito সঙ্গে PowerMock আমার পছন্দ হবে।
একটি বিষয় বিবেচনা করার বিষয় হ'ল আপনি যে সরঞ্জামটি নিজের দ্বারা বিকাশ করছেন বা একটি ছোট টাইট-বুনন দলে আপনি বেছে নিতে পারেন তা বিভিন্ন দক্ষতার স্তরের বিকাশকারীদের সাথে কোনও বৃহত সংস্থার পক্ষে পাওয়া সবচেয়ে ভাল নাও হতে পারে। পাঠযোগ্যতা, ব্যবহারের সহজতা এবং সরলতার জন্য পরবর্তী ক্ষেত্রে আরও বিবেচনা করা দরকার। যদি প্রচুর লোক এটি ব্যবহার না করে বা পরীক্ষাগুলি বজায় না রাখে তবে চূড়ান্ত উপহাসের কাঠামো পাওয়ার কোনও বুদ্ধি নেই।
আমরা কর্মক্ষেত্রে ইজিমক এবং ইজিমক ক্লাস এক্সটেনশনটি ভারী ব্যবহার করছি এবং এটিতে বেশ খুশি। এটি মূলত আপনাকে প্রয়োজনীয় সমস্ত কিছু দেয়। ডকুমেন্টেশনটি একবার দেখুন, খুব সুন্দর উদাহরণ রয়েছে যা আপনাকে ইজিমকের সমস্ত বৈশিষ্ট্য দেখায়।
আমি জেএমককে প্রথম দিকে ব্যবহার করেছি used আমি আমার শেষ প্রজেক্টে মকিতো চেষ্টা করেছি এবং পছন্দ করেছি। আরও সংক্ষিপ্ত, আরও পরিষ্কার। পাওয়ারমক এমন সমস্ত প্রয়োজনীয়তা কভার করে যা মকিতোতে অনুপস্থিত, যেমন একটি স্ট্যাটিক কোডকে ঠাট্টা করা, উদাহরণস্বরূপ তৈরির উপহাস করা, চূড়ান্ত শ্রেণি এবং পদ্ধতিগুলি উপহাস করা। কাজেই আমার কাজ সম্পাদনের জন্য আমার যা যা প্রয়োজন তা আমার আছে।
আমি জেমককে পছন্দ করি কারণ আপনি প্রত্যাশাগুলি সেট করতে সক্ষম। কোনও মক লাইব্রেরিতে কোনও পদ্ধতি পাওয়া গেছে কিনা তা যাচাই করা থেকে একেবারে পৃথক। জেমক ব্যবহার করে আপনি খুব পরিশীলিত প্রত্যাশা লিখতে পারেন। জ্যামক চিট-শিট দেখুন ।
হ্যাঁ, মকিতো একটি দুর্দান্ত কাঠামো। আমি আমার পরীক্ষাগুলি সেটআপ করার জন্য এটি হ্যামক্রাস্ট এবং গুগল গুয়েসের সাথে একসাথে ব্যবহার করি ।
বিদ্রূপের সর্বোত্তম সমাধান হ'ল মেশিনটি স্বয়ংক্রিয় স্পেসিফিকেশন-ভিত্তিক পরীক্ষার মাধ্যমে সমস্ত কাজ করে। জাভা জন্য, দেখুন ScalaCheck এবং পরোক্ষ কাঠামোর মধ্যে অন্তর্ভুক্ত ক্রিয়াগত জাভা লাইব্রেরি। স্বয়ংক্রিয় স্পেসিফিকেশন-ভিত্তিক টেস্টিং ফ্রেমওয়ার্কগুলির সাহায্যে, আপনি পরীক্ষার অধীনে পদ্ধতির একটি স্পেসিফিকেশন সরবরাহ করেন (এটি সম্পর্কে একটি সম্পত্তি যা সত্য হওয়া উচিত) এবং ফ্রেমওয়ার্কটি স্বয়ংক্রিয়ভাবে পরীক্ষার পাশাপাশি মক অবজেক্ট তৈরি করে।
উদাহরণস্বরূপ, কোনও ধনাত্মক সংখ্যা এন স্কোয়ারের বর্গমূল n এর সমান কিনা তা দেখতে নিম্নলিখিত সম্পত্তিটি ম্যাথ.এসকিআরটি পদ্ধতিটি পরীক্ষা করে।
val propSqrt = forAll { (n: Int) => (n >= 0) ==> scala.Math.sqrt(n*n) == n }
আপনি যখন কল করবেন তখন propSqrt.check()
স্কালাচেক কয়েকশ সংখ্যক পূর্ণসংখ্যার উত্পন্ন করে এবং প্রত্যেকের জন্য আপনার সম্পত্তি চেক করে, স্বয়ংক্রিয়ভাবে নিশ্চিত হয়ে নিন যে প্রান্তের কেসগুলি ভালভাবে আচ্ছাদিত রয়েছে।
যদিও স্কালাচেক স্কালায় লিখিত আছে এবং এর জন্য স্কালা সংকলক প্রয়োজন, এটি দিয়ে জাভা কোডটি পরীক্ষা করা সহজ। ফাংশনাল জাভাতে রেডুকিও ফ্রেমওয়ার্ক একই ধারণাগুলির খাঁটি জাভা বাস্তবায়ন।
মকিতো স্টিবিং পদ্ধতিগুলি, ম্যাচিং আর্গুমেন্টগুলির (যেমন কোনও আইন্ট () এবং যে কোনও স্ট্রিং ()) সরবরাহ করতে পারে, অনুরোধের সংখ্যা যাচাই করে (বার (3), লাস্টস্ট ইন (), কখনই না ()) এবং আরও অনেক কিছু করে ।
আমি এটিও পেয়েছি যে মকিতো সহজ এবং পরিষ্কার ।
মকিতো সম্পর্কে একটি জিনিস আমি পছন্দ করি না তা হ'ল আপনি স্থির পদ্ধতিগুলিকে হঠাতে পারবেন না ।
কিছুটা আলাদা করার জন্য, আপনি জেআরবি এবং মোচা ব্যবহার করতে পারেন যা আপনার জাভা কোডের জন্য এক্সপিটিভ এবং সংযোগযুক্ত রুবিতে পরীক্ষা লিখতে জেস্টেটিআরে একত্রিত হয়েছে । জেস্টআর এর সাথে এখানে কিছু উপহাসের উদাহরণ রয়েছে । এই পদ্ধতির একটি সুবিধা হ'ল মজাদার কংক্রিটের ক্লাসগুলি খুব সোজা।
আমি জেএমকের মাধ্যমে উপহাসগুলি ব্যবহার শুরু করেছি, তবে শেষ পর্যন্ত ইজিমক ব্যবহার করতে রূপান্তরিত হয়েছি। ইজিমকটি কেবল --easier-- ছিল এবং এমন একটি সিনট্যাক্স সরবরাহ করেছিল যা আরও প্রাকৃতিক অনুভূত হয়েছিল। আমি তখন থেকে পরিবর্তন করিনি।