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


479

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

এটি করার সঠিক উপায় কী?


3
আমি কিছু অনুপস্থিত হতে পারি, বা সম্ভবত এটি কেবল এই যে প্রশ্নটি pre-historicইন্টারনেট ইন্টারনেট বছরের ক্ষেত্রে, তবে ব্যক্তিগত পদ্ধতিগুলির ইউনিট টেস্টিং এখন সহজ এবং সোজা এগিয়ে উভয়ই, যখন ভিজুয়াল স্টুডিও প্রয়োজনীয় অ্যাক্সেসর ক্লাস উত্পাদন করে এবং প্রয়োজন হয় প্রাক-ভরাট পরীক্ষার যুক্তি স্নিপেটের সাথে অভিশাপ দিয়ে যে কেউ সাধারণ কার্যকরী পরীক্ষার জন্য যা চাইবে তার কাছাকাছি। যেমন দেখুন। msdn.microsoft.com/en-us/library/ms184807%28VS.90%29.aspx
mjv

3
এটি স্ট্যাকওভারফ্লো . com / জিজ্ঞাসাগুলি / 45৪৫71১ / এর কাছাকাছি সদৃশ বলে মনে হচ্ছে ।
রায়েডওয়াল্ড

প্রশ্নকর্তা ভিজ্যুয়াল স্টুডিওটি ব্যবহার করছেন না
ডেভ

3
ইন্টার্নাল ইউনিট পরীক্ষা করবেন না: blog.ploeh.dk/2015/09/22/unit-testing-internals
মার্ক

উত্তর:


122

আপনি যদি নেট ব্যবহার করে থাকেন তবে আপনার ইন্টারনালভিসিবলটোঅ্যাট্রিবিউট ব্যবহার করা উচিত ।


86
ইশ। এটি আপনার প্রকাশিত সমাবেশগুলিতে সংকলিত হয়।
জে

14
@Jay - একটি ব্যবহার করা যায়নি #if DEBUGপ্রায় InternalsVisibleToনয় রিলিজ কোড প্রযোজ্য করা অ্যাট্রিবিউট?
এমপন্টিলো

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

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

6
@ জায়ে আমি জানি এটি কিছুটা দেরি করে আসছে, তবে একটি বিকল্প হ'ল মাইকের পরামর্শ মতো #if RELEASE_TESTচারপাশের InternalsVisibleToমতো কিছু ব্যবহার করা এবং আপনার প্রকাশের বিল্ড কনফিগারেশনের একটি অনুলিপি তৈরি করা যা সংজ্ঞায়িত করে RELEASE_TEST। আপনি আপনার রিলিজ কোডটি অনুকূলিতকরণের সাথে পরীক্ষা করতে পারেন তবে আপনি যখন মুক্তির জন্য তৈরি করবেন তখন আপনার পরীক্ষাগুলি বাদ দেওয়া হবে।
শাজ

349

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

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

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

15
পরীক্ষার প্রয়োগের অসুবিধাগুলি হ'ল আপনি যদি প্রয়োগের ক্ষেত্রে কোনও পরিবর্তন প্রবর্তন করেন তবে পরীক্ষাগুলি বিরতিতে ভঙ্গুর হবে। এবং এটি অনাকাঙ্ক্ষিত যেহেতু টিডিডিতে পরীক্ষাগুলি লেখার মতো রিফ্যাক্টরিং গুরুত্বপূর্ণ।
JtR

30
ঠিক আছে, আপনি যদি বাস্তবায়ন পরিবর্তন করেন তবে পরীক্ষাগুলি ভাঙ্গার কথা । টিডিডি মানে প্রথমে পরীক্ষাগুলি পরিবর্তন করা।
স্লেসকে

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

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

118

