আমার কি ব্যক্তিগত পদ্ধতিগুলি পরীক্ষা করা উচিত বা কেবল সর্বজনীন? [বন্ধ]


347

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



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

উত্তর:


328

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

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


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

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

37
"একটি ব্যক্তিগত পদ্ধতি একটি বাস্তবায়ন বিশদ যা শ্রেণীর ব্যবহারকারীদের কাছে লুকানো উচিত" " তবে পরীক্ষাগুলি কি "নিয়মিত" (রানটাইম) ব্যবহারকারী হিসাবে ক্লাসের ইন্টারফেসের একই পাশেই রয়েছে? ;)
mlvljr

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

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

293

পরীক্ষার উদ্দেশ্য কী?

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

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

বিবেচনা করুন: আপনার একটি পাবলিক পদ্ধতি A রয়েছে যা ব্যক্তিগত পদ্ধতি বি বলে থাকে A এবং B উভয় পদ্ধতি সি ব্যবহার করে সি সি পরিবর্তিত হয়েছে (সম্ভবত আপনার দ্বারা, সম্ভবত কোনও বিক্রেতার দ্বারা) এ এর ​​পরীক্ষাগুলিতে ব্যর্থ হতে শুরু করে। এটি ব্যক্তিগত থাকার পরেও বি এর জন্য পরীক্ষা করা কি কার্যকর হবে না, যাতে আপনি জানেন যে সমস্যাটি এ এর ​​সি এর ব্যবহার, বি এর সি ব্যবহার, বা উভয়ই আছে কিনা?

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


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

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

6
@ 17 যদি পরীক্ষা এবং বাস্তবায়ন একযোগে পরিবর্তিত হয় (যেমন, মনে হয় এটি এক ধরণের হওয়া উচিত) তবে খুব কম সমস্যা হবে।
mlvljr

11
@ সওরনলর্ড, আপনি ব্যক্তিগত পদ্ধতি পরীক্ষা করার কারণ হ'ল কারণ আপনি যদি কেবলমাত্র সরকারী পদ্ধতি পরীক্ষা করেন, যখন পরীক্ষা ব্যর্থ হয় আমরা ব্যর্থতার মূল কারণটি কোথায় তা আমরা সরাসরি জানি না। এটি হয় testDoSomething()বা হতে পারে testDoSomethingPrivate()। এটি পরীক্ষা কম মূল্যবান করে তোলে। । এখানে ব্যক্তিগত পরীক্ষার জন্য আরো কারণগুলি এর stackoverflow.com/questions/34571/... :
Pacerier

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

150

আমি তাদের প্রাগমেটিক ইউনিট টেস্টিং বইয়ে ডেভ থমাস এবং অ্যান্ডি হান্টের পরামর্শ অনুসরণ করতে চাই :

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

তবে কখনও কখনও আমি ব্যক্তিগত পদ্ধতিগুলি পরীক্ষা করা থেকে নিজেকে আটকাতে পারি না কারণ এটি আমাকে নিশ্চিত করে তোলে যে আমি একটি সম্পূর্ণ শক্তিশালী প্রোগ্রাম তৈরি করছি।


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

61

আমি একপ্রকার ব্যক্তিগত কাজগুলি পরীক্ষা করতে বাধ্য হচ্ছি কারণ আমি আমাদের প্রকল্পে আমাদের সর্বশেষতম QA সুপারিশটি অনুসরণ করছি:

ফাংশন অনুযায়ী সাইক্লোমেটিক জটিলতায় 10 এর বেশি নয় ।

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

এটি আসলেই দুর্দান্ত, কারণ কলস্ট্যাকটি পড়া এখন অনেক সহজ (বৃহত ফাংশনের মধ্যে বাগের পরিবর্তে, কলস্ট্যাকের আগের ফাংশনগুলির নাম সহ আমার একটি সাব-সাব-ফাংশনে একটি বাগ রয়েছে যাতে আমাকে বুঝতে সাহায্য করতে পারে 'আমি সেখানে কীভাবে পৌঁছেছি')

যাইহোক, এখন সরাসরি সেই ব্যক্তিগত ফাংশনগুলি ইউনিট-টেস্ট করা সহজতর হয়েছে এবং বৃহত্তর পাবলিক ফাংশনটির পরীক্ষাটি একরকম 'ইন্টিগ্রেশন' পরীক্ষার দিকে ছেড়ে দেয় যেখানে দৃশ্যের দিকে নজর দেওয়া দরকার।

শুধু আমার 2 সেন্ট।


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

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

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

: Cyclomatic জটিলতা আগ্রহী তাদের জন্য, আমি বিষয়ে এক প্রশ্নের যোগ stackoverflow.com/questions/105852/...
VonC

