উদাহরণস্বরূপ ম্যানুয়ালি ইউনিট টেস্ট প্রুফ লিখছেন?


9

আমরা জানি যে JUnit পরীক্ষাগুলি লিখতে আপনার কোডের মাধ্যমে একটি নির্দিষ্ট পথ প্রদর্শন করে।

আমার এক সহযোগী মন্তব্য করেছেন:

ম্যানুয়ালি ইউনিট পরীক্ষা লেখা হয় উদাহরণস্বরূপ প্রুফ

তিনি হাস্কেলের পটভূমি থেকে আসছিলেন যার কাছে কুইকচেকের মতো সরঞ্জাম এবং প্রকারের সাথে প্রোগ্রামের আচরণ সম্পর্কে যুক্তি করার ক্ষমতা রয়েছে ।

তার প্রবণতাটি হ'ল এখানে প্রচুর পরিমাণে ইনপুট রয়েছে যা এই পদ্ধতির দ্বারা অবিরাম হয় যার জন্য আপনার কোড পরীক্ষা করা হয় না।

আমার প্রশ্নটি: ম্যানুয়ালি ইউনিট পরীক্ষার দ্বারা উদাহরণ দ্বারা প্রুফ লিখছেন?


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

উত্তর:


10

আপনি যদি এলোমেলোভাবে পরীক্ষার জন্য ইনপুটগুলি বেছে নিচ্ছেন তবে আমি মনে করি এটি সম্ভবত যুক্তিযুক্ত ত্রুটিযুক্ত প্রমাণ দ্বারা আপনি একটি প্রুফ ব্যবহার করছেন।

তবে ভাল ইউনিট পরীক্ষা কখনও তা করে না do পরিবর্তে, তারা ব্যাপ্তি এবং প্রান্তের ক্ষেত্রে ডিল করে

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

এই পাঁচটি মান ফাংশনের প্রতিটি সম্ভাব্য পরিসীমা এবং প্রান্তের পরীক্ষা করে। ফাংশনটি সমস্ত ইনপুট মানগুলির জন্য কাজ করে এমন একটি উচ্চ আত্মবিশ্বাসের স্তর অর্জন করার জন্য আপনাকে প্রতিটি অন্যান্য সম্ভাব্য ইনপুট মান (যেমন প্রতিটি সংখ্যার পূর্ণসংখ্যার প্রতিনিধিত্ব করতে পারে) পরীক্ষা করার দরকার নেই।


11
একটি কোড টেস্টার একটি বারে প্রবেশ করে একটি বিয়ার অর্ডার করে। 5 বিয়ার। -1 বিয়ার, MAX_VALUE বিয়ার, একটি মুরগি। একটি নাল
নিল

