বৈজ্ঞানিক গবেষণা কোডগুলির জন্য ইউনিট পরীক্ষা লেখার পক্ষে কি সার্থকতা রয়েছে?


89

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

আমাদের কি গবেষণা কোডগুলির জন্য ইউনিট পরীক্ষা লিখতে হবে?


2
এটি কিছুটা উন্মুক্ত প্রশ্ন, তাই না?
qubyte

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

স্ট্যাকওভারফ্লো সম্পর্কিত একটি প্রশ্নের অনুরূপ শিরাতে কিছুটা ভাল আলোচনা রয়েছে ।
naught101

উত্তর:


85

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

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

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

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

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

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

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

স্পষ্টতার জন্য, এবং যেহেতু @ নট 101 জিজ্ঞাসা করেছে ...

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

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


7
চিহ্নিত করুন, আপনি এখানে কোন ধরণের কোডের কথা বলছেন? পুনরায় ব্যবহারযোগ্য মডেল? আমি দেখতে পেলাম যে এই যুক্তিটি অনুসন্ধানের তথ্য বিশ্লেষণ কোডের মতো জিনিসগুলির জন্য সত্যই প্রযোজ্য নয়, যেখানে আপনাকে সত্যিই প্রচুর পরিমাণে ঝাঁপিয়ে পড়তে হবে এবং প্রায়শই কোথাও কোথাও কোডটি পুনরায় ব্যবহারের আশা করা যায় না।
nnot101

35

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

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

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

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

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


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

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

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

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

আপনার পরবর্তী উদাহরণগুলি আমার উদ্দেশ্য অনুসারে প্রাসঙ্গিক।
ডেভিড কেচসন

28

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

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

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



আপনি কি যথেষ্ট পরিমাণে ইন্টিগ্রেশন টেস্ট বিবেচনা করবেন, বা আপনার কি মনে হয় আপনারও আলাদা ইউনিট পরীক্ষা লেখার দরকার আছে?
সিয়ামি

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

19

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

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

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


কোন টুকরোটি ইউনিট পরীক্ষার (এবং কোনটি নয়) বাছাই করার জন্য আপনার কোনও নির্দিষ্ট উদাহরণ বা মানদণ্ড রয়েছে?
ডেভিড কেচসন

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

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

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

14

বৈজ্ঞানিক কোডগুলির জন্য ইউনিট টেস্টিং বিভিন্ন কারণে কার্যকর।

বিশেষত তিনটি হ'ল:

  • ইউনিট পরীক্ষাগুলি অন্যদেরকে আপনার কোডের সীমাবদ্ধতাগুলি বুঝতে সহায়তা করে। মূলত, ইউনিট পরীক্ষাগুলি ডকুমেন্টেশনের একটি ফর্ম।

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

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

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

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

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

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


9