উফফ, শিরোনামে টাইপোর কারণে প্রশ্নের url পরিবর্তন হয়েছে! stackoverflow.com/questions/105852/...
VonC

51

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

আমাদের ব্যক্তিগত পদ্ধতি কেন?

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

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

আমরা মনে করি এখানে 3 টি সমাধান রয়েছে:

1. আপনি আপনার সর্বজনীন পদ্ধতির মাধ্যমে আপনার প্রাইভেটগুলি পরীক্ষা করতে পারেন

সুবিধাদি

  • সোজা ইউনিট পরীক্ষা (কোন 'হ্যাক' প্রয়োজন)

অসুবিধেও

  • প্রোগ্রামারকে সর্বজনীন পদ্ধতি বুঝতে হবে, যখন সে কেবল ব্যক্তিগত পদ্ধতি পরীক্ষা করতে চায়
  • আপনি অ্যাপ্লিকেশনটির ক্ষুদ্রতম পরীক্ষামূলক অংশটি পরীক্ষা করছেন না

২. বেসরকারীটি যদি এত গুরুত্বপূর্ণ হয় তবে এটির জন্য সম্ভবত একটি নতুন পৃথক শ্রেণি তৈরি করা কোডমেল

সুবিধাদি

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

অসুবিধেও

  • আপনি প্রয়োজন না হলে কোনও শ্রেণি তৈরি করতে চান না এবং কেবল ক্লাসটিই ব্যবহার করেন যেখানে পদ্ধতিটি আসছে
  • সংযুক্ত ওভারহেডের কারণে সম্ভাব্য কর্মক্ষমতা হ্রাস

৩. অ্যাক্সেস পরিবর্তনকারীকে (চূড়ান্ত) সুরক্ষিত করুন

সুবিধাদি

  • আপনি অ্যাপ্লিকেশনটির ক্ষুদ্রতম পরীক্ষামূলক অংশটি পরীক্ষা করছেন। চূড়ান্ত সুরক্ষিত ব্যবহার করার সময়, ক্রিয়াকলাপটি অতিরিক্ত করা যাবে না (ঠিক একটি বেসরকারীের মতো)
  • পারফরম্যান্সের ক্ষতি নেই
  • অতিরিক্ত ওভারহেড নেই

অসুবিধেও

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

উদাহরণ

class Detective {
  public function investigate() {}
  private function sleepWithSuspect($suspect) {}
}
Altered version:
class Detective {
  public function investigate() {}
  final protected function sleepWithSuspect($suspect) {}
}
In Test class:
class Mock_Detective extends Detective {

  public test_sleepWithSuspect($suspect) 
  {
    //this is now accessible, but still not overridable!
    $this->sleepWithSuspect($suspect);
  }
}

সুতরাং আমাদের পরীক্ষার ইউনিটটি এখন আমাদের প্রাক্তন ব্যক্তিগত ফাংশনটি পরীক্ষা করার জন্য টেস্ট_স্লিপ উইথস্স্পেক্ট কল করতে পারে।


eddy147, আমি সত্যিই ঠাট্টা মাধ্যমে সংরক্ষিত পদ্ধতি পরীক্ষা ধারণা মত। ধন্যবাদ !!!!
থিওডোর আর স্মিথ

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

@ ম্যাট কাজের একক কোনও শ্রেণিকে নির্দেশ করতে পারে, তবে একক পদ্ধতিতেও।
এডি 147

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

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

41

আমি বেশ কয়েকটি কারণে ব্যক্তিগত কার্যকারিতা পরীক্ষা করতে পছন্দ করি না। এগুলি নিম্নরূপ (টিএলডিআর লোকদের জন্য এটি প্রধান পয়েন্ট):

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

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

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

একেবারে প্রাইভেট পদ্ধতিগুলি পরীক্ষা করার জন্য টিডিডি কেন বৈধ অজুহাত নয় তাও আমি জানি।

খারাপ ডিজাইন থেকে বেরিয়ে আসার পথে আপনার প্রতিচ্ছবি

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

বিধি মূল্যায়নকারী

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

TEST_THAT(RuleEvaluator, canParseSpaceDelimtedTokens)
{
    input_string = "1 2 test bar"
    re = RuleEvaluator(input_string);

    ASSERT re.GetNextToken() IS "1";
    ASSERT re.GetNextToken() IS "2";
    ASSERT re.GetNextToken() IS "test";
    ASSERT re.GetNextToken() IS "bar";
    ASSERT re.HasMoreTokens() IS FALSE;
}