এটি ব্যক্তিগত পদ্ধতিগুলি পরীক্ষা করার জন্য দরকারী নাও হতে পারে। তবে আমি মাঝে মাঝে পরীক্ষার পদ্ধতিগুলি থেকে ব্যক্তিগত পদ্ধতিগুলি কল করতে চাই। পরীক্ষার ডেটা তৈরির জন্য কোড নকল রোধ করার জন্য বেশিরভাগ সময় ...

মাইক্রোসফ্ট এর জন্য দুটি প্রক্রিয়া সরবরাহ করে:

Accessors

  • শ্রেণীর সংজ্ঞাটির উত্স কোডটি যান
  • ক্লাসের নামে ডান ক্লিক করুন
  • "ব্যক্তিগত অ্যাক্সেসর তৈরি করুন" চয়ন করুন
  • যে প্রকল্পে অ্যাক্সেসরটি তৈরি করা উচিত তা চয়ন করুন => আপনি foo_accessor নামটি দিয়ে একটি নতুন ক্লাস শেষ করবেন। সংকলনের সময় এই শ্রেণিটি গতিশীলভাবে উত্পন্ন হবে এবং উপলব্ধ সকল সদস্যকে সর্বজনীনভাবে রক্ষা করবে।

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

প্রাইভেটঅবজেক্ট ক্লাসের অন্য উপায়টি হ'ল মাইক্রোসফ্ট.ভিজুয়াল স্টুডিও.স্টেস্টুলস.উনিটটেষ্টিং.প্রাইভেটঅজেক্ট

// Wrap an already existing instance
PrivateObject accessor = new PrivateObject( objectInstanceToBeWrapped );

// Retrieve a private field
MyReturnType accessiblePrivateField = (MyReturnType) accessor.GetField( "privateFieldName" );

// Call a private method
accessor.Invoke( "PrivateMethodName", new Object[] {/* ... */} );

2
আপনি কীভাবে ব্যক্তিগত স্ট্যাটিক পদ্ধতিগুলি চালিত করবেন?
StuperUser


3
ব্যক্তিগত পদ্ধতি পরীক্ষার অ্যাক্সেসর পদ্ধতিটি ভিএস ২০১১ এর পর থেকে অবহেলা করা হচ্ছে। ব্লগস.এমএসডিএন
সঞ্জিত মিসরা

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

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

78

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

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


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

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

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

6
@ ডিমা অবশ্যই যদি তখন কোনও সমস্যা হয় PrivMethod, কোন পরীক্ষা PubMethodযার উপর কলগুলি PrivMethodতা প্রকাশ করতে পারে? যখন আপনি আপনার পরিবর্তন কি হবে SimpleSmtpServiceএকটি করতে GmailService? হঠাৎ আপনার সমস্ত ব্যক্তিগত পরীক্ষাগুলি কোডের দিকে ইঙ্গিত করছে যা অস্তিত্বহীন বা সম্ভবত অন্যরকমভাবে কাজ করে এবং ব্যর্থ হয়, যদিও অ্যাপ্লিকেশনটি নকশা অনুসারে পুরোপুরি কাজ করতে পারে। যদি এমন জটিল প্রক্রিয়াজাতকরণ থাকে যা ইমেল প্রেরকদের উভয়ের জন্যই প্রযোজ্য, সম্ভবত এটি এমন কোনও হওয়া উচিত EmailProcessorযা উভয়ই ব্যবহার করতে পারবেন এবং পৃথকভাবে পরীক্ষা করতে পারবেন?
বেসিক

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

51

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

শ্রেণী:

...

protected void APrivateFunction()
{
    ...
}

...

পরীক্ষার জন্য সাবক্লাস:

...

[Test]
public void TestAPrivateFunction()
{
    APrivateFunction();
    //or whatever testing code you want here
}

...

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

আমি যদি সবসময় সম্ভব হয় তবে ইউনিট টেস্ট প্রকল্পে সমস্ত পরীক্ষার সাথে সম্পর্কিত কোডটি রেখেছি। এটি স্রেস্টো কোড ছিল was
জেসন জ্যাকসন

