একমাত্র যুক্তি রক্ষাকারী যেখানে পরীক্ষা করার পদ্ধতিগুলি কি এটি কার্যকর?


12

বলুন আমার এর মতো একটি পদ্ধতি রয়েছে:

public void OrderNewWidget(Widget widget)
{
   if ((widget.PartNumber > 0) && (widget.PartAvailable))
   {
        WigdetOrderingService.OrderNewWidgetAsync(widget.PartNumber);
   }
}

আমার কোডে এ জাতীয় বেশ কয়েকটি পদ্ধতি রয়েছে (একটি অ্যাসিঙ্ক ওয়েব পরিষেবা কলের সামনের অর্ধেক)।

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

আমার অংশ বলেছে "নিশ্চিত যে আপনি এগুলি পরীক্ষা করতে পারবেন তবে এটি সময়ের পক্ষে উপযুক্ত নয়" (আমি এমন একটি প্রকল্পে আছি যা ইতিমধ্যে তফসিলের পিছনে রয়েছে)।

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

তবে আমার প্রথম অংশটি ফিরে বলেছে, যদি কেউ প্রহরী পরিবর্তন করে, তবে আপনি তাদের জন্য আরও কাজ করছেন (কারণ এখন তাদের রক্ষীদের পরিবর্তন করতে হবে এবং প্রহরীদের জন্য ইউনিট পরীক্ষা করা উচিত)।

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

আমি উভয় উপায়ে এবং কুফল দেখতে। তাই আমি ভেবেছিলাম অন্যরা কী করেছে তা জিজ্ঞাসা করব।


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

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

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

2
but it is not worth the time" (I am on a project that is already behind schedule).আমরা সফ্টওয়্যার বিকাশকারী। কেবলমাত্র সময়সূচীতে যখন আমরা মারা যাই কেবল তখনই হয় :)
ম্যাপেল_শ্যাফ্ট

উত্তর:


26

আমার অংশ বলেছে "নিশ্চিত যে আপনি এগুলি পরীক্ষা করতে পারবেন তবে এটি সময়ের পক্ষে উপযুক্ত নয়" (আমি এমন একটি প্রকল্পে আছি যা ইতিমধ্যে তফসিলের পিছনে রয়েছে)।

এটি তিনটি খুব সংক্ষিপ্ত পরীক্ষা। আপনি নিজেকে প্রশ্ন জিজ্ঞাসা করতে যতটা সময় ব্যয় করেছেন।

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

এই দিকে শুনুন।

তবে আমার প্রথম অংশটি ফিরে বলেছে, যদি কেউ প্রহরী পরিবর্তন করে, তবে আপনি তাদের জন্য আরও কাজ করছেন (কারণ এখন তাদের রক্ষীদের পরিবর্তন করতে হবে এবং প্রহরীদের জন্য ইউনিট পরীক্ষা করা উচিত)।

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

আপনার প্রথম অংশটি কেবল সাধারণ ভুল। দ্বিতীয় অংশটি পিছনে একটি প্যাট দিন এবং এটি সম্পর্কে চিন্তাভাবনা বন্ধ করুন।


সংক্ষিপ্ততার জন্য +1 যদিও আমি একটি উত্তরও লিখেছি হি
জিমি হোফা

3
+1 টি। হ্যাঁ, যদি প্রয়োজনীয়তাগুলি পরিবর্তন হয় তবে কয়েকটি পরীক্ষা মানিয়ে নিতে হবে।
অলিভিয়ার জ্যাকট-ডেসকোম্বেস

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

@ ভ্যাকানো: আপনার যতগুলি লিখতে হবে তত যুক্তিসঙ্গত পাথের জন্য আপনার পরীক্ষা নেই এবং সেগুলি লেখার জন্য আরও প্রয়োজনীয়।
পিডিআর

9

গার্ড যুক্তি এবং আসল ক্রমটি পৃথক পদ্ধতি থাকলে এটি ইউনিট পরীক্ষা সহজতর করবে ify

ইন Widgetবর্গ

public bool IsReadyForOrdering { get { return PartNumber > 0 && PartAvailable; } }

বা অন্য কোথাও একটি সমতুল্য পদ্ধতি

public bool IsWidgetReadyForOrdering(Widget widget)
{
    return widget.PartNumber > 0 && widget.PartAvailable;
}

অর্ডার পদ্ধতি

public void OrderNewWidget(Widget widget)
{
   if (IsWidgetReadyForOrdering(widget)) {
        WigdetOrderingService.OrderNewWidgetAsync(widget.PartNumber);
   }
}

এখন পরীক্ষা করা IsWidgetReadyForOrderingসহজ হয়ে গেল। এ সম্পর্কে আর কোনও দিন চিন্তা করবেন না। এটা পরীক্ষা করো!


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

1
প্রথমত, এটি প্রশ্নের উত্তর দেয় না। দ্বিতীয়ত, এটি অসত্য। আপনি যেভাবে তিনটি পরীক্ষা লিখতে হবে। তৃতীয়ত, এটি কলিং কোডে বাস্তবায়নের বিশদটি অযৌক্তিকভাবে প্রকাশ করে।
পিডিআর

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

2
পদ্ধতিটি OrderNewWidgetসম্ভবত অন্য শ্রেণিতে রয়েছে Widget, কারণ এটির একটি Widgetযুক্তি রয়েছে। যেহেতু পদ্ধতির কোনও রিটার্ন মান নেই, এটি পরীক্ষা করা সুস্পষ্ট নয়। আপনাকে কলটি WigdetOrderingServiceট্র্যাক করে এমন একটি মক ইনজেকশন করতে OrderNewWidgetAsyncহবে।
অলিভিয়ার জ্যাকট-ডেসকোম্বেস

2
@ জিমিহোফা: আসলে, আপনার "স্টেটলেস" এর সংজ্ঞাটি সি # তে "স্ট্যাটিক"। সুতরাং, আপনি যা বলছেন তা "বৈশিষ্ট্যের কোনও জিনিসের স্থিতি অ্যাক্সেস করা উচিত নয়"। এমনকি বোবা প্রাপ্তরাও রাষ্ট্রের পরিবর্তনশীলগুলিতে অ্যাক্সেস করে, যার অর্থ "কেবলমাত্র স্থিতিশীল বৈশিষ্ট্যগুলি লিখুন" - যার অর্থ খুব বেশি বোঝা যায় না।
ডক ব্রাউন

6

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

এটি বলেছে, আপনার গার্ড বিবৃতি পরীক্ষার সাধারণ প্রশ্নে; হ্যাঁ! একেবারে গার্ড স্টেটমেন্ট পরীক্ষা! ঐ যে পদ্ধতি, আপনি একটি বাগ-ফিক্স করছেন কারো ভুল বুঝে ভাবেন কিছু জানতে চায় না এবং আপনার রক্ষীদের সরিয়ে দেওয়ার বা সংশোধন করবে আচরণের গুরুত্বপূর্ণ অংশ আছে &&একটি থেকে ||আপনি কি? ইউনিট পরীক্ষাগুলি নিশ্চিত করবে যে ক) আপনি আসলে আপনার প্রহরীদের উপর যুক্তিটি সঠিকভাবে পেয়েছেন এবং খ) ইউনিট পরীক্ষা চালানোর সময় কোনও অভিযোগ না পেয়ে পরে কেউ এই যুক্তিটি ভাঙেন না কারণ তারা কোনও কারণেই এইভাবে হওয়া উচিত।


0

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


-5

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

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