ঠিক আছে, এটি দেখতে বেশ সুন্দর দেখাচ্ছে। আমরা পরিবর্তন আনার সাথে সাথে আমরা এই আচরণটি বজায় রাখতে পারি তা নিশ্চিত করতে চাই। কিন্তু GetNextToken()একটি ব্যক্তিগত ফাংশন! সুতরাং আমরা এটির মতো এটি পরীক্ষা করতে পারি না, কারণ এটি এমনকি সংকলনও করবে না (ধরে নেওয়া যাক আমরা পাইথনের মতো কিছু স্ক্রিপ্টিং ভাষার মত নয় এমন কিছু ভাষা ব্যবহার করি যা আসলে পাবলিক / প্রাইভেটকে প্রয়োগ করে)। তবে RuleEvaluatorএকক দায়িত্বের নীতি (একক দায়িত্বের নীতি) অনুসরণ করতে শ্রেণি পরিবর্তন সম্পর্কে কী ? উদাহরণস্বরূপ, আমরা মনে করি পার্সার, টোকেনাইজার এবং মূল্যায়নকারীকে এক শ্রেণিতে জ্যাম দেওয়া হয়েছে। শুধু এই দায়িত্বগুলি আলাদা করা ভাল না? সর্বোপরি, আপনি যদি একটি Tokenizerবর্গ তৈরি করেন , তবে এটি সর্বজনীন পদ্ধতিগুলি হবে HasMoreTokens()এবং GetNextTokens()RuleEvaluatorবর্গ একটি হতে পারেTokenizerসদস্য হিসাবে আপত্তি। Tokenizerক্লাসের পরিবর্তে ক্লাস পরীক্ষা না করে এখন আমরা উপরের মতো একই পরীক্ষা রাখতে পারি RuleEvaluator

এটি ইউএমএলে দেখতে কেমন লাগবে তা এখানে:

বিধান মূল্যায়নকারী রিফ্যাক্টর

নোট করুন যে এই নতুন ডিজাইনটি মডুলারিটি বাড়িয়েছে, তাই আপনি আপনার সিস্টেমের অন্যান্য অংশগুলিতে এই ক্লাসগুলি পুনরায় ব্যবহার করতে পারবেন (আপনি না পারার আগে, সংজ্ঞা দ্বারা ব্যক্তিগত পদ্ধতিগুলি পুনরায় ব্যবহারযোগ্য নয়)। বর্ধিত বোধগম্যতা / স্থানীয়ত্বের পাশাপাশি নিয়ম মূল্যায়নকারীকে ভেঙে ফেলার এটি প্রধান সুবিধা।

পরীক্ষাটি চূড়ান্ত অনুরূপ দেখাবে, কেবলমাত্র এই সময়টি সংকলন করা ব্যতীত GetNextToken()পদ্ধতিটি এখন Tokenizerক্লাসে প্রকাশ্য :

TEST_THAT(Tokenizer, canParseSpaceDelimtedTokens)
{
    input_string = "1 2 test bar"
    tokenizer = Tokenizer(input_string);

    ASSERT tokenizer.GetNextToken() IS "1";
    ASSERT tokenizer.GetNextToken() IS "2";
    ASSERT tokenizer.GetNextToken() IS "test";
    ASSERT tokenizer.GetNextToken() IS "bar";
    ASSERT tokenizer.HasMoreTokens() IS FALSE;
}

পাবলিক ইন্টারফেসের মাধ্যমে ব্যক্তিগত উপাদানগুলির পরীক্ষা করা এবং পরীক্ষার সদৃশ এড়ানো

