আপনি কি একই প্রকল্পে বা অন্য কোনও প্রকল্পে ইউনিট পরীক্ষা রাখেন?


137

আপনি কি সুবিধার্থে একই প্রকল্পে ইউনিট পরীক্ষা রেখেছেন বা এগুলি আলাদা কোনও সমাবেশে রেখেছেন?

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

উত্তর:


100

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

  1. ইউনিট পরীক্ষাগুলি উত্পাদন কোড সহ প্রেরণ করা হয়। প্রোডাক্ট কোড দিয়ে পাঠানো একমাত্র জিনিস হ'ল প্রোডাকশন কোড।
  2. অ্যাসেম্বলিগুলি অকারণে ইউনিট পরীক্ষাগুলি দ্বারা প্রস্ফুটিত হবে।
  3. ইউনিট পরীক্ষাগুলি স্বয়ংক্রিয় বা অবিচ্ছিন্ন বিল্ডের মতো বিল্ড প্রক্রিয়াগুলিকে প্রভাবিত করতে পারে।

আমি আসলে কোন উপকার সম্পর্কে জানি না। একটি অতিরিক্ত প্রকল্প (বা 10) থাকা কোনও শঙ্কা নয়।

সম্পাদনা করুন: বিল্ড এবং শিপিংয়ের আরও তথ্য

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

সংক্ষিপ্তসার হিসাবে, এখানে একটি বিট এবং অন্যান্য ফাইলগুলির প্রতিদিনের বিল্ডিং এবং পরীক্ষার এবং শিপিংয়ের সাধারণ ধারণাটি রয়েছে:

  1. উত্পাদন বিল্ড রান, একটি নির্দিষ্ট "উত্পাদন" ডিরেক্টরিতে উত্পাদন ফাইল স্থাপন।
    1. শুধুমাত্র উত্পাদন প্রকল্পগুলি তৈরি করুন।
    2. সংকলিত বিট এবং অন্যান্য ফাইলগুলিকে একটি "উত্পাদন" ডিরেক্টরিতে অনুলিপি করুন।
    3. রিলিজ প্রার্থী ডিরেক্টরিতে বিট এবং অন্যান্য ফাইলগুলি অনুলিপি করুন, ক্রিসমাসের মুক্তির ডিরেক্টরিটি হবে "রিলিজ ২০০81225"।
  2. যদি উত্পাদন বিল্ড সফল হয়, ইউনিট পরীক্ষা বিল্ড রান করে runs
    1. "টেস্ট" ডিরেক্টরিতে প্রোডাকশন কোডটি অনুলিপি করুন।
    2. "পরীক্ষা" ডিরেক্টরিতে ইউনিট পরীক্ষাগুলি তৈরি করুন।
    3. ইউনিট পরীক্ষা চালান।
  3. বিকাশকারীদের বিল্ড বিজ্ঞপ্তি এবং ইউনিট পরীক্ষার ফলাফল প্রেরণ করুন।
  4. যখন কোনও রিলিজ প্রার্থী (যেমন রিলিজ ২০০81225) গৃহীত হয়, তখন এই বিটগুলি প্রেরণ করুন।

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

7
আপনার প্রথমে জিজ্ঞাসা করা উচিত যে আপনি যখন চালাবেন তখন আপনাকে পরীক্ষাগুলি অপসারণ করা দরকার কিনা। যদি হ্যাঁ, আপনার একটি পৃথক প্রকল্পের প্রয়োজন। যদি তা না হয় তবে সিদ্ধান্ত নিতে অন্য উপকারিতা এবং কনস ব্যবহার করুন। লোকেরা ধরে নেয় যে তারা পরীক্ষাগুলি মোতায়েন করতে পারে না তারা সর্বদা ডিফল্টরূপে "পৃথক প্রকল্প" উপসংহারে পৌঁছায়।
orip

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

4
উত্পাদন কোডে ইউনিট পরীক্ষা অপসারণের জন্য "পৃথক প্রকল্প" পদ্ধতির বিকল্প হিসাবে, একটি কাস্টম প্রতীক এবং সংকলক নির্দেশাবলী ব্যবহার বিবেচনা করুন #if। আপনার সিআই সফ্টওয়্যার স্ক্রিপ্টগুলিতে সংকলক কমান্ড-লাইন প্যারামিটার ব্যবহার করে এই কাস্টম প্রতীকটি টগল করা যেতে পারে। এমএসডিএন.মাইক্রোসফটকম /en-us/library/4y6tbswk.aspx দেখুন ।
ধনী সি

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

112

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