2
"5 মান" খাঁটি বাজে। মত একটি তুচ্ছ ফাংশন বিবেচনা করুন int foo(int x) { return 1234/(x - 100); }। আরও মনে রাখবেন যে (আপনি যা যা পরীক্ষা করছেন তার উপর নির্ভর করে) আপনার অবশ্যই সেই অকার্যকর ("সীমার বাইরে") ইনপুটটি সঠিক ফলাফলগুলি প্রদান করে তা নিশ্চিত করতে হবে (যেমন `` Find_thing (জিনিস) `কিছু ধরণের" পাওয়া যায়নি "স্থিতি সঠিকভাবে দেয় যদি জিনিসটি পাওয়া না যায়)।
ব্রেন্ডন

3
@ ব্রেন্ডন: এর পাঁচটি মূল্য হওয়ায় তাৎপর্যপূর্ণ কিছুই নেই; এটি আমার উদাহরণে পাঁচটি মান হতে পারে। আপনার উদাহরণের বিভিন্ন সংখ্যক পরীক্ষা রয়েছে কারণ আপনি একটি পৃথক ফাংশন পরীক্ষা করছেন। আমি বলছি না যে প্রতিটি ফাংশনে ঠিক পাঁচটি পরীক্ষা প্রয়োজন; আমার উত্তরটি পড়ে আপনি তা অনুমান করেছিলেন।
রবার্ট হার্ভে

1
জেনারেটরি টেস্টিং লাইব্রেরিগুলি আপনার চেয়ে সাধারণত প্রান্তের পরীক্ষাগুলিতে ভাল। যদি উদাহরণস্বরূপ, যদি আপনি পূর্ণসংখ্যার পরিবর্তে ভাসে ব্যবহার করা হয়েছে, আপনার লাইব্রেরি পরীক্ষা হবে -Inf, Inf, NaN, 1e-100, -1e-100, -0, 2e200... আমি বরং ঐ সমস্ত নিজে যা করতে হবে না চাই।
হোভারকচ

@ হোভারকোচ: আপনি যদি একজন ভাল সম্পর্কে জানেন তবে আমি এটি সম্পর্কে শুনতে আগ্রহী। আমি যে সেরাটি দেখেছি তা হ'ল পেক্স; যদিও এটি অবিশ্বাস্যভাবে অস্থির ছিল। মনে রাখবেন, আমরা এখানে তুলনামূলকভাবে সহজ ফাংশন সম্পর্কে কথা বলছি। আপনি বাস্তব-জীবন ব্যবসায়ের যুক্তির মতো জিনিসগুলির সাথে কাজ করার সময় জিনিসগুলি আরও কঠিন হয়।
রবার্ট হার্ভে

8

যে কোনও সফ্টওয়্যার টেস্টিং "প্রুফ বাই উদাহরণ" এর মতো, কেবল ইউনাইটের মতো সরঞ্জাম ব্যবহার করে ইউনিট পরীক্ষা করা নয়। এবং এটি কোনও নতুন জ্ঞান নয়, ১৯ij০ সাল থেকে ডিজকস্ট্রের একটি উদ্ধৃতি রয়েছে , যা মূলত একই কথা বলেছে:

"পরীক্ষা উপস্থিতি দেখায়, বাগের অনুপস্থিতি নয়"

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

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

সুতরাং ম্যানুয়ালি তৈরি টেস্টগুলি এলোমেলোভাবে উত্পন্ন টেস্টগুলির চেয়ে কোনওভাবেই খারাপ নয়, প্রায়শই একেবারে বিপরীত।


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

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

যদিও এমন কিছু সময় রয়েছে যখন ভাল বিতরণ বাছাই করার জন্য কিছু চিন্তাভাবনা করা দরকার, এটি সাধারণত কোনও বড় হ্যাং-আপ নয়। আপনার মন্তব্য আপনাকে বোঝায় যে আপনি এটি সম্পর্কে ভুল পদ্ধতিতে ভাবছেন। র্যান্ডমাইজড চেকিংয়ের জন্য আপনি যে বৈশিষ্ট্যগুলি লিখেছেন সেগুলি হ'ল মডেল যাচাই বা আনুষ্ঠানিক প্রমাণের জন্য আপনি যে বৈশিষ্ট্যগুলি লিখবেন সেগুলি। প্রকৃতপক্ষে, তারা একই সময়ে সেই সমস্ত কিছুর জন্য হতে পারে এবং ব্যবহৃত হতে পারে। আপনার পাশাপাশি উত্পন্ন করতে হবে এমন কোনও "প্রত্যাশিত ফলাফল" নেই। পরিবর্তে, আপনি কেবল এমন সম্পত্তি বর্ণনা করেন যা সর্বদা রাখা উচিত। কয়েকটি উদাহরণ: 1) কোনও স্ট্যাকের উপরে কিছুটা চাপ দেওয়া এবং ...
ডেরেক এলকিন্স SE

... তবে পপিংয়ের কাজ কিছুই না করার মতো হওয়া উচিত; 2) 10,000 ডলারের বেশি ব্যালেন্সযুক্ত যে কোনও গ্রাহকের উচ্চ ব্যালেন্সের সুদের হার পাওয়া উচিত এবং কেবল তখনই; 3) স্প্রাইটের অবস্থান সর্বদা পর্দার সীমানা বাক্সের মধ্যে থাকে। কিছু বৈশিষ্ট্য পয়েন্ট পরীক্ষাগুলির সাথে যথাযথভাবে সঙ্গতিপূর্ণ হতে পারে যেমন "যখন ব্যালেন্স $ 0 হয় তখন শূন্য ব্যালেন্সের সতর্কতা দেয়"। মোট স্পেসিফিকেশন পাওয়ার আদর্শ সহ বৈশিষ্ট্যগুলি আংশিক স্পেসিফিকেশন। এই বৈশিষ্ট্যগুলি চিন্তা করতে অসুবিধা হওয়ার অর্থ স্পেসিফিকেশনটি কী তা সম্পর্কে আপনি অস্পষ্ট এবং প্রায়শই অর্থ আপনার ভাল ইউনিট পরীক্ষার জন্য চিন্তা করতে অসুবিধা হয়।
ডেরেক এলকিন্স

0

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

কুইকচেকের মতো জেনারেটরি টেস্টিং বিস্তৃত ইনপুটগুলি ঝাড়ানোর জন্য সত্যিই ভাল। ম্যানুয়াল পরীক্ষার চেয়ে প্রান্তের মামলাগুলি মোকাবিলার পক্ষে এটি আরও অনেক ভাল: জেনারেটরি টেস্টিং লাইব্রেরিগুলি আপনার চেয়ে আরও অভিজ্ঞ হতে চলেছে। অন্যদিকে, তারা আপনাকে কেবল আক্রমণকারীদের সম্পর্কেই বলে, নির্দিষ্ট ফলাফলগুলি নয় not সুতরাং আপনার প্রোগ্রাম সঠিক ফলাফল পাচ্ছেন যাচাই করতে, আপনি কি এখনও কিছু ম্যানুয়াল পরীক্ষা যে যাচাই করার জন্য, আসলে, প্রয়োজন foo(bar) = baz

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