এমনকি যদি আপনি ভাবেন না যে আপনি নিজের সমস্যাটিকে কম মডুলার উপাদানগুলিতে বিভক্ত করতে পারেন (যা আপনি যদি এটি করার চেষ্টা করেন তবে আপনি 95% সময় দিতে পারেন ), আপনি কেবলমাত্র একটি সরকারী ইন্টারফেসের মাধ্যমে ব্যক্তিগত ফাংশনগুলি পরীক্ষা করতে পারেন। অনেক সময় ব্যক্তিগত সদস্যরা পরীক্ষার উপযুক্ত না কারণ তাদের পাবলিক ইন্টারফেসের মাধ্যমে পরীক্ষা করা হবে। আমি যা যা দেখি তার অনেকগুলি পরীক্ষাগুলি দেখতে খুব মিল দেখা যায় তবে দুটি ভিন্ন ফাংশন / পদ্ধতি পরীক্ষা করে দেখি। যা ঘটতে চলেছে তা হ'ল যখন প্রয়োজনীয়তাগুলি পরিবর্তন হয় (এবং তারা সর্বদা এটি করে) তখন আপনার 1 টির পরিবর্তে এখন 2 টি ভাঙা পরীক্ষা রয়েছে And এবং যদি আপনি সত্যিই আপনার সমস্ত ব্যক্তিগত পদ্ধতি পরীক্ষা করেন তবে আপনার 1 টির পরিবর্তে 10 টির মতো ভাঙ্গা পরীক্ষা থাকতে পারে short , ব্যক্তিগত ফাংশন পরীক্ষা করে (ব্যবহার করে)FRIEND_TESTবা তাদের সর্বজনীন করা বা প্রতিবিম্ব ব্যবহার করে) যা অন্যথায় পাবলিক ইন্টারফেসের মাধ্যমে পরীক্ষা করা যেতে পারে পরীক্ষার সদৃশ হতে পারে । আপনি সত্যিই এটি চান না, কারণ আপনার টেস্ট স্যুটটি আপনাকে ধীর করে দেওয়ার চেয়ে বেশি কিছু ব্যথা করে না। এটি বিকাশের সময় হ্রাস এবং রক্ষণাবেক্ষণ ব্যয় হ্রাস করার কথা! যদি আপনি কোনও ব্যক্তিগত পদ্ধতিগুলি পরীক্ষা করেন যা অন্যথায় পাবলিক ইন্টারফেসের মাধ্যমে পরীক্ষা করা হয়, টেস্ট স্যুটটি খুব ভাল বিপরীতভাবে করতে পারে এবং সক্রিয়ভাবে রক্ষণাবেক্ষণের ব্যয় বৃদ্ধি করতে এবং বিকাশের সময় বাড়িয়ে তুলতে পারে। আপনি যখন কোনও ব্যক্তিগত ফাংশন সর্বজনীন করেন, বা আপনি যেমন FRIEND_TESTএবং / অথবা প্রতিবিম্বের মতো কিছু ব্যবহার করেন , আপনি সাধারণত দীর্ঘস্থায়ীভাবে অনুশোচনা করে শেষ করবেন।

Tokenizerক্লাসের নিম্নলিখিত সম্ভাব্য বাস্তবায়ন বিবেচনা করুন :

এখানে চিত্র বর্ণনা লিখুন

ধরা যাক যে SplitUpByDelimiter()অ্যারে ফিরিয়ে দেওয়ার জন্য এটি দায়ী যে অ্যারের প্রতিটি উপাদানই একটি টোকেন। তদ্ব্যতীত, GetNextToken()কেবল এটি বলা যাক যে কেবল এই ভেক্টরের উপরে একটি পুনরাবৃত্তকারী। সুতরাং আপনার সার্বজনীন পরীক্ষাটি এটিকে দেখতে পারে:

TEST_THAT(Tokenizer, canParseSpaceDelimtedTokens)
{
    input_string = "1 2 test bar"
    tokenizer = Tokenizer(input_string);

    ASSERT tokenizer.GetNextToken() IS "1";
    ASSERT tokenizer.GetNextToken() IS "2";
    ASSERT tokenizer.GetNextToken() IS "test";
    ASSERT tokenizer.GetNextToken() IS "bar";
    ASSERT tokenizer.HasMoreTokens() IS false;
}

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

TEST_THAT(TokenizerTest, canGenerateSpaceDelimtedTokens)
{
    input_string = "1 2 test bar"
    tokenizer = Tokenizer(input_string);
    result_array = tokenizer.SplitUpByDelimiter(" ");

    ASSERT result.size() IS 4;
    ASSERT result[0] IS "1";
    ASSERT result[1] IS "2";
    ASSERT result[2] IS "test";
    ASSERT result[3] IS "bar";
}

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

ব্যক্তিগত পদ্ধতি পরীক্ষা করা কখন উপযুক্ত হতে পারে?

সফ্টওয়্যারটিতে কোনও "এক আকারের ফিট করে না"। কখনও কখনও "নিয়মগুলি ভঙ্গ করা" ঠিক আছে (এবং প্রকৃত পক্ষে আদর্শ)। আপনি যখন পারেন তখন ব্যক্তিগত কার্যকারিতা পরীক্ষা না করার দৃ strongly়তার সাথে আমি সমর্থন করছি। দু'টি প্রধান পরিস্থিতি যখন আমি মনে করি এটি ঠিক আছে:

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

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

সম্ভবত অন্যান্য পরিস্থিতি রয়েছে যেখানে এটি ঠিক আছে। আপনি যদি মনে করেন এটি ঠিক আছে, এবং আপনার একটি ভাল ন্যায়সঙ্গততা রয়েছে, তবে এটি করুন। কোন এক আপনি বাঁধন। কেবল সম্ভাব্য ব্যয় সম্পর্কে সচেতন হন।