পৃথক প্রকল্পের কারণগুলি অন্যরা বলেছেন। নোট করুন যে আপনি যদি ডেটা-চালিত পরীক্ষাগুলি ব্যবহার করে থাকেন, তবে আপনি যদি পরীক্ষামূলকভাবে সমাবেশে পরীক্ষাগুলি অন্তর্ভুক্ত করেন তবে আপনি যথেষ্ট পরিমাণে ফোলা শেষ করতে পারেন।

আপনি উৎপাদন কোডের অভ্যন্তরীণ সদস্যদের অ্যাক্সেস প্রয়োজন করেন, ব্যবহার InternalsVisibleTo


+1: আমি কেবলমাত্র মূল প্রকল্প হিসাবে একই প্রকল্পে ইউনিট পরীক্ষার মুখোমুখি হয়েছি এবং নামকরণের সম্মেলন অনুসরণ করা সত্ত্বেও বাস্তব কোডটির মধ্যে পরীক্ষাগুলি খুঁজে পাওয়া শক্ত is
ফেন্টন

32
কম অভিজ্ঞ পাঠকের [assembly:InternalsVisibleTo("UnitTestProjectName")]জন্য এটি আপনার প্রকল্পের AssemblyInfo.csফাইলটিতে যুক্ত করা।
মার্গাস

মার্গাস খুব দরকারী সংযোজন। এই প্রসঙ্গে ইন্টারনালভিসিবলটো উল্লেখ করার জন্য জনকে ধন্যবাদ জানাই।
Bjørn Otto Vasbotten

1
@ জ্রোপেলা: আপনি যদি প্রড অ্যাসেমব্লিকে স্বাক্ষর করেন তবে আপনি কেবলমাত্র স্বাক্ষরিত সমাবেশগুলিতে ইন্টার্নালদের দৃশ্যমান করতে পারবেন। এবং অবশ্যই যদি আপনি কোনও বিশ্বাসের সাথে পুরো ভরসা চালাচ্ছেন তবে তাদের প্রতিবিম্বের মাধ্যমে অ্যাক্সেস থাকতে পারে ...
জন স্কিপ

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

70

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

আমি একই প্রকল্পে আমার পরীক্ষাগুলি সি # /। নেট / ভিজ্যুয়াল স্টুডিও ২০০৮-তে রাখতে চাই, তবে আমি এখনও এটি অর্জনের জন্য তদন্ত করতে পারি নি।

FooTest.cs হিসাবে একই প্রকল্পে Foo.cs রাখার একটি বড় সুবিধা হ'ল বিকাশকারীরা ক্রমাগত স্মরণ করিয়ে দেওয়া হয় যখন কোনও শ্রেণি একটি ভাইবোন পরীক্ষা মিস করে না! এটি আরও ভাল পরীক্ষা-চালিত কোডিং অনুশীলনকে উত্সাহ দেয় ... গর্তগুলি আরও স্পষ্ট।


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

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

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

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

19

আরও ভাল এনক্যাপসুলেশন অর্জনের জন্য কোড হিসাবে একই প্রকল্পে ইউনিট পরীক্ষা করুন।

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

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

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

স্বয়ংক্রিয় ইন্টিগ্রেশন টেস্টগুলি (iNUnit বানানো) একটি পৃথক প্রকল্পে হওয়া উচিত কারণ সেগুলি কোনও একক প্রকল্পের নয়।


1
তবে এর অর্থ আপনি পরীক্ষাগুলি চালাতে পারবেন না Release বিল্ডে এবং কয়েকটি "হাইসেনব্যাগস" এর মধ্যে পড়তে পারে।
এইচপিপি

3
বন্ধু সমাবেশগুলির সাথে ( এমএসডিএন.মাইক্রোসফটকম /en-us/library/0tke9fxk.aspx ) InternalsVisibleToআপনাকে পৃথক পরীক্ষার প্রকল্প থেকে অভ্যন্তরীণ পদ্ধতিগুলি পরীক্ষা করতে দেয়
পারক্স

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

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

12

টাইপস্ক্রিপ্ট প্রকল্পগুলিতে কিছু সময় ব্যয় করার পরে, যেখানে টেস্টগুলি কোডগুলি টেস্টিংয়ের পাশাপাশি প্রায়শই একটি ফাইলে রাখা হয়, সেগুলি আলাদা রাখার চেয়ে আমি এই পদ্ধতির পছন্দ করতে বাড়িয়েছিলাম:

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

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

প্রকল্পের ফাইলে নিম্নলিখিত লাইনগুলি লাগানো এখন পর্যন্ত ভালভাবে কাজ করছে বলে মনে হচ্ছে:

  <ItemGroup Condition="'$(Configuration)' == 'Release'">
    <Compile Remove="**\*.Tests.cs" />
  </ItemGroup>
  <ItemGroup Condition="'$(Configuration)' != 'Release'">
    <PackageReference Include="nunit" Version="3.11.0" />
    <PackageReference Include="NUnit3TestAdapter" Version="3.12.0" />
    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.9.0" />
  </ItemGroup>