2
এই ফাংশনটি ব্যক্তিগত নয়, এর সুরক্ষিত, নেট ফলাফল ... আপনি নিজের কোডটি কম সুরক্ষিত করেছেন / শিশু প্রকারের ব্যক্তিগত কার্যকারিতা থেকে উন্মুক্ত করেছেন
যুদ্ধ

22

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

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

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

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

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

অবশ্যই আপনার যদি কোনও উত্তরাধিকারের আবেদন থাকে তবে ব্যক্তিগত পদ্ধতিগুলির পরীক্ষা সরাসরি শেষ অবলম্বন হতে পারে তবে আমি পছন্দ করি যে উত্তরাধিকার কোডটি আরও ভাল পরীক্ষার সক্ষম করার জন্য রিফেক্টরেড হয়। মাইকেল ফেদারস খুব এই বিষয়ে একটি দুর্দান্ত বই লিখেছেন। http://www.amazon.co.uk/Working-Effectively-Legacy-Robert-Martin/dp/0131177052


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

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

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

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

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

17

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

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

এইভাবে অ্যাক্সেসপ্রাইভেট্র্যাপারের জন্ম হয় - http://amazedsaint.blogspot.com/2010/05/accessprivatewrapper-c-40-dynamic.html - এটি একটি দ্রুত মোড়কের ক্লাস যা C # 4.0 গতিশীল বৈশিষ্ট্য এবং প্রতিবিম্ব ব্যবহার করে কাজটিকে সহজ করে তুলবে।

আপনি অভ্যন্তরীণ / ব্যক্তিগত ধরণের পছন্দ তৈরি করতে পারেন

    //Note that the wrapper is dynamic
    dynamic wrapper = AccessPrivateWrapper.FromType
        (typeof(SomeKnownClass).Assembly,"ClassWithPrivateConstructor");

    //Access the private members
    wrapper.PrivateMethodInPrivateClass();

12

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

  1. আপনি PrivateObjectশ্রেণীর উদাহরণ তৈরি করতে পারেন সিনট্যাক্সটি নিম্নরূপ

    PrivateObject obj= new PrivateObject(PrivateClass);
    //now with this obj you can call the private method of PrivateCalss.
    obj.PrivateMethod("Parameters");
  2. আপনি প্রতিবিম্ব ব্যবহার করতে পারেন।

    PrivateClass obj = new PrivateClass(); // Class containing private obj
    Type t = typeof(PrivateClass); 
    var x = t.InvokeMember("PrivateFunc", 
        BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Public |  
            BindingFlags.Instance, null, obj, new object[] { 5 });

ভাল উত্তর, কিন্তু # 1 এর জন্য আপনার বাক্য গঠন ভুল। আপনাকে PrivateClassপ্রথমে একটি উদাহরণ ঘোষণা করতে হবে এবং এটি ব্যবহার করতে হবে। stackoverflow.com/questions/9122708/...
SharpC

10

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

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


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

9

এখানে 2 ধরণের ব্যক্তিগত পদ্ধতি রয়েছে। স্ট্যাটিক প্রাইভেট পদ্ধতি এবং নন স্ট্যাটিক ব্যক্তিগত পদ্ধতি (তাত্ক্ষণিক পদ্ধতি)। নিম্নলিখিত 2 টি নিবন্ধগুলিতে উদাহরণ সহ বেসরকারী পদ্ধতি পরীক্ষা করার পদ্ধতি সম্পর্কে ব্যাখ্যা করা হয়েছে।

  1. ইউনিট পরীক্ষার স্থিতিশীল ব্যক্তিগত পদ্ধতি
  2. ইউনিট টেস্টিং নন স্ট্যাটিক ব্যক্তিগত পদ্ধতি

কিছু উদাহরণ সরবরাহ করুন, কেবল একটি লিঙ্ক দিন না
ভিনকুলিস

দেখতে কুরুচিপূর্ণ। ইন্টেলিজেন্স নেই। এমএস থেকে খারাপ সমাধান। আমি হতবাক!
অ্যালারি

