আপনি ব্যক্তিগত ইউনিট পরীক্ষা ইউনিট কিভাবে?


184

আমি একটি জাভা প্রকল্পে কাজ করছি। আমি ইউনিট পরীক্ষায় নতুন। জাভা ক্লাসগুলিতে ইউনিট পরীক্ষার ব্যক্তিগত পদ্ধতিগুলির সর্বোত্তম উপায় কী?


1
এই প্রশ্নটি স্ট্যাকওভারফ্লোতে পরীক্ষা করুন। কয়েকটি কৌশল উল্লেখ এবং আলোচনা করা হয়। একক ব্যক্তিগত পদ্ধতি পরীক্ষা করার সেরা উপায় কী?
চিরন

34
আমার মতামত সবসময়ই হয়েছে যে ব্যক্তিগত পদ্ধতিগুলির পরীক্ষা করার প্রয়োজন নেই কারণ আপনার যা পাওয়া যায় তা পরীক্ষা করা উচিত। একটি পাবলিক পদ্ধতি। আপনি যদি পাবলিক পদ্ধতিটি ভেঙে না ফেলতে পারেন তবে ব্যক্তিগত পদ্ধতিগুলি কী করছে তা কি আসলেই কিছু আসে যায় না?
রিগ

1
সরকারী এবং বেসরকারী উভয় পদ্ধতিই পরীক্ষা করা উচিত। অতএব, একটি পরীক্ষা ড্রাইভার সাধারণত শ্রেণীর এটি পরীক্ষা করে পরীক্ষা করা উচিত। এই মত ।
ওভাররেজচেঞ্জ

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

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

উত্তর:


239

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

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


39
+1 বাজিলিয়ন এবং যদি কোনও ব্যক্তিগত পদ্ধতি কখনই না ডাকা হয়, এটির ইউনিট-পরীক্ষা করবেন না, এটি মুছুন!
স্টিভেন এ। লো

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

10
অবশ্যই এটি মুছুন। আপনি যে ফাংশনটি ব্যবহার করছেন না সেটি মুছে না দেওয়ার একমাত্র সম্ভাব্য কারণ হ'ল যদি আপনি ভাবেন যে ভবিষ্যতে আপনার এটির প্রয়োজন হতে পারে, এবং তারপরেও আপনার এটি মুছে ফেলা উচিত তবে আপনার কমিট লগগুলিতে ফাংশনটি নোট করুন, বা কমপক্ষে মন্তব্য করুন যাতে লোকেরা জানেন যে এটি অতিরিক্ত জিনিস তারা উপেক্ষা করতে পারে।
14:44

38
@ কোয়ান্ট_দেব: কখনও কখনও কোনও শ্রেণিকে অন্য কয়েকটি ক্লাসে রিফ্যাক্টর করা প্রয়োজন । আপনার ভাগ করা ডেটা পৃথক শ্রেণিতেও টানতে পারে। বলুন, একটি "প্রসঙ্গ" শ্রেণি। তারপরে আপনার দুটি নতুন ক্লাস তাদের ভাগ করা ডেটার জন্য প্রসঙ্গ শ্রেণিতে উল্লেখ করতে পারে। এটি অযৌক্তিক মনে হতে পারে, তবে যদি আপনার ব্যক্তিগত পদ্ধতিগুলি পৃথক পরীক্ষার প্রয়োজনের জন্য যথেষ্ট জটিল হয় তবে এটি একটি কোড গন্ধ যা আপনার অবজেক্টের গ্রাফকে আরও কিছুটা দানাদার হওয়ার দরকার নির্দেশ করে।
ফিল

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

118

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

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

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

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


9
+1 আকর্ষণীয় পয়েন্ট। শেষ পর্যন্ত এটি রক্ষণাবেক্ষণের বিষয়ে, ভাল ওওপির "নিয়ম" মেনে চলবে না।
ফিল

9
+1 আমি সম্পূর্ণরূপে এনক্যাপসুলেশনের মাধ্যমে পরীক্ষার যোগ্যতার সাথে একমত।
রিচার্ড

31