উপরেরটি নিশ্চিত করে যে Release কনফিগারেশনে সমস্ত ফাইলের নাম নিশ্চিত করে*.Tests.cs সংকলন থেকে বাদ দেওয়া হয়েছে এবং প্রয়োজনীয় ইউনিট পরীক্ষার প্যাকেজ রেফারেন্সগুলি সরানো হয়েছে।

যদি আপনি এখনও তাদের মুক্তির কনফিগারেশনে ক্লাস পরীক্ষা করতে সক্ষম হতে চান তবে আপনি কেবল নতুন জাতীয় কনফিগারেশন তৈরি Releaseকরতে পারেন যা কিছু বলা হয়ReleaseContainingTests


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

ভিএস কোড স্ক্রিনশট

এটি করার জন্য, উপাদান আইকন থিম এক্সটেনশনটি ব্যবহার করুন এবং আপনার ভিএস কোড পছন্দসমূহ JSON এ নিম্নলিখিতগুলির মতো কিছু যুক্ত করুন:

"material-icon-theme.files.associations": {
  "*.Tests.cs": "test-jsx",
  "*.Mocks.cs": "merlin",
  "*.Interface.cs": "yaml",
}

ঠিক এখনই আমরা যা করতে শুরু করেছি
ম্যাথু স্টিপলস

আপনি। নেট স্ট্যান্ডার্ড ক্লাস লাইব্রেরি জন্য এই কাজ পেয়েছেন?
জেনুকা

10

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


1
তারপরে আপনি কীভাবে ইউনিট পরীক্ষা করবেন অভ্যন্তরীণ ক্লাস? নাকি আপনি কেবল পাবলিক ক্লাস পরীক্ষা করেন?
ব্যবহারকারী 19371

7
<সমাবেশ: ইন্টারনালভিজিবলটো = "টেস্টপ্রজেক্ট" /> যদি প্রয়োজন হয় তবে আমি সাধারণত পাবলিক ইন্টারফেস পরীক্ষা করি।
tvanfosson

@ ট্যানফানসন, আপনি স্পেস (স্পাফ্লো) দিয়ে কী করবেন? আপনি একটি পৃথক প্রকল্প আছে বা আপনি ইউনিট পরীক্ষা প্রকল্পে রাখবেন? +1 টি।
w0051977

@ w0051977 আমি কখনই স্পেসফ্লো ব্যবহার করি নি তাই আমি জানি না
tvanfosson

@ ট্যানফসন, ইন্টিগ্রেশন টেস্ট সম্পর্কে কী? আপনি তাদের ইউনিট পরীক্ষার জন্য একটি পৃথক প্রকল্পে রাখবেন?
w0051977

10

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

public static class Ext
{
     [TestCase(1.1, Result = 1)]
     [TestCase(0.9, Result = 1)]
     public static int ToRoundedInt(this double d)
     {
         return (int) Math.Round(d);
     }
}

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

আপডেট : আমি জানি যে TestCaseগুণাবলীর এ জাতীয় ব্যবহারের বিষয়টি নুনিটের বিকাশকারীরা করেননি, তবে কেন নয়?


2
আমি এই ধারনাটি পছন্দ করি; কোড সহ সঠিকভাবে ইনপুট এবং প্রত্যাশিত আউটপুটগুলির কয়েকটি উদাহরণ রয়েছে।
প্রেস্টন ম্যাককর্মিক

3

আমি একই প্রকল্প এবং বিভিন্ন প্রকল্পের মধ্যে ওঠানামা করি।

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

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


3

আমি তাদের আলাদা প্রকল্পে রেখেছি। সমাবেশের নামটি আমাদের জন্য একটি সাধারণ নিয়ম হিসাবে নামস্থানগুলিকে আয়না দেয়। সুতরাং যদি Company.Product.Feature.sln নামে একটি প্রকল্প থাকে তবে এর Company.Product.Feature.dll এর একটি আউটপুট (সমাবেশ নাম) রয়েছে। পরীক্ষার প্রকল্পটি হ'ল Company.Product.Feature.Tests.sln, উত্পাদনকারী Company.Product.Feature.Tests.dll।

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

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

এছাড়াও, আমরা বিল্ড মেশিনের XCopy ড্রপগুলি ব্যবহার করতাম। স্ক্রিপ্টটি *। টেস্ট.ডল নামক যে কোনও কিছু অনুলিপি করা বাদ দিবে deployed এটি ছিল সহজ, কিন্তু কাজ।


1

