সংখ্যার কোনও অর্থ না হলে জাদু সংখ্যাগুলি কি ইউনিট পরীক্ষায় গ্রহণযোগ্য?


59

আমার ইউনিট পরীক্ষাগুলিতে, আমি প্রায়শই আমার কোডটিতে স্বেচ্ছাচারিত মানগুলি ছুঁড়ে দিয়ে দেখি এটি কী করে। উদাহরণস্বরূপ, যদি আমি জানি যে foo(1, 2, 3)17 টি ফেরার কথা রয়েছে তবে আমি এটি লিখতে পারি:

assertEqual(foo(1, 2, 3), 17)

এই সংখ্যাগুলি নিখুঁতভাবে স্বেচ্ছাসেবী এবং এর কোনও বিস্তৃত অর্থ নেই (এগুলি উদাহরণস্বরূপ সীমানা শর্ত নয়, যদিও আমি সেগুলিও পরীক্ষা করি)। আমি এই সংখ্যার জন্য ভাল নাম নিয়ে আসতে লড়াই করব, এবং এর মতো কিছু লেখা const int TWO = 2;অবশ্যই অসহনীয়। পরীক্ষাগুলি এভাবে লেখার জন্য কি ঠিক আছে, বা আমি সংখ্যাগুলি ধ্রুবকগুলিতে বের করবো?

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


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

24
const int TWO = 2;কেবল ব্যবহারের চেয়েও খারাপ 2। এটি এর আত্মা লঙ্ঘন করার অভিপ্রায় নিয়ে রুলের শব্দটির সাথে সঙ্গতিপূর্ণ।
এজেন্ট_এল

4
এমন একটি সংখ্যা কী যা "কিছু মানে না"? কেন এটি আপনার কোডে থাকবে যদি এর অর্থ না থাকে?
টিম গ্রান্ট

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

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

উত্তর:


81

আপনার কখন এমন সংখ্যা রয়েছে যাগুলির কোনও অর্থ নেই?

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

উদাহরণ:

const int startBalance = 10000;
const float interestRate = 0.05f;
const int years = 5;

const int expectedEndBalance = 12840;

assertEqual(calculateCompoundInterest(startBalance, interestRate, years),
            expectedEndBalance);

নোট করুন যে প্রথম ভেরিয়েবলটির নাম দেওয়া হয়নি HUNDRED_DOLLARS_ZERO_CENT, তবে startBalanceভেরিয়েবলটির অর্থ কী তা বোঝাতে কিন্তু এর মানটি কোনওভাবেই বিশেষ নয়।


3
@ কেভিন - আপনি কোন ভাষায় পরীক্ষা দিচ্ছেন? কিছু টেস্টিং ফ্রেমওয়ার্ক আপনাকে ডেটা সরবরাহকারী সেট আপ করতে দেয় যা পরীক্ষার জন্য মূল্যগুলির অ্যারেগুলিকে ফেরত দেয়
HorusKol

10
আমি ধারণা নিয়ে একমত, হুঁশিয়ার করে এই অভ্যাস নতুন ত্রুটি খুব পরিচয় করিয়ে দিতে পারেন, যদি আপনি দূর্ঘটনাক্রমে মত একটি মান বের মত 0.05fএকটি থেকে int। :)
জেফ বোম্যান

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

2
@ পিটারবি: এএফএইকি এটি সি এবং সি ++ এর ত্রুটি, যা একটি constভেরিয়েবলের ধারণাটি আনুষ্ঠানিক করে তোলে ।
স্টিভ জেসোপ

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

20

যদি আপনি স্বেচ্ছাসেবী সংখ্যাগুলি কেবল তারা কী করেন তা দেখতে ব্যবহার করে থাকেন, তবে আপনি যা খুঁজছেন তা সম্ভবত এলোমেলোভাবে উত্পন্ন পরীক্ষার ডেটা বা সম্পত্তি-ভিত্তিক পরীক্ষা generated

উদাহরণস্বরূপ, হাইপোথিসিস এই ধরণের পরীক্ষার জন্য একটি দুর্দান্ত পাইথন গ্রন্থাগার, এবং এটি কুইকচেকের উপর ভিত্তি করে ।

সাধারণ ইউনিট পরীক্ষাটিকে নীচের মতো কিছু মনে করুন:

  1. কিছু ডেটা সেট আপ করুন।
  2. ডেটাতে কিছু অপারেশন করুন।
  3. ফলাফল সম্পর্কে কিছু জোর দিন।