টিডিডি এক্সকিউজ

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

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

বিঃদ্রঃ:

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

পিএস এখানে আইসবার্গ ক্লাস এবং মাইকেল পালক দ্বারা গ্রোপিং সরঞ্জাম সম্পর্কে প্রাসঙ্গিক বক্তৃতা: https://www.youtube.com/watch?v=4cVZvoFGJTU


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

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

26

আমি মনে করি কেবল কোনও বস্তুর পাবলিক ইন্টারফেস পরীক্ষা করা ভাল। বাইরের বিশ্বের দৃষ্টিকোণ থেকে, শুধুমাত্র পাবলিক ইন্টারফেসের আচরণ গুরুত্বপূর্ণ এবং এটিই আপনার ইউনিট পরীক্ষার দিকে পরিচালিত করা উচিত।

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


21

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


3
ধন্যবাদ. এটি একটি আশ্চর্যজনকভাবে আন্ডাররেটেড মন্তব্য এবং বিশেষত এখনও প্রাসঙ্গিক, এটি লেখা হওয়ার প্রায় 8 বছর পরেও।
সোরনলর্ড

1
একই যুক্তির সাথে একজন কেবলমাত্র ইউজার ইন্টারফেস (সিস্টেম স্তর টেস্টিং) থেকে কেবল সফ্টওয়্যার পরীক্ষা করার পক্ষে তর্ক করতে পারে, কারণ কোনওভাবে সেখান থেকে সফ্টওয়্যারটির প্রতিটি ফাংশন কার্যকর করা হবে।
ডার্ক হার্মান

18

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

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

এটি পরে ডিবাগিংয়ের গতি।

-Adam


1
এই ক্ষেত্রে, সেই ব্যক্তিগত পদ্ধতিটি অন্য শ্রেণিতে স্থানান্তরিত করার অর্থ কি হবে না, তবে কেবল এটিকে জনসাধারণের বা সরকারী স্থির করে তুলবে?
আউটলা প্রোগ্রামার

+1 আপনি যদি আপনার ব্যক্তিগত সদস্যের কার্যাদি পরীক্ষা না করে থাকেন এবং আপনার সর্বজনীন ইন্টারফেসের পরীক্ষাটি ব্যর্থ হয় তবে ফলস্বরূপ এটি কোনও কিছুর সমপরিমাণ যা কোনও কিছুর ধারণা ছাড়াই নষ্ট হয়ে যায়।
ওলুমাইড

12

আপনি যদি পরীক্ষা চালিত (টিডিডি) বিকাশ করছেন তবে আপনি আপনার ব্যক্তিগত পদ্ধতি পরীক্ষা করবেন।



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

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

অসম্মতি, আমার উত্তর নীচে দেখুন
ম্যাট মেসারস্মিথ

11

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


এরপরে বাস্তবায়ন কোথায় পরীক্ষা করা হয়? কিছু কার্যকারিতা যদি ক্যাচিং ব্যবহার করে তবে এটি কি বাস্তবায়নের বিশদ এবং ক্যাশে পরীক্ষা করা হয় না?
ডিস্ক হেরম্যান

11

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

আপনার লিঙ্ক করা পোস্টটির বিষয়ে ট্রাম্পির উত্তর সবচেয়ে ভাল।


9

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


7

বিশেষত টিডিডিতে আমার হাত চেষ্টা করে আমি কিছুক্ষণ এই সমস্যাটি নিয়ে চলছি।

আমি দুটি পোস্ট জুড়ে এসেছি যা আমি মনে করি যে টিডিডি-র ক্ষেত্রে এই সমস্যাটি যথেষ্ট পরিমাণে সমাধান করা হয়েছে।

  1. ব্যক্তিগত পদ্ধতি, টিডিডি এবং পরীক্ষা চালিত রিফ্যাক্টরিং পরীক্ষা করা Test
  2. টেস্ট-চালিত বিকাশ পরীক্ষা হচ্ছে না

সংক্ষেপে:

  • পরীক্ষা চালিত বিকাশ (নকশা) কৌশলগুলি ব্যবহার করার সময়, ব্যক্তিগত পদ্ধতিগুলি কেবল ইতিমধ্যে কাজ করা এবং পরীক্ষিত কোডের পুনঃ-ফ্যাক্টরিং প্রক্রিয়া চলাকালীন উত্থিত হওয়া উচিত।

  • প্রক্রিয়াটির প্রকৃতি অনুসারে, পুরোপুরি পরীক্ষিত ফাংশন থেকে বেরিয়ে আসা সাধারণ বাস্তবায়ন কার্যকারিতার যে কোনও বিট এটি স্ব-পরীক্ষিত (অর্থাৎ পরোক্ষ পরীক্ষার কভারেজ) হবে।

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