ব্যক্তিগত স্ট্যাটিক পদ্ধতি পরীক্ষা করার সবচেয়ে সহজ উপায়
গ্রান্ট

8

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

[System.Diagnostics.DebuggerStepThrough()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TestTools.UnitTestGeneration", "1.0.0.0")]
    internal class BaseAccessor
    {

        protected Microsoft.VisualStudio.TestTools.UnitTesting.PrivateObject m_privateObject;

        protected BaseAccessor(object target, Microsoft.VisualStudio.TestTools.UnitTesting.PrivateType type)
        {
            m_privateObject = new Microsoft.VisualStudio.TestTools.UnitTesting.PrivateObject(target, type);
        }

        protected BaseAccessor(Microsoft.VisualStudio.TestTools.UnitTesting.PrivateType type)
            :
                this(null, type)
        {
        }

        internal virtual object Target
        {
            get
            {
                return m_privateObject.Target;
            }
        }

        public override string ToString()
        {
            return this.Target.ToString();
        }

        public override bool Equals(object obj)
        {
            if (typeof(BaseAccessor).IsInstanceOfType(obj))
            {
                obj = ((BaseAccessor)(obj)).Target;
            }
            return this.Target.Equals(obj);
        }

        public override int GetHashCode()
        {
            return this.Target.GetHashCode();
        }
    }

বেসএ্যাক্সেসর থেকে প্রাপ্ত ক্লাসগুলির সাথে

যেমন

[System.Diagnostics.DebuggerStepThrough()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TestTools.UnitTestGeneration", "1.0.0.0")]
internal class SomeClassAccessor : BaseAccessor
{

    protected static Microsoft.VisualStudio.TestTools.UnitTesting.PrivateType m_privateType = new Microsoft.VisualStudio.TestTools.UnitTesting.PrivateType(typeof(global::Namespace.SomeClass));

    internal SomeClassAccessor(global::Namespace.Someclass target)
        : base(target, m_privateType)
    {
    }

    internal static string STATIC_STRING
    {
        get
        {
            string ret = ((string)(m_privateType.GetStaticField("STATIC_STRING")));
            return ret;
        }
        set
        {
            m_privateType.SetStaticField("STATIC_STRING", value);
        }
    }

    internal int memberVar    {
        get
        {
            int ret = ((int)(m_privateObject.GetField("memberVar")));
            return ret;
        }
        set
        {
            m_privateObject.SetField("memberVar", value);
        }
    }

    internal int PrivateMethodName(int paramName)
    {
        object[] args = new object[] {
            paramName};
        int ret = (int)(m_privateObject.Invoke("PrivateMethodName", new System.Type[] {
                typeof(int)}, args)));
        return ret;
    }

8
জেনড ফাইলগুলি কেবল ভিএস ২০০৫ এ বিদ্যমান। ২০০৮ সালে তারা পর্দার আড়ালে তৈরি হয়েছিল। এবং তারা একটি ঘৃণা। এবং সম্পর্কিত শ্যাডো টাস্কটি একটি বিল্ড সার্ভারে স্বচ্ছল।
রুবেন বারটেলিংক

এছাড়াও VS2012-2013 এ অ্যাক্সেসরগুলি হ্রাস করা হয়েছিল।
জাফান শ্রয়েডার

5

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

আপনি এখানে নিবন্ধ খুঁজে পেতে পারেন:

http://www.codeproject.com/KB/cs/testnonpublicmembers.aspx


4

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


11
আমি ইন্টারনালভিসিবলটো ব্যবহার পছন্দ করি না কারণ কারণটি কোনও কারণে আমি ব্যক্তিগতটিকে তৈরি করেছিলাম।
সুইলিয়াম

4

আমি সংকলক নির্দেশাবলী ব্যবহার না করার ঝোঁক করি কারণ তারা জিনিসগুলিকে দ্রুত বিশৃঙ্খল করে। আপনার যদি সত্যই তাদের প্রয়োজন হয় তা হ্রাস করার একটি উপায় হ'ল এটিকে আংশিক শ্রেণিতে স্থাপন করা এবং উত্পাদনের সংস্করণ তৈরি করার সময় আপনার বিল্ডটি সেই .cs ফাইলটিকে উপেক্ষা করা উচিত।


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

4

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

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

আপনার এই কারণে ইন্টার্নালভিসিবলটোআউট্রিবিউট ব্যবহার করা এড়ানো উচিত।

এখানে ইয়ান কুপারের একটি দুর্দান্ত আলোচনা রয়েছে যা এই বিষয়টিকে কভার করে: ইয়ান কুপার: টিডিডি, এটি কোথায় ভুল হয়েছে?


3

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

এজন্য আমরা আরও সহজ পরীক্ষা করার জন্য ভিজ্যুয়াল টি #: তৈরি করেছি। এটি একটি ফ্রি। নেট প্রোগ্রামিং ভাষা (সি # ভি 2.0 সামঞ্জস্যপূর্ণ)।

আমরা '.-' অপারেটর যুক্ত করেছি। এটি ঠিক 'এর মতো আচরণ করে।' অপারেটর, আপনি ব্যতীত আপনার পরীক্ষিত প্রকল্পের কোনও পরিবর্তন না করেও পরীক্ষা থেকে কোনও গোপন ঘোষণাকে অ্যাক্সেস করতে পারেন।

আমাদের ওয়েব সাইটে কটাক্ষপাত: ডাউনলোড এটা বিনামূল্যে জন্য


3

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

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


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

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

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

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

3

আমি এখানে একটি স্পষ্ট কোড উদাহরণ তৈরি করতে চাই যা আপনি যে কোনও ক্লাসে ব্যবহার করতে পারেন যেখানে আপনি ব্যক্তিগত পদ্ধতি পরীক্ষা করতে চান।

আপনার পরীক্ষার ক্ষেত্রে শ্রেণিতে কেবল এই পদ্ধতিগুলি অন্তর্ভুক্ত করুন এবং তারপরে ইঙ্গিত অনুসারে এগুলি নিয়োগ করুন।

  /**
   *
   * @var Class_name_of_class_you_want_to_test_private_methods_in
   * note: the actual class and the private variable to store the 
   * class instance in, should at least be different case so that
   * they do not get confused in the code.  Here the class name is
   * is upper case while the private instance variable is all lower
   * case
   */
  private $class_name_of_class_you_want_to_test_private_methods_in;

  /**
   * This uses reflection to be able to get private methods to test
   * @param $methodName
   * @return ReflectionMethod
   */
  protected static function getMethod($methodName) {
    $class = new ReflectionClass('Class_name_of_class_you_want_to_test_private_methods_in');
    $method = $class->getMethod($methodName);
    $method->setAccessible(true);
    return $method;
  }

  /**
   * Uses reflection class to call private methods and get return values.
   * @param $methodName
   * @param array $params
   * @return mixed
   *
   * usage:     $this->_callMethod('_someFunctionName', array(param1,param2,param3));
   *  {params are in
   *   order in which they appear in the function declaration}
   */
  protected function _callMethod($methodName, $params=array()) {
    $method = self::getMethod($methodName);
    return $method->invokeArgs($this->class_name_of_class_you_want_to_test_private_methods_in, $params);
  }

$ এটি -> _ কলমেথোড ('_ কিছু ফাংশননাম', অ্যারে (প্যারাম 1, প্যারাম 2, প্যারাম 3));

কেবলমাত্র প্যারামিটারগুলি ক্রম যাতে তারা ব্যক্তিগত ব্যক্তিগত ফাংশনে উপস্থিত হয় তা জারি করুন


3

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

public class ReflectionTools
{
    // If the class is non-static
    public static Object InvokePrivate(Object objectUnderTest, string method, params object[] args)
    {
        Type t = objectUnderTest.GetType();
        return t.InvokeMember(method,
            BindingFlags.InvokeMethod |
            BindingFlags.NonPublic |
            BindingFlags.Instance |
            BindingFlags.Static,
            null,
            objectUnderTest,
            args);
    }
    // if the class is static
    public static Object InvokePrivate(Type typeOfObjectUnderTest, string method, params object[] args)
    {
        MemberInfo[] members = typeOfObjectUnderTest.GetMembers(BindingFlags.NonPublic | BindingFlags.Static);
        foreach(var member in members)
        {
            if (member.Name == method)
            {
                return typeOfObjectUnderTest.InvokeMember(method, BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.InvokeMethod, null, typeOfObjectUnderTest, args);
            }
        }
        return null;
    }
}

তারপরে আপনার আসল পরীক্ষায় আপনি এরকম কিছু করতে পারেন:

Assert.AreEqual( 
  ReflectionTools.InvokePrivate(
    typeof(StaticClassOfMethod), 
    "PrivateMethod"), 
  "Expected Result");

Assert.AreEqual( 
  ReflectionTools.InvokePrivate(
    new ClassOfMethod(), 
    "PrivateMethod"), 
  "Expected Result");

2

এমবিউনিত এই রিফ্লেক্টর নামে একটি দুর্দান্ত মোড়ক পেয়েছে।

Reflector dogReflector = new Reflector(new Dog());
dogReflector.Invoke("DreamAbout", DogDream.Food);

আপনি বৈশিষ্ট্য থেকে মান সেট করতে এবং পেতে পারেন

dogReflector.GetProperty("Age");

"ব্যক্তিগত বেসরকারী পরীক্ষার" বিষয়ে আমি সম্মত তা .. নিখুঁত বিশ্বে। বেসরকারী ইউনিট পরীক্ষা করার কোনও মানে নেই। তবে বাস্তব বিশ্বে আপনি হয়ত রিফ্যাক্টরিং কোডের পরিবর্তে ব্যক্তিগত পরীক্ষা লিখতে চান।


4
কেবল তথ্যের জন্য, গ্যালিও / এমবিউনিত ভি 3.2 তে Reflectorআরও শক্তিশালী দ্বারা প্রতিস্থাপিত হয়েছে Mirror। ( gallio.org/wiki/doku.php?id=mbunit:mirror )
ইয়ান ট্রেভিন

2

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


2

আমার মতে আপনি কেবল আপনার সংঘর্ষের পাবলিক এপিআই পরীক্ষা করতে হবে।

কোনও পদ্ধতিটিকে জনসম্মুখে তৈরি করার জন্য, এটি পরীক্ষা করার জন্য, এনক্যাপসুলেশনটি বাস্তবায়নের বিশদটি প্রকাশ করে।

একটি ভাল পাবলিক এপিআই ক্লায়েন্ট কোডের একটি তাত্ক্ষণিক লক্ষ্য সমাধান করে এবং সেই লক্ষ্যটিকে পুরোপুরি সমাধান করে।


এটি সঠিক উত্তর আইএমও হওয়া উচিত। আপনার যদি ব্যক্তিগত প্রচুর পদ্ধতি থাকে তবে এটি সম্ভবত আপনার কোনও গোপন বর্গ থাকার কারণে এটির নিজস্ব পাবলিক ইন্টারফেসে প্রবেশ করা উচিত।
23'17

2

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

Class target = new Class();
PrivateObject obj = new PrivateObject(target);
var retVal = obj.Invoke("PrivateMethod");
Assert.AreEqual(retVal);

2
CC -Dprivate=public

"সিসি" হ'ল আমি যে সিস্টেমটি ব্যবহার করি তার কমান্ড লাইন সংকলক। -Dfoo=barসমতুল্য করে #define foo bar। সুতরাং, এই সংকলন বিকল্পটি কার্যকরভাবে সমস্ত ব্যক্তিগত স্টাফটিকে জনসাধারণে পরিবর্তন করে।


2
এটা কি? এটি কি ভিজ্যুয়াল স্টুডিওতে প্রযোজ্য?
ইয়েস্টু

"সিসি" হ'ল আমি যে সিস্টেমটি ব্যবহার করি তার কমান্ড লাইন সংকলক। "-Dfoo = বার" "# ডিফাইন ফু বার" এর সমতুল্য কাজ করে। সুতরাং, এই সংকলন বিকল্পটি কার্যকরভাবে সমস্ত ব্যক্তিগত স্টাফটিকে জনসাধারণে পরিবর্তন করে। হা হা!
মার্ক হ্যারিসন

ভিজ্যুয়াল স্টুডিওতে, আপনার বিল্ড এনভায়রনমেন্টে একটি সংজ্ঞা সেট করুন।
মার্ক হ্যারিসন

1

এখানে একটি উদাহরণ রয়েছে, প্রথমে পদ্ধতিটির স্বাক্ষর:

private string[] SplitInternal()
{
    return Regex.Matches(Format, @"([^/\[\]]|\[[^]]*\])+")
                        .Cast<Match>()
                        .Select(m => m.Value)
                        .Where(s => !string.IsNullOrEmpty(s))
                        .ToArray();
}

পরীক্ষাটি এখানে:

/// <summary>
///A test for SplitInternal
///</summary>
[TestMethod()]
[DeploymentItem("Git XmlLib vs2008.dll")]
public void SplitInternalTest()
{
    string path = "pair[path/to/@Key={0}]/Items/Item[Name={1}]/Date";
    object[] values = new object[] { 2, "Martin" };
    XPathString xp = new XPathString(path, values);

    PrivateObject param0 = new PrivateObject(xp);
    XPathString_Accessor target = new XPathString_Accessor(param0);
    string[] expected = new string[] {
        "pair[path/to/@Key={0}]",
        "Items",
        "Item[Name={1}]",
        "Date"
    };
    string[] actual;
    actual = target.SplitInternal();
    CollectionAssert.AreEqual(expected, actual);
}

1

এটি করার একটি উপায় হ'ল আপনার পদ্ধতিটি রয়েছে protectedএবং একটি পরীক্ষা স্থিতি লিখুন যা পরীক্ষার জন্য আপনার শ্রেণীর উত্তরাধিকার সূত্রে আসে। এইভাবে, আপনি বা আপনার পদ্ধতিটি ঘুরিয়ে দিচ্ছেন না publicতবে আপনি পরীক্ষাটি সক্ষম করেছেন।


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

1

1) আপনার যদি লিগ্যাসি কোড থাকে তবে ব্যক্তিগত পদ্ধতিগুলি পরীক্ষা করার একমাত্র উপায় হ'ল প্রতিচ্ছবি।

2) এটি যদি নতুন কোড হয় তবে আপনার নিম্নলিখিত বিকল্পগুলি রয়েছে:

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

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


1

ডিবাগ-মোডে তৈরি করার সময় আপনি এটিকে সর্বজনীন বা অভ্যন্তরীণ হিসাবেও ঘোষণা করতে পারেন (ইন্টার্নালভিজিবলটোঅ্যাট্রিবিউট সহ):

    /// <summary>
    /// This Method is private.
    /// </summary>
#if DEBUG
    public
#else
    private
#endif
    static string MyPrivateMethod()
    {
        return "false";
    }

এটি কোডটি ফুলে যায় তবে এটি privateএকটি রিলিজ বিল্ডে থাকবে।


0

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

http://msdn.microsoft.com/en-us/library/bb385974.aspx


0

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


2
না, InternalsVisibleToAttributeনেই না প্রয়োজন, আপনার সমাহারগুলি জোরালোভাবে নামে। আমি বর্তমানে এটি এমন একটি প্রকল্পে ব্যবহার করছি যেখানে এটির ক্ষেত্রে নেই।
কোডি গ্রে

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