আধুনিক সফ্টওয়্যার ডেভেলপমেন্টে, অ্যাপ্লিকেশনগুলির নির্ভরযোগ্যতা এবং স্থিতিশীলতা নিশ্চিত করতে কার্যকর পরীক্ষা একটি মূল ভূমিকা পালন করে। এই নিবন্ধটি ইন্টিগ্রেশন পরীক্ষা লেখার জন্য ব্যবহারিক সুপারিশ প্রদান করে, বহিরাগত পরিষেবাগুলির সাথে ইন্টারঅ্যাকশনের স্পেসিফিকেশনগুলিতে কীভাবে ফোকাস করা যায় তা প্রদর্শন করে, পরীক্ষাগুলিকে আরও পাঠযোগ্য এবং বজায় রাখা সহজ করে তোলে। পদ্ধতিটি শুধুমাত্র পরীক্ষার দক্ষতা বাড়ায় না বরং অ্যাপ্লিকেশনের মধ্যে ইন্টিগ্রেশন প্রক্রিয়াগুলির আরও ভাল বোঝার প্রচার করে। নির্দিষ্ট উদাহরণের লেন্সের মাধ্যমে, বিভিন্ন কৌশল এবং সরঞ্জামগুলি - যেমন DSL র্যাপার, JsonAssert এবং Pact - অন্বেষণ করা হবে, পাঠককে ইন্টিগ্রেশন পরীক্ষার গুণমান এবং দৃশ্যমানতা উন্নত করার জন্য একটি বিস্তৃত নির্দেশিকা অফার করবে৷ নিবন্ধটি স্প্রিং অ্যাপ্লিকেশনগুলিতে HTTP মিথস্ক্রিয়া পরীক্ষা করার জন্য গ্রোভিতে স্পক ফ্রেমওয়ার্ক ব্যবহার করে সম্পাদিত ইন্টিগ্রেশন পরীক্ষার উদাহরণ উপস্থাপন করে। একই সময়ে, প্রস্তাবিত প্রধান কৌশল এবং পদ্ধতিগুলি HTTP এর বাইরে বিভিন্ন ধরণের মিথস্ক্রিয়াতে কার্যকরভাবে প্রয়োগ করা যেতে পারে। সমস্যার বর্ণনা প্রবন্ধটি স্বতন্ত্র পর্যায়ে স্পষ্ট বিভাজন সহ পরীক্ষা লেখার একটি পদ্ধতি বর্ণনা করে, প্রতিটি তার নির্দিষ্ট ভূমিকা পালন করে। আসুন এই সুপারিশগুলি অনুসারে একটি পরীক্ষার উদাহরণ বর্ণনা করি, তবে একটি নয় বরং দুটি অনুরোধের সাথে উপহাস করি। সংক্ষিপ্ততার জন্য আইনের পর্যায় (এক্সিকিউশন) বাদ দেওয়া হবে (একটি সম্পূর্ণ পরীক্ষার উদাহরণ পাওয়া যাবে)। বসন্তে কার্যকরী ইন্টিগ্রেশন টেস্ট লেখা: HTTP অনুরোধের জন্য সংগঠিত পরীক্ষার কৌশলগুলি প্রকল্পের সংগ্রহস্থলে উপস্থাপিত কোড শর্তসাপেক্ষে ভাগে বিভক্ত: "সহায়ক কোড" (ধূসর রঙের) এবং "বাহ্যিক মিথস্ক্রিয়াগুলির স্পেসিফিকেশন" (নীল রঙে)। সাপোর্টিং কোডে পরীক্ষার জন্য মেকানিজম এবং ইউটিলিটিগুলি অন্তর্ভুক্ত রয়েছে, যার মধ্যে রয়েছে ইন্টারসেপ্টিং রিকোয়েস্ট এবং অনুকরণ করা প্রতিক্রিয়া। এক্সটার্নাল ইন্টারঅ্যাকশনের স্পেসিফিকেশন বাহ্যিক পরিষেবা সম্পর্কে নির্দিষ্ট ডেটা বর্ণনা করে যা পরীক্ষার সময় সিস্টেমের সাথে ইন্টারঅ্যাক্ট করা উচিত, প্রত্যাশিত অনুরোধ এবং প্রতিক্রিয়া সহ। সাপোর্টিং কোড পরীক্ষার জন্য ভিত্তি স্থাপন করে, যখন স্পেসিফিকেশনটি সরাসরি ব্যবসায়িক যুক্তি এবং সিস্টেমের প্রধান ফাংশনগুলির সাথে সম্পর্কিত যা আমরা পরীক্ষা করার চেষ্টা করছি। স্পেসিফিকেশন কোডের একটি ছোট অংশ দখল করে কিন্তু পরীক্ষাটি বোঝার জন্য তাৎপর্যপূর্ণ মান উপস্থাপন করে, যেখানে সাপোর্টিং কোড, একটি বৃহত্তর অংশ দখল করে, কম মূল্য উপস্থাপন করে এবং প্রতিটি উপহাস ঘোষণার জন্য পুনরাবৃত্তিমূলক। কোডটি MockRestServiceServer-এর সাথে ব্যবহারের উদ্দেশ্যে করা হয়েছে। উল্লেখ করে, কেউ একই প্যাটার্ন দেখতে পারে: স্পেসিফিকেশন প্রায় অভিন্ন, এবং সাপোর্টিং কোড পরিবর্তিত হয়। WireMock-এ উদাহরণ এই নিবন্ধটির উদ্দেশ্য হল পরীক্ষা লেখার জন্য এমনভাবে ব্যবহারিক সুপারিশ প্রদান করা যাতে ফোকাস স্পেসিফিকেশনের উপর থাকে এবং সাপোর্টিং কোডটি একটি পিছনের আসন নেয়। বিক্ষোভের দৃশ্যকল্প আমাদের পরীক্ষার দৃশ্যের জন্য, আমি একটি অনুমানমূলক টেলিগ্রাম বট প্রস্তাব করছি যা ওপেনএআই এপিআইতে অনুরোধগুলি ফরোয়ার্ড করে এবং ব্যবহারকারীদের কাছে প্রতিক্রিয়া পাঠায়। পরিষেবাগুলির সাথে ইন্টারঅ্যাক্ট করার চুক্তিগুলি অপারেশনের মূল যুক্তিকে হাইলাইট করার জন্য একটি সরলীকৃত পদ্ধতিতে বর্ণনা করা হয়েছে। নীচে একটি সিকোয়েন্স ডায়াগ্রাম রয়েছে যা অ্যাপ্লিকেশন আর্কিটেকচার প্রদর্শন করে। আমি বুঝতে পারি যে নকশাটি একটি সিস্টেম স্থাপত্যের দৃষ্টিকোণ থেকে প্রশ্ন উত্থাপন করতে পারে, তবে অনুগ্রহ করে এটিকে বোঝার সাথে যোগাযোগ করুন—এখানে প্রধান লক্ষ্য হল পরীক্ষায় দৃশ্যমানতা বাড়ানোর পদ্ধতি প্রদর্শন করা। প্রস্তাব এই নিবন্ধটি পরীক্ষার লেখার জন্য নিম্নলিখিত ব্যবহারিক সুপারিশগুলি নিয়ে আলোচনা করে: উপহাসের সাথে কাজ করার জন্য ডিএসএল মোড়কের ব্যবহার। ফলাফল যাচাইয়ের জন্য JsonAssert ব্যবহার। JSON ফাইলগুলিতে বাহ্যিক মিথস্ক্রিয়াগুলির স্পেসিফিকেশন সংরক্ষণ করা। চুক্তি ফাইল ব্যবহার. উপহাস জন্য DSL মোড়ক ব্যবহার একটি DSL মোড়ক ব্যবহার করে বয়লারপ্লেট মক কোড লুকানোর অনুমতি দেয় এবং স্পেসিফিকেশনের সাথে কাজ করার জন্য একটি সহজ ইন্টারফেস প্রদান করে। এটি জোর দেওয়া গুরুত্বপূর্ণ যে যা প্রস্তাব করা হয়েছে তা একটি নির্দিষ্ট ডিএসএল নয় বরং একটি সাধারণ পদ্ধতি যা এটি প্রয়োগ করে। DSL ব্যবহার করে একটি সংশোধিত পরীক্ষার উদাহরণ নীচে উপস্থাপন করা হয়েছে ( )। সম্পূর্ণ পরীক্ষা পাঠ্য setup: def openaiRequestCaptor = restExpectation.openai.completions(withSuccess("{...}")) def telegramRequestCaptor = restExpectation.telegram.sendMessage(withSuccess("{}")) when: ... then: openaiRequestCaptor.times == 1 telegramRequestCaptor.times == 1 যেখানে পদ্ধতি , উদাহরণস্বরূপ, নিম্নরূপ বর্ণনা করা হয়েছে: restExpectation.openai.completions public interface OpenaiMock { /** * This method configures the mock request to the following URL: {@code https://api.openai.com/v1/chat/completions} */ RequestCaptor completions(DefaultResponseCreator responseCreator); } কোড এডিটরে মেথডের নামের উপর হোভার করার সময় পদ্ধতির উপর একটি মন্তব্য করা হলে, উপহাস করা হবে এমন URL দেখা সহ সাহায্য পেতে পারে। প্রস্তাবিত বাস্তবায়নে, মক থেকে প্রতিক্রিয়ার ঘোষণা দৃষ্টান্ত ব্যবহার করে করা হয়, কাস্টমগুলির জন্য অনুমতি দেয়, যেমন: ResponseCreator public static ResponseCreator withResourceAccessException() { return (request) -> { throw new ResourceAccessException("Error"); }; } প্রতিক্রিয়াগুলির একটি সেট নির্দিষ্ট করে অসফল পরিস্থিতিগুলির জন্য একটি উদাহরণ পরীক্ষা নীচে দেখানো হয়েছে: import static org.springframework.http.HttpStatus.FORBIDDEN setup: def openaiRequestCaptor = restExpectation.openai.completions(openaiResponse) def telegramRequestCaptor = restExpectation.telegram.sendMessage(withSuccess("{}")) when: ... then: openaiRequestCaptor.times == 1 telegramRequestCaptor.times == 0 where: openaiResponse | _ withResourceAccessException() | _ withStatus(FORBIDDEN) | _ ওয়্যারমকের জন্য, সবকিছু একই, প্রতিক্রিয়া গঠনটি সামান্য ভিন্ন ( , )। পরীক্ষা কোড প্রতিক্রিয়া ফ্যাক্টরি ক্লাস কোড আরও ভালো IDE ইন্টিগ্রেশনের জন্য @Language("JSON") টীকা ব্যবহার করা একটি DSL প্রয়োগ করার সময়, IntelliJ IDEA-তে নির্দিষ্ট কোড স্নিপেটগুলির জন্য ভাষা বৈশিষ্ট্য সমর্থন সক্ষম করতে এর সাথে পদ্ধতির প্যারামিটারগুলি টীকা করা সম্ভব। JSON এর সাথে, উদাহরণস্বরূপ, সম্পাদক স্ট্রিং প্যারামিটারটিকে JSON কোড হিসাবে বিবেচনা করবে, সিনট্যাক্স হাইলাইটিং, স্বয়ংক্রিয়-সম্পূর্ণতা, ত্রুটি পরীক্ষা, নেভিগেশন এবং কাঠামো অনুসন্ধানের মতো বৈশিষ্ট্যগুলিকে সক্ষম করে। এখানে টীকা ব্যবহারের একটি উদাহরণ: @Language("JSON") public static DefaultResponseCreator withSuccess(@Language("JSON") String body) { return MockRestResponseCreators.withSuccess(body, APPLICATION_JSON); } সম্পাদকে এটি কেমন দেখায় তা এখানে: ফলাফল যাচাইয়ের জন্য JsonAssert ব্যবহার করা JSONAssert লাইব্রেরি JSON কাঠামোর পরীক্ষা সহজ করার জন্য ডিজাইন করা হয়েছে। এটি ডেভেলপারদের সহজে প্রত্যাশিত এবং প্রকৃত JSON স্ট্রিংগুলিকে উচ্চ মাত্রার নমনীয়তার সাথে তুলনা করতে সক্ষম করে, বিভিন্ন তুলনা মোড সমর্থন করে। এটি এই মত একটি যাচাইকরণ বিবরণ থেকে সরানোর অনুমতি দেয় openaiRequestCaptor.body.model == "gpt-3.5-turbo" openaiRequestCaptor.body.messages.size() == 1 openaiRequestCaptor.body.messages[0].role == "user" openaiRequestCaptor.body.messages[0].content == "Hello!" এই মত কিছু করার জন্য assertEquals("""{ "model": "gpt-3.5-turbo", "messages": [{ "role": "user", "content": "Hello!" }] }""", openaiRequestCaptor.bodyString, false) আমার মতে, দ্বিতীয় পদ্ধতির প্রধান সুবিধা হল এটি বিভিন্ন প্রেক্ষাপটে - ডকুমেন্টেশন, লগ এবং পরীক্ষায় ডেটা প্রতিনিধিত্বের ধারাবাহিকতা নিশ্চিত করে। এটি পরীক্ষার প্রক্রিয়াটিকে উল্লেখযোগ্যভাবে সরল করে, তুলনামূলকভাবে নমনীয়তা প্রদান করে এবং ত্রুটি নির্ণয়ের ক্ষেত্রে নির্ভুলতা প্রদান করে। এইভাবে, আমরা শুধুমাত্র পরীক্ষা লেখার এবং রক্ষণাবেক্ষণে সময় বাঁচাই না বরং তাদের পঠনযোগ্যতা এবং তথ্যপূর্ণতাও উন্নত করি। স্প্রিং বুটের মধ্যে কাজ করার সময়, কমপক্ষে সংস্করণ 2 থেকে শুরু করে, লাইব্রেরির সাথে কাজ করার জন্য কোনও অতিরিক্ত নির্ভরতার প্রয়োজন হয় না, কারণ ইতিমধ্যেই এর উপর নির্ভরতা অন্তর্ভুক্ত রয়েছে। org.springframework.boot:spring-boot-starter-test org.skyscreamer:jsonassert JSON ফাইলগুলিতে বাহ্যিক মিথস্ক্রিয়াগুলির স্পেসিফিকেশন সংরক্ষণ করা আমরা একটি পর্যবেক্ষণ করতে পারি যে JSON স্ট্রিংগুলি পরীক্ষার একটি উল্লেখযোগ্য অংশ নেয়। তাদের কি লুকিয়ে রাখা উচিত? হ্যা এবং না. এটা বোঝা গুরুত্বপূর্ণ যে কি আরও সুবিধা নিয়ে আসে। এগুলি লুকিয়ে রাখলে পরীক্ষাগুলি আরও কমপ্যাক্ট হয় এবং প্রথম নজরে পরীক্ষার সারমর্ম উপলব্ধি করা সহজ হয়৷ অন্যদিকে, পুঙ্খানুপুঙ্খ বিশ্লেষণের জন্য, বাহ্যিক ইন্টারঅ্যাকশনের স্পেসিফিকেশন সম্পর্কে গুরুত্বপূর্ণ তথ্যের অংশ লুকিয়ে রাখা হবে, যার জন্য ফাইল জুড়ে অতিরিক্ত লাফ দিতে হবে। সিদ্ধান্তটি সুবিধার উপর নির্ভর করে: আপনার জন্য আরও আরামদায়ক তা করুন। আপনি যদি ফাইলগুলিতে JSON স্ট্রিংগুলি সংরক্ষণ করতে চান তবে একটি সহজ বিকল্প হল JSON ফাইলগুলিতে প্রতিক্রিয়া এবং অনুরোধগুলি আলাদাভাবে রাখা৷ নীচে একটি পরীক্ষা কোড ( ) একটি বাস্তবায়ন বিকল্প প্রদর্শন করে: সম্পূর্ণ সংস্করণ setup: def openaiRequestCaptor = restExpectation.openai.completions(withSuccess(fromFile("json/openai/response.json"))) def telegramRequestCaptor = restExpectation.telegram.sendMessage(withSuccess("{}")) when: ... then: openaiRequestCaptor.times == 1 telegramRequestCaptor.times == 1 পদ্ধতিটি কেবল ডিরেক্টরির একটি ফাইল থেকে একটি স্ট্রিং পড়ে এবং কোনও বিপ্লবী ধারণা বহন করে না তবে রেফারেন্সের জন্য এখনও প্রকল্পের সংগ্রহস্থলে উপলব্ধ। fromFile src/test/resources স্ট্রিং এর পরিবর্তনশীল অংশের জন্য, এর সাথে প্রতিস্থাপন ব্যবহার করার এবং মক বর্ণনা করার সময় মানগুলির একটি সেট পাস করার পরামর্শ দেওয়া হয়েছে, উদাহরণস্বরূপ: org.apache.commons.text.StringSubstitutor setup: def openaiRequestCaptor = restExpectation.openai.completions(withSuccess(fromFile("json/openai/response.json", [content: "Hello! How can I assist you today?"]))) যেখানে JSON ফাইলে প্রতিস্থাপন সহ অংশটি এইরকম দেখায়: ... "message": { "role": "assistant", "content": "${content:-Hello there, how may I assist you today?}" }, ... ফাইল স্টোরেজ পদ্ধতি অবলম্বন করার সময় ডেভেলপারদের জন্য একক চ্যালেঞ্জ হল টেস্ট রিসোর্সে একটি সঠিক ফাইল প্লেসমেন্ট স্কিম এবং একটি নামকরণ স্কিম তৈরি করা। একটি ভুল করা সহজ যা এই ফাইলগুলির সাথে কাজ করার অভিজ্ঞতাকে আরও খারাপ করতে পারে৷ এই সমস্যার একটি সমাধান স্পেসিফিকেশন ব্যবহার করা হতে পারে, যেমন চুক্তি থেকে, যা পরে আলোচনা করা হবে। Groovy-এ লেখা পরীক্ষায় বর্ণিত পদ্ধতি ব্যবহার করার সময়, আপনি অসুবিধার সম্মুখীন হতে পারেন: কোড থেকে ফাইলে নেভিগেট করার জন্য IntelliJ IDEA-তে কোনও সমর্থন নেই, তবে । জাভাতে লিখিত পরীক্ষাগুলিতে, এটি দুর্দান্ত কাজ করে। ভবিষ্যতে এই কার্যকারিতার জন্য সমর্থন যোগ করা হবে বলে আশা করা হচ্ছে চুক্তি চুক্তি ফাইল ব্যবহার করে পরিভাষা দিয়ে শুরু করা যাক। কন্ট্রাক্ট টেস্টিং হল ইন্টিগ্রেশন পয়েন্ট পরীক্ষা করার একটি পদ্ধতি যেখানে প্রতিটি অ্যাপ্লিকেশনকে বিচ্ছিন্নভাবে পরীক্ষা করা হয় যাতে এটি যে বার্তাগুলি পাঠায় বা গ্রহণ করে তা একটি "চুক্তিতে" নথিভুক্ত পারস্পরিক বোঝাপড়ার সাথে সামঞ্জস্যপূর্ণ। এই পদ্ধতি নিশ্চিত করে যে সিস্টেমের বিভিন্ন অংশের মধ্যে মিথস্ক্রিয়া প্রত্যাশা পূরণ করে। চুক্তি পরীক্ষার প্রেক্ষাপটে একটি চুক্তি হল একটি নথি বা স্পেসিফিকেশন যা অ্যাপ্লিকেশনগুলির মধ্যে আদান-প্রদান করা বার্তাগুলির বিন্যাস এবং কাঠামোর উপর একটি চুক্তি রেকর্ড করে। এটি যাচাই করার জন্য একটি ভিত্তি হিসাবে কাজ করে যে প্রতিটি অ্যাপ্লিকেশন সঠিকভাবে ইন্টিগ্রেশনে অন্যদের পাঠানো এবং প্রাপ্ত ডেটা প্রক্রিয়া করতে পারে। চুক্তিটি একটি ভোক্তা (উদাহরণস্বরূপ, একটি ক্লায়েন্ট কিছু ডেটা পুনরুদ্ধার করতে চায়) এবং একটি প্রদানকারীর (উদাহরণস্বরূপ, ক্লায়েন্টের প্রয়োজনীয় ডেটা সরবরাহকারী সার্ভারে একটি API) এর মধ্যে প্রতিষ্ঠিত হয়। ভোক্তা-চালিত পরীক্ষা হল চুক্তি পরীক্ষার একটি পদ্ধতি যেখানে ভোক্তারা তাদের স্বয়ংক্রিয় পরীক্ষা চলাকালীন চুক্তি তৈরি করে। এই চুক্তিগুলি প্রদানকারীর কাছে পাস করা হয়, যারা তারপর তাদের স্বয়ংক্রিয় পরীক্ষার সেট চালায়। চুক্তি ফাইলে থাকা প্রতিটি অনুরোধ প্রদানকারীর কাছে পাঠানো হয়, এবং প্রাপ্ত প্রতিক্রিয়া চুক্তি ফাইলে নির্দিষ্ট প্রত্যাশিত প্রতিক্রিয়ার সাথে তুলনা করা হয়। উভয় প্রতিক্রিয়া মিলে গেলে, এর মানে হল ভোক্তা এবং পরিষেবা প্রদানকারী সামঞ্জস্যপূর্ণ। অবশেষে, চুক্তি. Pact হল একটি টুল যা ভোক্তা-চালিত চুক্তি পরীক্ষার ধারনা বাস্তবায়ন করে। এটি কোড-ফার্স্ট টেস্ট ডেভেলপমেন্টের উপর ফোকাস করে HTTP ইন্টিগ্রেশন এবং মেসেজ-ভিত্তিক ইন্টিগ্রেশন উভয়ের পরীক্ষা সমর্থন করে। আমি আগে উল্লেখ করেছি, আমরা আমাদের কাজের জন্য প্যাক্টের চুক্তির স্পেসিফিকেশন এবং সরঞ্জামগুলি ব্যবহার করতে পারি। বাস্তবায়ন এই মত দেখতে পারে ( ): সম্পূর্ণ পরীক্ষার কোড setup: def openaiRequestCaptor = restExpectation.openai.completions(fromContract("openai/SuccessfulCompletion-Hello.json")) def telegramRequestCaptor = restExpectation.telegram.sendMessage(withSuccess("{}")) when: ... then: openaiRequestCaptor.times == 1 telegramRequestCaptor.times == 1 চুক্তি ফাইল । পর্যালোচনার জন্য উপলব্ধ চুক্তি ফাইল ব্যবহার করার সুবিধা হল যে তারা শুধুমাত্র অনুরোধ এবং প্রতিক্রিয়া বডি ধারণ করে না বরং বাহ্যিক মিথস্ক্রিয়া স্পেসিফিকেশন-অনুরোধের পথ, শিরোনাম এবং HTTP প্রতিক্রিয়া স্থিতির অন্যান্য উপাদানও ধারণ করে, এই ধরনের চুক্তির উপর ভিত্তি করে একটি মককে সম্পূর্ণরূপে বর্ণনা করার অনুমতি দেয়। এটা মনে রাখা গুরুত্বপূর্ণ যে, এই ক্ষেত্রে, আমরা নিজেদেরকে চুক্তি পরীক্ষায় সীমাবদ্ধ রাখি এবং ভোক্তা-চালিত পরীক্ষায় প্রসারিত করি না। যাইহোক, কেউ আরও চুক্তি অন্বেষণ করতে চাইতে পারে. উপসংহার এই নিবন্ধটি স্প্রিং ফ্রেমওয়ার্কের সাথে উন্নয়নের পরিপ্রেক্ষিতে ইন্টিগ্রেশন পরীক্ষার দৃশ্যমানতা এবং দক্ষতা বাড়ানোর জন্য ব্যবহারিক সুপারিশ পর্যালোচনা করেছে। আমার লক্ষ্য ছিল বাহ্যিক মিথস্ক্রিয়াগুলির স্পেসিফিকেশনগুলিকে স্পষ্টভাবে সংজ্ঞায়িত করার এবং বয়লারপ্লেট কোড কমানোর গুরুত্বের উপর ফোকাস করা। এই লক্ষ্য অর্জনের জন্য, আমি DSL wrappers এবং JsonAssert ব্যবহার করার পরামর্শ দিয়েছিলাম, JSON ফাইলগুলিতে স্পেসিফিকেশন সংরক্ষণ করে এবং চুক্তির মাধ্যমে চুক্তির সাথে কাজ করে। নিবন্ধে বর্ণিত পন্থাগুলির লক্ষ্য হল পরীক্ষা লেখার এবং বজায় রাখার প্রক্রিয়াকে সহজ করা, তাদের পঠনযোগ্যতা উন্নত করা, এবং সবচেয়ে গুরুত্বপূর্ণভাবে, সিস্টেমের উপাদানগুলির মধ্যে পারস্পরিক মিথস্ক্রিয়াকে সঠিকভাবে প্রতিফলিত করে পরীক্ষার মান উন্নত করা। পরীক্ষাগুলি প্রদর্শন করে প্রকল্পের সংগ্রহস্থলের লিঙ্ক - । স্যান্ডবক্স/বট নিবন্ধে আপনার মনোযোগের জন্য আপনাকে ধন্যবাদ, এবং কার্যকর এবং দৃশ্যমান পরীক্ষা লেখার জন্য আপনার সৌভাগ্য কামনা করছি!