অতএব, এই পদ্ধতিগুলি সর্বজনীন হবে এবং সেগুলি পরীক্ষা করা যথেষ্ট সহজ হবে।

সমস্ত কিছু ভালভাবে কাজ করার পরে ব্যক্তিগত পদ্ধতিগুলি পরে আসবে এবং আমরা পঠনযোগ্যতা এবং পরিষ্কার-পরিচ্ছন্নতার জন্য ফ্যাক্টরিং করছি ।


6

উপরে উদ্ধৃত হিসাবে, "আপনি যদি নিজের ব্যক্তিগত পদ্ধতি পরীক্ষা না করেন তবে কীভাবে আপনি জানেন যে সেগুলি ভাঙ্গবে না?"

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

আমি এটির সর্বোত্তম উপায়গুলির মধ্যে একটি খুঁজে পেয়েছি যা কেবলমাত্র প্রকল্পের পরীক্ষার রেফারেন্স যুক্ত করে এবং পরীক্ষাগুলিকে ব্যক্তিগত পদ্ধতির সাথে সমান্তরাল করে দেয় put উপযুক্ত বিল্ড লজিক রাখুন যাতে পরীক্ষাগুলি চূড়ান্ত প্রকল্পে না যায়।

তারপরে আপনার এই পদ্ধতিগুলি পরীক্ষা করার সমস্ত সুবিধা রয়েছে এবং আপনি কয়েক সেকেন্ডের মধ্যে কয়েক মিনিট বা ঘন্টা খুঁজে পেতে পারেন।

সুতরাং সংক্ষেপে, হ্যাঁ, ইউনিটটি আপনার ব্যক্তিগত পদ্ধতিগুলি পরীক্ষা করুন।


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

6

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


3

আপনি যদি আপনার ব্যক্তিগত পদ্ধতি পরীক্ষা না করেন তবে কীভাবে আপনি জানেন যে সেগুলি ভাঙ্গবে না?


19
আপনার সর্বজনীন পদ্ধতির পরীক্ষার মাধ্যমে লিখে।
scubabbl

3
এই ব্যক্তিগত পদ্ধতিগুলি শ্রেণীর পাবলিক পদ্ধতি দ্বারা কল করা হয় বলে মনে করা হয়। সুতরাং কেবলমাত্র সরকারী পদ্ধতিগুলিকে পরীক্ষা করুন যা ব্যক্তিগত পদ্ধতিগুলি কল করে।
jop

1
যদি আপনার সর্বজনীন পদ্ধতিগুলি সঠিকভাবে কাজ করে তবে স্পষ্টতই তারা যে ব্যক্তিগত পদ্ধতি ব্যবহার করে সেগুলি সঠিকভাবে কাজ করছে।
26

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

3
এটি জেনে রাখা সত্যিই দুর্দান্ত যে এটি কোনও অভ্যন্তরীণ ফাংশন এবং কেবলমাত্র বাহ্যিক ক্রিয়াগুলি ভেঙে পড়ে না (বা বিপরীতভাবে যে অভ্যন্তরীণ ফাংশনগুলি ভাল এবং আপনি বাহ্যিকের দিকে ফোকাস করতে পারেন)।
অ্যাডাম ডেভিস

2

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


5
বন্ধুর কীওয়ার্ডটি আমাকে দু: খিত করে।
রব

টেস্টিং ক্লাসটি যদি অন্য কোনও প্রকল্পে প্রয়োগ করা হয় তবে এটি কোনও সমস্যা নয়। কী গুরুত্বপূর্ণ তা হল প্রডাকশন কোডটি পরীক্ষার ক্লাসটি উল্লেখ করে না।
ওলুমাইড

2

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

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

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

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

  • পদ্ধতিটি বিভিন্ন স্থান থেকে একাধিকবার বলা হয়?
  • পরীক্ষার প্রয়োজন কি পদ্ধতিটি যথেষ্ট পরিশীলিত?

1

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


1

আমি কখনই ইউনিট টেস্টের ধারণাটি বুঝতে পারি না তবে এখন আমি জানি এটির উদ্দেশ্য কী।

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

একটি ইউনিট পরীক্ষা আরও একটি পিভট পরীক্ষা আপনি কিছু স্বেচ্ছাসেবক পিভট চিহ্নিত করে এবং পাইভটের ফলাফল একই থাকে।


1

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

