শিপিং পরীক্ষার কোড। কেন করবে না?


17

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

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

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

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


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


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

7
@ জোনচেস্টারফিল্ড: আপনার প্রোগ্রামে একটি স্ব-পরীক্ষা বৈশিষ্ট্য তৈরি করা সম্ভবত খুব ভাল জিনিস। এবং যদি সেই স্ব-পরীক্ষা বৈশিষ্ট্যটি আপনার ইউনিট পরীক্ষাগুলি থেকে আংশিকভাবে কোডটি পুনরায় ব্যবহার করতে পারে তবে কেন নয়? তবে এই জাতীয় বৈশিষ্ট্যটির পাশাপাশি পুনরায় ব্যবহারযোগ্য অংশগুলি "এটি প্রডাকশন কোড" পয়েন্ট অফ দ্য ভিউ দ্বারা তৈরি করা উচিত।
ডক ব্রাউন

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

উত্তর:


19

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

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

অন্যদিকে, অনেকগুলি পরীক্ষা কেবল বিব্রতকরভাবে খারাপ হয় এবং এমনকি কেউ কেউ কী পরীক্ষা করে বলে মনে করে তাও পরীক্ষা করে না। এটি ভিন্ন ইস্যু ...

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


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

হ্যাঁ, সত্যের পরে করা শক্ত। আমি মনে করি শিপিং পরীক্ষা বিকাশের নিবেদিত প্রচেষ্টার সাথে আপনার আরও ভাগ্য হবে।
এরিক tদ

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

@ ডকব্রাউন, আমি আপনার বক্তব্য গ্রহণ করি। সম্ভবত ওপি পোস্টের কোথাও "ওপেন সোর্স" উল্লেখ করেছে বলে ব্যাখ্যার বিষয়। যে কোনও ক্ষেত্রে আপনার সম্পাদনাটি বিন্দুটিকে দুর্দান্তভাবে সাধারণ করে তুলেছে।
এরিক tদ

18

শিপিং পরীক্ষা? হ্যাঁ. শিপিং ইউনিট পরীক্ষা? না।

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

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

সুতরাং - পরিবর্তে আপনার কিছু সংহতকরণ পরীক্ষা করুন, যা আপনি ইনস্টলড, ইন্টিগ্রেটেড, পণ্যের জন্য ঠিক যা চান তা হ'ল।


2

ক্রস-প্ল্যাটফর্ম বিতরণ করার সময় আপনি যে সমস্ত হার্ডওয়্যারগুলির প্রতিটি এক ইঞ্চি, যেমন একটি মাল্টিথ্রেডেড নেক্সট-জেন এএএ গেম ইঞ্জিনের মতো প্রতিটি সিপিইউ কোর, সিমডি ইনট্রিনিকস, জিপিইউ, জিপিজিইউ ইত্যাদি ব্যবহার করেন, সেখানে আমি এই উদ্বেগটি দৃ strongly়ভাবে বুঝতে পারি পণ্য।

এই ক্ষেত্রে, আপনার সবচেয়ে খারাপ দুঃস্বপ্ন প্রায়শই সেই ক্ষেত্রে দেখা যায় যেখানে আপনার পরীক্ষাগুলি (ইউনিট এবং ইন্টিগ্রেশন) পরীক্ষিত প্রথম 5000 টি পৃথক মেশিন / প্ল্যাটফর্মের জন্য পাস করে তবে একটি অস্পষ্ট জিপিইউ মডেলের জন্য ড্রাইভার বাগের কারণে 5,001 তম ব্যর্থ হয় কেবল ভাবনা এ সম্পর্কে আমাকে শাওয়ার দেয় - আপনি সম্ভবত এগুলি আগে থেকে পরীক্ষা করতে বা ভবিষ্যদ্বাণী করতে পারবেন না।

বিশেষত আপনি যদি জিপিইউ শেডারগুলি লিখেন তবে আপনি একটি বিপরীত লটারি খেলতে পারেন যেখানে আপনার লিখিত অর্ধেক কোডটি অপরিজ্ঞিত আচরণের ডাক দেবে, যেহেতু জেপিইউর সমস্ত মডেল / ড্রাইভাররা এতে জড়িত কিছু বহনযোগ্য স্ট্যান্ডার্ড গ্যারান্টি রয়েছে। আজকাল এটি মাইনসুইপার খেলে যেমন কম-বেশি হচ্ছে, তবুও এটি লোকেদের কিছু ধারণা দেওয়া উচিত: http://theorangeduck.com/page/writing-portable-opengl । নব্বইয়ের দশকের শেষের দিকে এবং ২০০০ এর দশকের গোড়ার দিকে এটি চেষ্টা করা সত্যিই ভয়াবহ ছিল এবং এটি সর্বত্র মাইনসুইপার ছিল।

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

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

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

তবে আমি আরও একটি জিনিস প্রস্তাব করব:

লগিং

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

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

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

সাধারণত এখানে, সর্বোত্তম জিনিসটি আমরা যত তাড়াতাড়ি সম্ভব সমস্যাটি সন্ধান করা, যেখানে এটি যতটা সম্ভব বিশদভাবে ঘটে (আমাদের সন্দেহভাজনদের তালিকা সংকীর্ণ করতে), এবং বিষয়টি রিপোর্ট হওয়ার পরে এএসএপটি ঠিক করা হয়েছে।

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

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

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

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

লগিংটি সেই জিনিসটি ছিল যা আমাদের বাটগুলিকে সেখানে সংরক্ষণ করেছিল, আমাদের প্রায়শই 10,001 তম অস্পষ্ট প্রোটোটাইপ মেশিনে সমস্যাটি একটি অনলাইন জিপিইউর সাথে আমরা শুনতে পাইনি, কোডের শেষ লাইনটি সঙ্গে সঙ্গে আমাদের ঠিক যেখানে ব্যর্থতা 2 এর নিচে নেমেছে তা দেখাতে দিয়েছিল with বা সন্দেহভাজন, যেমন যদি এটা বিস্তারিত shader ভিতরে, আমরা সেনাদের এর করছি ধরনের যেহেতু আমরা লগিং একটি জিপিইউ shader ভিতরে ব্যবহার করতে পারবেন না, কিন্তু আমরা অন্তত ব্যবহার লগিং এ দেখতে পারেন যেমন কোডের 3 লাইন যা shader সমস্যা ছিল সরাসরি তদন্ত শুরু।


2
মেমোয়েজিং লগিং কোডটি চালাক। আমরা বর্তমানে লগগুলি তৈরি করি না - মূলত পারফরম্যান্সের উদ্বেগের কারণে - তাই ডিবাগিংয়ে একটি মূল ডাম্প জড়িত। ইনস্টলারের সাথে ডায়াগনস্টিক পরীক্ষাগুলি এম্বেড করা খুব ভাল ধারণা। বিস্তারিত উত্তরের জন্য আপনাকে ধন্যবাদ।
জন চেস্টারফিল্ড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.