হাইপোথিসিস আপনাকে পরীক্ষা লিখতে দেয় যা পরিবর্তে এর মতো দেখতে:

  1. কিছু নির্দিষ্টকরণের সাথে মেলে সমস্ত ডেটার জন্য।
  2. ডেটাতে কিছু অপারেশন করুন।
  3. ফলাফল সম্পর্কে কিছু জোর দিন।

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

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

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


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

5
এবং আপনি কীভাবে জানবেন যে যখন আপনি "ফলাফল সম্পর্কে কিছু বলছেন" যখন এই ইউনিট পরীক্ষাটি বাগড হয় না (এই ক্ষেত্রে, কম্পিউটিং কী fooতা সংশোধন করে) ...? আপনি যদি 100% নিশ্চিত হন যে আপনার কোডটি সঠিক উত্তর দেয় তবে আপনি প্রোগ্রামটি ঠিক সেই কোডটি রেখেছিলেন এবং এটি পরীক্ষা করে দেখবেন না। আপনি যদি না হন তবে আপনার পরীক্ষাটি পরীক্ষা করা দরকার এবং আমি মনে করি এটি কোথায় চলছে সবাই দেখে।

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

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

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

11

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

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

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

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


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

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

এখনও যাদু নম্বরগুলির নাম দেওয়া ভাল better যদি প্যারামিটারের সংখ্যা পরিবর্তন করতে হয় তবে ডকুমেন্টেশনগুলি সেকেলে হয়ে যাওয়ার ঝুঁকিপূর্ণ।
রবি ডি

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

"আশাকরি" হাহ? ফিলিপ ইতিমধ্যে রূপরেখা প্রকাশ করেছে বলে ঠিক কীভাবে জিনিসটিকে সঠিকভাবে কোড করা যায় না এবং অবশ্যই যাদুর সংখ্যাটি থেকে দূরে সরিয়ে দেওয়া হয় না ...
রবি ডি

9

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

// standard triangle with area >0
assertEqual(testForTriangle(2, 3, 4), true);

// degenerated triangle, length of two edges match the length of the third
assertEqual(testForTriangle(1, 2, 3), true);  

// no triangle
assertEqual(testForTriangle(1, 2, 4), false); 

// two sides equal
assertEqual(testForTriangle(2, 2, 3), true);

// all three sides equal
assertEqual(testForTriangle(4, 4, 4), true);

// degenerated triangle / point
assertEqual(testForTriangle(0, 0, 0), true);  

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

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


বোধগম্য সমাধান।
ব্যবহারকারী 1725145

6

আমরা সংখ্যার পরিবর্তে নামকরণকারী কনস্ট্যান্টগুলি কেন ব্যবহার করতে চাই?

  1. DRY - যদি আমার 3 টি স্থানে মান প্রয়োজন হয় তবে আমি কেবল এটি একবারে সংজ্ঞায়িত করতে চাই, তাই যদি এটি পরিবর্তন হয় তবে আমি এটি এক জায়গায় পরিবর্তন করতে পারি।
  2. সংখ্যার অর্থ দিন।

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

testBigInterest()
  var startBalance = 10;
  var interestInPercent = 100
  var years = 2
  assert( calcCreditSum( startBalance, interestInPercent, years ) == 40 )

testSmallInterest()
  var startBalance = 50;
  var interestInPercent = .5
  var years = 1
  assert( calcCreditSum( startBalance, interestInPercent, years ) == 50.25 )

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

testBigInterest()
  assert( calcCreditSum( startBalance:       10
                        ,interestInPercent: 100
                        ,years:               2 ) = 40 )

অথবা একটি পরীক্ষা-ফ্রেমওয়ার্ক ব্যবহার করুন যা আপনাকে কিছু অ্যারে বা মানচিত্র বিন্যাসে পরীক্ষার কেসগুলি সংজ্ঞায়িত করতে অনুমতি দেবে:

testcases = { {
                Name: "BigInterest"
               ,StartBalance:       10
               ,InterestInPercent: 100
               ,Years:               2
              }
             ,{ 
                Name: "SmallInterest"
               ,StartBalance:       50
               ,InterestInPercent:  .5
               ,Years:               1
              }
            }

3

... তবে এক্ষেত্রে সংখ্যাগুলির আসলে কোনও অর্থ নেই

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