গুরুত্বপূর্ণ বিষয়গুলি কভারেজ এবং ব্যয়। আপনার প্রকল্পের কভারেজ লক্ষ্যগুলি অর্জন করার সময় আপনার ব্যয়গুলি হ্রাস করতে হবে (লাইন, শাখা, পথ, ব্লক, পদ্ধতি, শ্রেণি, সমতা শ্রেণি, ব্যবহারের ক্ষেত্র ... দল যাই সিদ্ধান্ত নেয়)।

সুতরাং কভারেজ নিশ্চিত করতে সরঞ্জামগুলি ব্যবহার করুন এবং কমপক্ষে ব্যয় (স্বল্প এবং দীর্ঘমেয়াদী ) তৈরি করতে আপনার পরীক্ষাগুলি ডিজাইন করুন ।

প্রয়োজনের চেয়ে পরীক্ষাগুলি বেশি ব্যয়বহুল করবেন না। যদি কেবল সর্বজনীন এন্ট্রি পয়েন্টগুলি পরীক্ষা করা সস্তা হয় তবে এটি করুন। যদি ব্যক্তিগত পদ্ধতিগুলি পরীক্ষা করা সবচেয়ে সস্তা হয় তবে এটি করুন।

আপনি আরও অভিজ্ঞ হয়ে উঠলে, পরীক্ষার রক্ষণাবেক্ষণের দীর্ঘমেয়াদী ব্যয় এড়াতে আপনি যখন রিফ্যাক্টরিংয়ের উপযুক্ত তখন আপনি ভবিষ্যদ্বাণী করতে আরও ভাল হয়ে উঠবেন।


0

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


1
@ ভিজিবল ফরস্টেস্টিং এটির জন্য একটি টীকা। আমি পরীক্ষার জন্য এনক্যাপস্যুলেশন শিথিল না চাই, বরং dp4j.com ব্যবহার
সমমনস্ক

0

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


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

0

"আমার ব্যক্তিগত পদ্ধতি পরীক্ষা করা উচিত?" এর উত্তর "....... কখনও কখনও" হয়। সাধারণত আপনার ক্লাসগুলির ইন্টারফেসের বিরুদ্ধে পরীক্ষা করা উচিত।

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

এখানে একটি উদাহরণ:

class Thing
  def some_string
    one + two
  end

  private 

  def one
    'aaaa'
  end

  def two
    'bbbb'
  end

end


class RefactoredThing
def some_string
    one + one_a + two + two_b
  end

  private 

  def one
    'aa'
  end

  def one_a
    'aa'
  end

  def two
    'bb'
  end

  def two_b
    'bb'
  end
end

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

def some_string_positioner
  if some case
  elsif other case
  elsif other case
  elsif other case
  else one more case
  end
end

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

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


0

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


0

একটি মূল বিষয় হল

যদি আমরা যুক্তিটির যথার্থতা নিশ্চিত করার জন্য পরীক্ষা করি এবং একটি ব্যক্তিগত পদ্ধতি একটি যুক্তি বহন করে তবে আমাদের এটি পরীক্ষা করা উচিত। তাই না? তাহলে আমরা কেন এড়িয়ে যাব?

পদ্ধতির দৃশ্যমানতার ভিত্তিতে পরীক্ষা লেখার বিষয়টি সম্পূর্ণ অপ্রাসঙ্গিক ধারণা।

বিপরীতক্রমে

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

যদিও পাওয়ার মকের মতো কিছু সরঞ্জাম রয়েছে যা এটি সমর্থন করে, এটি একটি বিপজ্জনক অপারেশন। কারণটি হ'ল এটি অর্জনের জন্য জেভিএম হ্যাক করা দরকার।

তার চারপাশের একটি কাজ করা যেতে পারে (আপনি যদি ব্যক্তিগত পদ্ধতির জন্য পরীক্ষার কেসগুলি লিখতে চান)

সুরক্ষিত হিসাবে সেই ব্যক্তিগত পদ্ধতিগুলি ঘোষণা করুন । তবে এটি বেশ কয়েকটি পরিস্থিতিতে সুবিধাজনক হতে পারে না।


0

এটি শুধুমাত্র সরকারী বা ব্যক্তিগত পদ্ধতি বা ফাংশন সম্পর্কে নয়, এটি বাস্তবায়নের বিশদ সম্পর্কে। ব্যক্তিগত ফাংশনগুলি বাস্তবায়নের বিশদগুলির একমাত্র দিক।

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

ক) হ্যাঁ, আপনার প্রয়োগের বিশদ পরীক্ষা করা উচিত:

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

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

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

খ) বাস্তবায়নের বিশদটি কীভাবে পরীক্ষা করবেন