ব্যক্তিগত পদ্ধতিগুলির পরীক্ষা তাদের জটিলতার উপর নির্ভর করবে; কিছু এক লাইনের ব্যক্তিগত পদ্ধতিগুলি পরীক্ষার অতিরিক্ত প্রয়াসকে সত্যই ওয়ারেন্ট দেয় না (এটি পাবলিক পদ্ধতি সম্পর্কেও বলা যেতে পারে), তবে কিছু ব্যক্তিগত পদ্ধতি জনসাধারণের পদ্ধতির মতোই জটিল এবং পাবলিক ইন্টারফেসের মাধ্যমে পরীক্ষা করা কঠিন হতে পারে।

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

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

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

পরীক্ষার আগে ব্যক্তিগত পদ্ধতি:

private int add(int a, int b){
    return a + b;
}

প্যাকেজ ব্যক্তিগত পদ্ধতি পরীক্ষার জন্য প্রস্তুত:

@VisibleForTesting
int add(int a, int b){
    return a + b;
}

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


14

আপনি যদি বাহ্যিক API গুলি ব্যবহার করতে না চান বা না চান তবে আপনি প্রতিবিম্বটি ব্যবহার করে ব্যক্তিগত পদ্ধতিগুলি অ্যাক্সেস করার জন্য খাঁটি মানক জেডিকে এপিআই ব্যবহার করতে পারেন। এখানে একটি উদাহরণ

MyObject obj = new MyObject();
Method privateMethod = MyObject.class.getDeclaredMethod("getFoo", null);
privateMethod.setAccessible(true);
String returnValue = (String) privateMethod.invoke(obj, null);
System.out.println("returnValue = " + returnValue);

জাভা টিউটোরিয়াল http://docs.oracle.com/javase/tutorial/reflect/ বা জাভা এপিআই http://docs.oracle.com/javase/7/docs/api/java/lang/reflect/package-summary দেখুন। আরও তথ্যের জন্য এইচটিএমএল

যেমন @ কিজ তার উত্তরে উদ্ধৃত হয়েছে এমন সময়গুলি আসে যখন প্রতিফলন ব্যবহারের একটি সহজ সমাধান কোনও ব্যক্তিগত পদ্ধতি পরীক্ষা করার জন্য সত্যই ভাল।


9

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

আপনি যদি জাভা ব্যবহার করছেন, আপনি jmockit ব্যবহার করতে পারেন যা পরীক্ষার অধীনে শ্রেণীর কোনও ব্যক্তিগত পদ্ধতিতে কল করতে Deencapsulation.invoke সরবরাহ করে। এটি শেষ পর্যন্ত এটির জন্য প্রতিবিম্ব ব্যবহার করে তবে এটির চারপাশে একটি দুর্দান্ত মোড়ক সরবরাহ করে। ( https://code.google.com/p/jmockit/ )


এই প্রশ্ন জিজ্ঞাসা উত্তর কিভাবে?
gnat

@ গ্যাनेट, প্রশ্নটি ছিল যে জাভা ক্লাসগুলিতে ইউনিট পরীক্ষার বেসরকারী পদ্ধতির সবচেয়ে ভাল উপায় কী? এবং আমার প্রথম পয়েন্ট প্রশ্নের উত্তর।
অগ্রণীওয়ালঙ্কুর

আপনার প্রথম পয়েন্টটি কেবল একটি সরঞ্জামের বিজ্ঞাপন দেয় তবে এটি বিকল্পগুলির চেয়ে ভাল বলে আপনি কেন বিশ্বাস করেন তা ব্যাখ্যা করে না যেমন যেমন বেসরকারী পদ্ধতির পরোক্ষভাবে পরীক্ষার পরামর্শ দেওয়া হয়েছিল এবং শীর্ষ উত্তরে ব্যাখ্যা করা হয়েছিল
gnat

jmockit সরানো হয়েছে এবং পুরানো অফিসিয়াল পৃষ্ঠাটি "সিন্থেটিক মূত্র এবং কৃত্রিম প্রস্রাব" সম্পর্কে একটি নিবন্ধের দিকে ইঙ্গিত করে। Wich পথ এখনও কাপড় উপহাস এর সাথে সম্পর্কিত হয়, কিন্তু এখানে প্রাসঙ্গিক নয় :) নতুন কর্মকর্তা পৃষ্ঠা হল: jmockit.github.io
Guillaume,