আমি বলব তাদের আলাদা রাখুন।

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


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

0

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

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


0

আমি জানি এটি একটি খুব পুরানো প্রশ্ন, তবে আমি সেখানে আমার অভিজ্ঞতা যুক্ত করতে চাই আমি সম্প্রতি ইউনিট পরীক্ষার অভ্যাসটি পৃথক প্রকল্প থেকে একই প্রকল্পে পরিবর্তন করেছি।

কেন?

প্রথম আমি পরীক্ষার প্রকল্পের সাথে মূল প্রকল্পের ফোল্ডারের কাঠামো একই রাখার প্রবণতা রাখি। সুতরাং, আমার কাছে যদি একটি ফাইল থাকেProviders > DataProvider > SqlDataProvider.cs তবে আমি আমার ইউনিট পরীক্ষার প্রকল্পগুলির মতো একই কাঠামো তৈরি করছিProviders > DataProvider > SqlDataProvider.Tests.cs

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

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

সম্প্রতি, আমি অনুশীলন শুরু করেছি যে, আমার তৈরি প্রতিটি ফাইল (উদাহরণস্বরূপ SqlDataProvider.cs) আমি টেস্ট প্রত্যয় সহ আরও একটি ফাইল তৈরি করছি, যেমনSqlDataProvider.Tests.cs

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

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

বিশেষত জে এবং পাইথনের জন্য আপনাকে বিভিন্ন রেফারেন্স থেকে আপনার রেফারেন্স আমদানি করতে হবে না, আপনি পরীক্ষার জন্য লক্ষ্য ফাইলের একই পথটি ব্যবহার করতে পারেন।

আমি এই অনুশীলনটি কিছু সময়ের জন্য ব্যবহার করছি এবং আমি মনে করি প্রকল্পের বনাম রক্ষণাবেক্ষণযোগ্যতা এবং প্রকল্পে নতুন আগতদের জন্য শেখার বক্ররেখার মধ্যে এটি খুব যুক্তিসঙ্গত বাণিজ্য বন্ধ is


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

0

অন্যরা যেমন উত্তর দিয়েছে - আলাদা প্রকল্পে পরীক্ষা দেয়

একটি জিনিস যা উল্লেখ করা হয়নি তা হ'ল আপনি আসলে ফাইল ব্যতীত nunit3-console.exeঅন্য কিছুতে চালাতে পারবেন না .dll

আপনি যদি টিমসিটির মাধ্যমে আপনার পরীক্ষা চালানোর পরিকল্পনা করছেন, এটি একটি সমস্যা তৈরি করবে।

ধরা যাক আপনার কাছে একটি কনসোল অ্যাপ্লিকেশন প্রকল্প রয়েছে। আপনি যখন কম্পাইল, এটি একটি এক্সিকিউটেবল ফেরৎ .exeকরার binফোল্ডার।

থেকে nunit3-console.exe আপনি সেই কনসোল অ্যাপ্লিকেশনটিতে সংজ্ঞায়িত কোনও পরীক্ষা চালাতে পারবেন না।

অন্য কথায়, একটি কনসোল অ্যাপ্লিকেশন একটি exeফাইল এবং একটি শ্রেণিকাল গ্রন্থাগার ফেরত দেয়dll ফাইলগুলি ।

আমি আজ এই দ্বারা কিছুটা পেলাম এবং এটি স্তন্যপান :(


0

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


-2

প্রকল্পগুলি পৃথক করুন, যদিও আমি নিজের সাথে বিতর্ক করি যে তাদের একই এসএনএন ভাগ করা উচিত। এই মুহুর্তে, আমি তাদের আলাদা আলাদা এসএনএন সংগ্রহস্থল দিচ্ছি, যার নাম

"মাইপ্রজেক্ট" - নিজেই প্রকল্পের জন্য

এবং একজন ডেকে আনে

"মাইপ্রজেক্ট টেস্টস" - মাইপ্রজেক্টের সাথে সম্পর্কিত পরীক্ষাগুলির জন্য।

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

তবে আমি প্রতিটি প্রকল্পের জন্য একটি একক এসএনএন সংগ্রহস্থলে নীচের মতো কিছু করার ঝোঁক করছি।

আমার প্রকল্প
| \ ট্রাঙ্ক
| | \ কোড
| \ টেস্ট
| \ ট্যাগ্স
| | \ 0.1
| | | \ কোড
| | \ টেস্ট
| \ 0.2
| | \ কোড
| \ টেস্ট
\শাখা
  \ MyFork
   | \ কোড
    \ টেস্ট

এই সমাধান সম্পর্কে অন্যান্য ব্যক্তিরা কী ভাবছেন তা জানতে আগ্রহী হব।


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