অনেকের ব্যক্তিগত বিতর্ক বা প্রয়োগের বিশদ পরীক্ষা না করা উচিত বলে একটি কারণ হ'ল বাস্তবায়নের বিশদগুলি পরিবর্তিত হওয়ার সম্ভাবনা বেশি। অন্তত পরিবর্তনের এই উচ্চতর সম্ভাবনা হ'ল ইন্টারফেসের পিছনে বাস্তবায়ন বিবরণ গোপন করার অন্যতম কারণ reasons

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

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

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

তবুও, "সামনের দরজাটি" ব্যবহার করার জন্য এটি থাম্বের একটি ভাল নিয়ম (দেখুন http://xunitpatterns.com/Pr پرنسپلز ৯০২০৯৯০৯০ টেস্ট ৯২০ অটোমেশন এইচটিএমএল )। তবে মনে রাখবেন যে এটি "সামনের দরজা প্রথমে" এবং "কেবলমাত্র সামনের দরজা" নয় called

গ) সংক্ষিপ্তসার

বাস্তবায়নের বিশদটিও পরীক্ষা করুন। স্থিতিশীল ইন্টারফেসে (পাবলিক বা বেসরকারী) টেস্টিং পছন্দ করুন। যদি প্রয়োগের বিশদ পরিবর্তন হয় তবে সর্বজনীন এপিআই-তে পরীক্ষাগুলিও সংশোধন করা দরকার। ব্যক্তিগতকে কোনও কিছুতে জনসাধারণে পরিণত করা যাদুতে এটির স্থায়িত্ব পরিবর্তন করে না।


0

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

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

public bool allPrime(int a, int b, int c)
{
  return andAll(isPrime(a), isPrime(b), isPrime(c))
}

private bool andAll(bool... boolArray)
{
  foreach (bool b in boolArray)
  {
    if(b == false) return false;
  }
  return true;
}

private bool isPrime(int x){
  //Implementation to go here. Sorry if you were expecting a prime sieve.
}

এখন, যদি আমরা যে শুধুমাত্র সরকারী কার্যক্রম পরিচালনার পরীক্ষা করা উচিত কঠোর অভিগমন ছিল, আমরা কেবল পরীক্ষা করার অনুমতি দেওয়া হবে না allPrimeএবং isPrimeবা andAll

একজন পরীক্ষক হিসেবে, আমরা প্রতিটি যুক্তি জন্য পাঁচটি সম্ভাবনার আগ্রহী হতে পারে: < 0, = 0, = 1, prime > 1, not prime > 1। তবে পুঙ্খানুপুঙ্খভাবে বলতে গেলে আমাদের দেখতে হবে আর্গুমেন্টের প্রতিটি সংমিশ্রণ কীভাবে একসাথে অভিনয় করে। সুতরাং যে 5*5*5= 125 পরীক্ষার ক্ষেত্রে আমাদের অন্তর্নিহিত অনুসারে আমাদের এই ফাংশনটি ভালভাবে পরীক্ষা করা দরকার।

অন্যদিকে, যদি আমাদের ব্যক্তিগত ফাংশনগুলি পরীক্ষা করার অনুমতি দেওয়া হয়, তবে আমরা কম পরীক্ষার ক্ষেত্রে যতটা ক্ষেত্রটি coverেকে দিতে পারি। isPrimeআমাদের পূর্ববর্তী স্বজ্ঞাত হিসাবে একই স্তরে পরীক্ষা করতে আমাদের কেবলমাত্র 5 টি পরীক্ষার প্রয়োজন হবে । এবং ড্যানিয়েল জ্যাকসন প্রস্তাবিত ছোট স্কোপ অনুমান দ্বারা, আমাদের কেবলমাত্র andAllএকটি ছোট দৈর্ঘ্যের উদাহরণস্বরূপ 3 বা 4 পর্যন্ত ফাংশনটি পরীক্ষা করা দরকার যা সবচেয়ে বেশি 16 টি পরীক্ষা হবে। মোট 21 টি পরীক্ষা। অবশ্যই 125 এর পরিবর্তে to অবশ্যই আমরা কয়েকটি পরীক্ষা চালাতে চাই allPrime, তবে আমরা ইনপুট পরিস্থিতিগুলির সমস্ত 125 সংমিশ্রণকে পরিচ্ছন্নভাবে আবরণ করতে বাধ্য বোধ করব না আমরা বলেছিলাম যে আমরা যত্নশীল। মাত্র কয়েকটি সুখী পথ।

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


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

ম্যাট হ্যাঁ উদাহরণটি আদর্শ নয় আমি আপনাকে এটি দেব। তবে নীতিটি সুস্পষ্ট হওয়া উচিত।
কলম্ব ভান্ডাল

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

0

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

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