1
এটি অগত্যা সত্য নয়, যদিও - আমি লিখেছি সর্বশেষ ইউনিট পরীক্ষার উদাহরণ হিসাবে ( assertEqual "Returned value" (makeKindInt 42) (runTest "lvalue_operators"))। এই উদাহরণস্বরূপ, 42কেবলমাত্র একটি স্থানধারকের মান যা পরীক্ষার স্ক্রিপ্টে কোড দ্বারা উত্পাদিত হয় এবং স্ক্রিপ্ট lvalue_operatorsদ্বারা এটি কখন ফিরে আসে তা পরীক্ষা করা হয়। এটির কোনও অর্থ নেই, ভিন্ন ভিন্ন ভিন্ন স্থানে একই মানটি ঘটে। এখানে উপযুক্ত নামটি কী হবে যা প্রকৃত কোনও কার্যকর অর্থ দেয়?
জুলে

3

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

struct test_foo_values {
    int bar;
    int baz;
    int blurf;
    int expected;
};
const struct test_foo_values test_foo_with[] = {
   { 1, 2, 3, 17 },
   { 2, 4, 9, 34 },
   // ... many more here ...
};

for (size_t i = 0; i < ARRAY_SIZE(test_foo_with); i++) {
    const struct test_foo_values *c = test_foo_with[i];
    assertEqual(foo(c->bar, c->baz, c->blurf), c->expected);
}

ড্যান্নোর জবাবে প্রস্তাবিত মত সরঞ্জামগুলি আপনাকে পরীক্ষার জন্য মানগুলির সারণিটি তৈরি করতে সহায়তা করতে পারে। bar, baz, এবং blurfঅর্থপূর্ণ নাম দ্বারা প্রতিস্থাপিত হতে উচিত আলোচনা ফিলিপ এর উত্তর

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


1

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

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

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


1

প্রথমে একমত হোন যে "ইউনিট পরীক্ষা" প্রায়শই কোনও প্রোগ্রামার লিখেছেন এমন সমস্ত স্বয়ংক্রিয় পরীক্ষাগুলি কভার করার জন্য ব্যবহৃত হয় এবং প্রতিটি পরীক্ষাকে কী বলা উচিত তা নিয়ে বিতর্ক করা অর্থহীন…

আমি এমন একটি সিস্টেমে কাজ করেছি যেখানে সফ্টওয়্যারটি প্রচুর ইনপুট নিয়েছে এবং একটি "সমাধান" তৈরি করেছে যাতে অন্যান্য সংখ্যার অনুকূলিতকরণের সময় কিছু বাধা পূরণ করতে হয়েছিল fulfill কোনও সঠিক উত্তর ছিল না, সুতরাং সফ্টওয়্যারটির কেবল একটি যুক্তিসঙ্গত উত্তর দিতে হয়েছিল।

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

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

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

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

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


1

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

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


0

আমি যথাযথ হ্যাঁ / না বলার পক্ষে উদ্যোগ নেব না, তবে এটি ঠিক আছে কি না তা সিদ্ধান্ত নেওয়ার সময় আপনার নিজের থেকে প্রশ্ন করা উচিত।

  1. যদি সংখ্যাগুলি কোনও অর্থ না করে তবে তারা কেন সেখানে প্রথম স্থানে রয়েছে? তাদের কি অন্য কিছু দ্বারা প্রতিস্থাপন করা যেতে পারে? আপনি কি মূল্য নির্ধারণের পরিবর্তে পদ্ধতি কল এবং প্রবাহের ভিত্তিতে যাচাইকরণ করতে পারেন? মকিতোর verify()পদ্ধতির মতো কিছু বিবেচনা করুন যা আসলে কোনও মান নির্ধারণের পরিবর্তে নির্দিষ্ট পদ্ধতি কলগুলিকে অবহেলা করার জন্য করা হয়েছিল কিনা তা যাচাই করে।

  2. যদি সংখ্যাগুলির কিছু অর্থ হয়, তবে সেগুলি যথাযথভাবে নামযুক্ত ভেরিয়েবলগুলিতে অর্পণ করা উচিত।

  3. সংখ্যা লিখন 2যেমন TWOনির্দিষ্ট প্রেক্ষিতে সহায়ক, এবং অন্যান্য প্রসঙ্গে এত নাও হতে পারে।

    • উদাহরণস্বরূপ: assertEquals(TWO, half_of(FOUR))কোডটি পড়ে এমন কাউকে বোঝায়। আপনি কী পরীক্ষা করছেন তা অবিলম্বে পরিষ্কার হয়ে গেছে ।
    • তবে যদি আপনার পরীক্ষা হয় assertEquals(numCustomersInBank(BANK_1), TWO), তবে এটি এতটা বোঝায় না। কেন নেই BANK_1দুই গ্রাহকদের থাকে? আমরা কি জন্য পরীক্ষা করছি?
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.