8

প্রথমত, অন্যান্য লেখক যেমন পরামর্শ দিয়েছেন: আপনার যদি ব্যক্তিগত পদ্ধতি পরীক্ষা করার প্রয়োজন হয় তবে দুবার ভাবেন। এবং যদি তাই হয়, ...

.NET এ আপনি এটিকে "অভ্যন্তরীণ" পদ্ধতিতে রূপান্তর করতে পারবেন এবং আপনার ইউনিট পরীক্ষা প্রকল্পে " অভ্যন্তরীণে দৃশ্যমান " প্যাকেজ তৈরি করতে পারবেন ।

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

ধন্যবাদ।


7

আমি সাধারণত এ জাতীয় পদ্ধতি সুরক্ষিত করি। আসুন বলি যে আপনার ক্লাসটি রয়েছে:

src/main/java/you/Class.java

আপনি এই হিসাবে একটি পরীক্ষা ক্লাস তৈরি করতে পারেন:

src/test/java/you/TestClass.java

এখন আপনার সুরক্ষিত পদ্ধতিতে অ্যাক্সেস রয়েছে এবং সেগুলি ইউনিট পরীক্ষা করতে পারেন (ইউএনইটি বা টেস্টএনজি আসলেই কিছু যায় আসে না), তবুও আপনি এই পদ্ধতিগুলি কলকারীদের কাছ থেকে রাখেন না।

নোট করুন যে এটি কোনও খাঁটি-শৈলীর উত্স গাছের প্রত্যাশা করে।


3

জাভা বলতে চাইলে আপনার যদি সত্যিই ব্যক্তিগত পদ্ধতি পরীক্ষা করতে হয় তবে আপনি fest assertএবং / অথবা ব্যবহার করতে পারেন fest reflect। এটি প্রতিবিম্ব ব্যবহার করে।

ম্যাভেনের সাথে লাইব্রেরিটি আমদানি করুন (প্রদত্ত সংস্করণগুলি আমার মনে হয় দীর্ঘতম নয়) বা এটি সরাসরি আপনার ক্লাসপথে আমদানি করুন:

<dependency>
     <groupId>org.easytesting</groupId>
     <artifactId>fest-assert</artifactId>
     <version>1.4</version>
    </dependency>

    <dependency>
     <groupId>org.easytesting</groupId>
     <artifactId>fest-reflect</artifactId>
    <version>1.2</version>
</dependency>

উদাহরণস্বরূপ, আপনার যদি 'মাই ক্লাস' নামে একটি ক্লাস থাকে তবে 'মাইপ্রাইভেটমেথড' নামে একটি ব্যক্তিগত পদ্ধতি রয়েছে যা একটি স্ট্রিংকে প্যারামিটার হিসাবে আপডেট করে এটি 'এটি দুর্দান্ত পরীক্ষা!' এর মান হিসাবে আপডেট করে, আপনি নিম্নলিখিত জুনিট পরীক্ষাটি করতে পারেন:

import static org.fest.reflect.core.Reflection.method;
...

MyClass objectToTest;

@Before
public void setUp(){
   objectToTest = new MyClass();
}

@Test
public void testPrivateMethod(){
   // GIVEN
   String myOriginalString = "toto";
   // WHEN
   method("myPrivateMethod").withParameterTypes(String.class).in(objectToTest).invoke(myOriginalString);
   // THEN
   Assert.assertEquals("this is cool testing !", myOriginalString);
}

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


2
যদিও প্রতিচ্ছবি আপনাকে ব্যক্তিগত পদ্ধতিগুলি পরীক্ষা করতে সক্ষম করবে, সেগুলির ব্যবহারগুলি সনাক্ত করার জন্য এটি ভাল নয়। আপনি যদি কোনও ব্যক্তিগত পদ্ধতির নাম পরিবর্তন করেন তবে এটি আপনার পরীক্ষাটি ভেঙে দেবে।
রিচার্ড

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

