আপনি কি পরীক্ষার জন্য ব্যক্তিগত জিনিসগুলি অভ্যন্তরীণ / সর্বজনীন করে তুলবেন, বা প্রাইভেটঅবজেক্টের মতো কোনও ধরণের হ্যাক ব্যবহার করবেন?


26

আমি কোড টেস্টিংয়ে বেশ শিক্ষানবিস এবং assertআগে বেশ্যা ছিলাম । একটা জিনিষ আমাকে ইউনিট পরীক্ষার মধ্যে উদ্বেজক যে প্রায়ই হয় দরকার করা হয় public(বা অন্তত internal) ক্ষেত্র হত privateবিপর্যয়- করার অন্যথায়, readonlyতাদের করা privateপদ্ধতি protected virtualপরিবর্তে, ইত্যাদি ...

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

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


2
অজগরের লোকেরা কেবল সর্বজনীন থাকে। তারা খুশি। চিন্তিত কেন? কেন সব কিছু জনসমক্ষে করা হচ্ছে না?
এস। লট

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

2
@ রিগ: পাইথন একটি শীর্ষ ভাষা নয়? মজাদার.
এস। লট

7
"এটি শীর্ষ ভাষার বেশিরভাগ ক্ষেত্রে সেরা অনুশীলন থেকে অনেক দূরে" যৌক্তিকভাবে বোঝায় না (বা এও বোঝায়) "পাইথন একটি শীর্ষ ভাষা নয়"।
মাইক নকিস

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

উত্তর:


36

আপনার কখনই করা উচিত নয়

করতে public(বা অন্তত internal) ক্ষেত্র হত privateঅন্যথায়, নি: - থেকে readonlyতাদের করতে privateপদ্ধতি protected virtualপরিবর্তে

বিশেষত ক্ষেত্রটি অপ-পঠনযোগ্য একটি পরিবর্তনযোগ্য বস্তুকে পরিবর্তনীয় করে তুলতে পারে এবং এটি একটি বিপর্যয়।

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

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

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


2
একদম ঠিক! আপনি যদি প্রতিবিম্ব বা হ্যাক ছাড়া এটি পরীক্ষা করতে না পারেন তবে সম্ভবত আপনার এপিআই বা আপনার ডিজাইনে ভুল হয়েছে।
ফ্যালকন

আপনি কি বলছেন যে পরীক্ষায় ঠাট্টা করাতে সহায়তা করার জন্য privateপদ্ধতিগুলি তৈরি protected virtualকরা খারাপ অভ্যাস হিসাবে বিবেচিত হয়?
রবুলা

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

13

সি # তে আপনি যে InternalsVisibleToAttributeপরীক্ষাটি পরীক্ষা internalকরছেন তা আপনার পরীক্ষামূলক সমাবেশকে ক্লাসি দেখতে দেওয়ার জন্য এটি ব্যবহার করতে পারেন । মনে হচ্ছে আপনি এটি ইতিমধ্যে জানেন।

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

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


8

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

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

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

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

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


6

ব্যক্তিগতভাবে আমি কোডটি যতটা নিখুঁতভাবে পরীক্ষা করতে চলেছি ততটাই পছন্দ করি এবং যদি পরীক্ষার কোডটির হ্যাকের প্রয়োজন হয় (এবং সি ++ দুষ্টু পয়েন্টার ইত্যাদিতে) আমি এটি করতে পেরে খুশি।



1
আমি সম্মতি জানাই, এটি করার উপায় এটি। কৃপণতাটিকে পরীক্ষার কোডে রাখুন, যেখানে এটি কোনও ক্ষতি করতে পারে না।
অ্যালান ডেলিমন

@ অ্যালানডেলিমন এটি পরবর্তী রক্ষণাবেক্ষণ প্রোগ্রামারদের মনকে আঘাত করতে পারে না?
ফ্ল্যামিংপেনগুইন

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

2
@ ফ্লেমিংপেনগেইন এটি হতে পারে, তবে যদি আপনাকে কোথাও কুৎসিত কোড রাখতে হয় তবে এটি একটি ইউনিট পরীক্ষায়ও থাকতে পারে যেখানে এটির পরিবর্তনের প্রয়োজন হয় এবং অ্যাপ্লিকেশনটির অংশ হতে পারে likely
অ্যালান ডেলিমন

5

আপনার ইউনিটের পরীক্ষাগুলির সাথে আপনার কোডটির দৃশ্যমানতার কোনও সম্পর্ক নেই!

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

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

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