আমার ডিল.আইআই ক্লাসে আমি শিখি যে সফটওয়্যারগুলির পরীক্ষা নেই যা সঠিকভাবে কাজ করে না (এবং আমি জোর দিয়ে বলি যে আমি " সঠিকভাবে কাজ করে না", না " সঠিকভাবে কাজ নাও করতে পারে )।

অবশ্যই আমি মন্ত্রের সাথে বেঁচে আছি - যা এইভাবেই ঘটে।

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


সফ্টওয়্যার পরীক্ষায় the তিহ্যগত স্তরগুলির তুলনায় আপনি কেন এই শ্রেণিবিন্যাসকে (নিম্নের জন্য ইউনিট, উচ্চতর ক্ষেত্রে রিগ্রেশন) প্রস্তাব দিচ্ছেন ?
ximiki

@ এক্সিমিকি - আমি বলতে চাইছি না। আমি বলছি যে পরীক্ষাগুলি একটি স্পেকট্রামে বিদ্যমান রয়েছে যা আপনার লিঙ্কের তালিকাভুক্ত সমস্ত বিভাগ অন্তর্ভুক্ত করবে।
ওল্ফগ্যাং ব্যাঙ্গার্থ

8

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


7

কাফনের কাপড়!

কী, এটাই আপনার পক্ষে যথেষ্ট নয়?

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

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


+1: "এর মতো পর্যায়ে কাজ করার অর্থ হল যে আপনি যখন কোনও সমস্যার মুখোমুখি হন তখনই আপনার পরীক্ষা করার জন্য কোডের সর্বাধিক সাম্প্রতিক 'স্টেজ' থাকে, পূর্ববর্তী স্তরগুলি ইতিমধ্যে পরীক্ষা করা হয়েছে।"
ximiki

5

হ্যাঁ.

ইউনিট টেস্ট ছাড়াই যে কোনও কোড লেখা রয়েছে তা ধারণা অ্যানথেমা। আপনি যদি নিজের কোডটি সঠিক প্রমাণ না করেন এবং প্রমাণটি সঠিক না করেন তবে = পি।


3
... এবং তারপরে আপনি প্রমাণটি প্রমাণ করেছেন যে প্রমাণটি সঠিক, এবং ... এখন এটি একটি গভীর খরগোশের গর্ত।
জেএম

2
কচ্ছপ সমস্তভাবে নামিয়ে দিজকસ્ત્રাকে গর্বিত করে তোলে!
অ্যারারেল

2
কেবল সাধারণ কেসটি সমাধান করুন এবং তারপরে আপনার প্রমাণটি নিজেকে সঠিক প্রমাণিত করুন! কচ্ছপের টরাস!
আইসিন

5

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

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


আপনি ম্যানুয়ালি বা স্বয়ংক্রিয়ভাবে ইউনিট পরীক্ষাগুলি ব্যবহার করে পরীক্ষা করুন, ভাসমান পয়েন্ট উপস্থাপনে আপনার ঠিক একই সমস্যা রয়েছে। আমি অত্যন্ত রিচার্ড হ্যারিস 'সুপারিশ করবে চমৎকার সিরিজ মধ্যে প্রবন্ধ ACCU s' এর জমিদার পত্রিকা
মার্ক বুথ

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

5

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

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

+1: "ইনপুট পরামিতি বা ডেটা গ্রহণযোগ্য সীমানার বাইরে পড়লে নিশ্চিত হয়ে নিন যে কোডটি প্রান্তগুলিতে আচরণ করে এবং মনোযোগ দিয়ে ব্যর্থ হয় (তবে আপনি আপনার সিমুলেশনে এটি নির্ধারণ করেন)"।
ximiki

5

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

প্রথম দুটি সংস্করণ তাদের নিজস্ব ওজন এবং আন্তঃসংযোগগুলির গুণনের অধীনে পতিত হয়েছিল।

অন্যরা লিখেছেন যে মডিউলগুলির মধ্যে মিথস্ক্রিয়াটি প্রায়শই সেই জায়গা যেখানে বৈজ্ঞানিক কোডিং বিরতি হয় এবং সেগুলি সম্পর্কে তারা ঠিক। কিন্তু যখন আপনি নির্ধারণ করে দেখাতে পারেন যে প্রতিটি মডিউল যা করতে বোঝাচ্ছে তা করছে তবে এই সমস্যাগুলি নির্ণয় করা অনেক সহজ ।


3

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

একটি বড় রাসায়নিক সিস্টেম মডেলারে এমবেডড মূল কোডটির জন্য একটি পরীক্ষার জোতা তৈরি করা সময়সীমার ক্ষেত্রে সম্ভব ছিল না।

তবে, আমি বিভিন্ন ক্রিয়াকলাপের ইউনিট পরীক্ষা হিসাবে রাসায়নিক সূত্রে (বুস্ট স্পিরিট) পার্সার কীভাবে কাজ করে তা দেখিয়ে ক্রমবর্ধমান জটিল স্নিপেটগুলি তৈরি করতে সক্ষম হয়েছি।

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

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


2

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

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

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

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

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

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