2

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

public class classUnderTest
{
   //this would normally be private
   protected void methodToTest()
   {
     //some code here
   }
}

ক্লাসউন্ডারস্টেস্ট থেকে সরাসরি উত্তরাধিকারসূত্রে প্রাপ্ত না এমন কোনও ক্লাসের কোনও ধারণা নেই যে মেথডোস্টেস্ট এমনকি বিদ্যমান। আমার পরীক্ষার কোডে, আমি একটি বিশেষ পরীক্ষার শ্রেণি তৈরি করতে পারি যা এই পদ্ধতিতে প্রসারিত এবং অ্যাক্সেস সরবরাহ করে ...

class TestingClass : classUnderTest
{
   public void methodToTest()
   {
     //this returns the method i would like to test
     return base.methodToTest();
   }
}

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


4
protectedসর্বজনীন এপিআইয়ের অংশ এবং একই সীমাবদ্ধতাগুলি অন্তর্ভুক্ত করে (কখনই পরিবর্তন করা যায় না, অবশ্যই ডকুমেন্টেড হতে হবে, ...)। সি # তে আপনি internalএকসাথে ব্যবহার করতে পারেন InternalsVisibleTo
কোডসইনচাউস

1

আপনি যে শ্রেণীর পরীক্ষা করছেন তার ইউনিট পরীক্ষাগুলি কোনও অভ্যন্তরীণ শ্রেণিতে রাখলে আপনি সহজেই ব্যক্তিগত পদ্ধতিগুলি পরীক্ষা করতে পারেন। টেস্টএনজি ব্যবহার করে আপনার ইউনিট পরীক্ষাগুলি অবশ্যই @ টেস্টের সাথে টীকাযুক্ত পাবলিক স্ট্যাটিক অভ্যন্তর শ্রেণি হতে হবে:

@Test
public static class UserEditorTest {
    public void test_private_method() {
       assertEquals(new UserEditor().somePrivateMethod(), "success");
    }
}

যেহেতু এটি একটি অন্তর্গত শ্রেণি, তাই ব্যক্তিগত পদ্ধতিটি বলা যেতে পারে।

আমার পরীক্ষাগুলি ম্যাভেন থেকে চালানো হয় এবং এটি স্বয়ংক্রিয়ভাবে এই পরীক্ষার কেসগুলি সন্ধান করে। আপনি যদি কেবল একটি ক্লাস পরীক্ষা করতে চান তবে আপনি করতে পারেন

$ mvn test -Dtest=*UserEditorTest

সূত্র: http://www.ninthavenue.com.au/how-to-unit-test-private- পদ্ধতি


4
আপনি স্থাপন করা প্যাকেজটির আসল কোডে পরীক্ষার কোড (এবং অতিরিক্ত অভ্যন্তরীণ ক্লাসগুলি) সহ প্রস্তাব দিচ্ছেন?

1
পরীক্ষা ক্লাসটি আপনি যে শ্রেণীর পরীক্ষা করতে চান এটি একটি অভ্যন্তর শ্রেণি। আপনি যদি না চান যে এই অভ্যন্তরীণ ক্লাসগুলি স্থাপন করা হোক আপনি কেবল আপনার প্যাকেজ থেকে * টেস্ট.ক্লাস ফাইলগুলি মুছতে পারেন।
রজার কিস

1
আমি এই বিকল্পটি পছন্দ করি না, তবে অনেকের পক্ষে এটি সম্ভবত একটি বৈধ সমাধান, ডাউনভোটদের পক্ষে উপযুক্ত নয়।
বিল কে

@ রজারকিস: প্রযুক্তিগতভাবে আপনি যখন কোনও স্থাপনা করেন, আপনি কীভাবে এই জাতীয় "পরীক্ষার অভ্যন্তরীণ ক্লাসগুলি" সরিয়ে ফেলবেন? দয়া করে বলবেন না যে আপনি তাদের হাতে কেটেছেন।
গির্জ্যাব্রাহাম

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