ইউনিট টেস্টিং স্ট্যাটিকালি টাইপড ফাংশনাল কোড


15

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

আমি এটি জিজ্ঞাসা করেছি কারণ আমার বোঝার থেকে:

  • ইউনিট পরীক্ষার একটি দিক হল চলমান ফর্মে চশমা থাকা। তবে একটি ঘোষিত শৈলীর নিয়োগের সময়, যেগুলি ভাষা শব্দার্থবিদ্যায় আনুষ্ঠানিক চশমাগুলিকে সরাসরি মানচিত্র করে, এমনকি চশমাগুলি একটি পৃথক উপায়ে চালানো যায় এমনভাবে প্রকাশ করা সম্ভব , যা মান যুক্ত করে?

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

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

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

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


4
যাইহোক, আপনি যদি QuickCheck ব্যবহার না করে থাকেন , আপনার অবশ্যই হওয়া উচিত।
জন পূর্ব

উত্তর:


8

ইউনিট পরীক্ষার একটি দিক হল চলমান ফর্মে চশমা থাকা। তবে একটি ঘোষিত শৈলীর নিয়োগের সময়, যেগুলি ভাষা শব্দার্থকে সরাসরি আনুষ্ঠানিক চশমাগুলি মানচিত্র করে, এমনকি চশমাগুলি একটি পৃথক উপায়ে চালানো যায় এমন আকারে প্রকাশ করা কি সম্ভব?

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

তবে আপনার কোডে y এর পরিবর্তে x ব্যবহার করার মতো একটি সাধারণ ভুল (উভয় স্থানাঙ্কী হওয়া) coveredাকা যাবে না। তবে পরীক্ষার কোডটি লেখার সময় এ জাতীয় ভুলটিও দেখা দিতে পারে, সুতরাং এটি চেষ্টা করার মতো কিনা তা আমি নিশ্চিত নই।

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

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

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


5

ইউনিট পরীক্ষার একটি দিক হল চলমান ফর্মে চশমা থাকা। তবে একটি ঘোষিত শৈলীর নিয়োগের সময়, যেগুলি ভাষা শব্দার্থকে সরাসরি আনুষ্ঠানিক চশমাগুলি মানচিত্র করে, এমনকি চশমাগুলি একটি পৃথক উপায়ে চালানো যায় এমন আকারে প্রকাশ করা কি সম্ভব?

এটি খুব সম্ভাবনা নয় যে আপনি টাইপ সীমাবদ্ধতা হিসাবে আপনার নির্দিষ্টকরণগুলি সম্পূর্ণরূপে প্রকাশ করতে সক্ষম হবেন ।

আপনি যখন এই জাতীয় প্রোগ্রামিং শৈলী ব্যবহার করেন, আপনি কোন এক্সটেন্টগুলিতে ইউনিট পরীক্ষাগুলি ব্যবহার করেন এবং কেন (আপনি আপনার কোডটির জন্য কী মানের আশা করবেন)?

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

প্রায়শই কোনও ফাংশনের স্পেসিফিকেশন (বা এর অংশ) আর্গুমেন্টের সাথে প্রত্যাবর্তিত মান সম্পর্কিত বৈশিষ্ট্য হিসাবে প্রকাশ করা যেতে পারে। এই ক্ষেত্রে ব্যবহারে QuickCheck (Haskell,) অথবা ScalaCheck (Scala জন্য) আপনি ভাষা অভিব্যক্তি হিসাবে এই বৈশিষ্ট্য লিখে দিন এবং চেক যে তারা র্যান্ডম ইনপুট জন্য ধরে রাখতে পারেন।


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

1

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

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

ফাংশনে ব্যবহৃত ফাংশনগুলিকে বিদ্রূপ করাও সম্ভব; হয় এগুলি ফাংশনে (নির্ভরতা ইনজেকশনের সমতুল্য) পাস করে বা ব্রায়ান মারিকের মিডজির মতো ফ্রেমওয়ার্ক সহ


0

হ্যাঁ, ইউনিট পরীক্ষাগুলি ইতিমধ্যে স্ট্যাটিকালি টাইপড ফাংশনাল কোড দিয়ে বুদ্ধিমান। একটি সহজ উদাহরণ:

prop_encode a = (decode . encode $ a) == a

আপনি prop_encodeস্ট্যাটিক টাইপ দিয়ে জোর করতে পারেন ।

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