আপনি কি কখনও শুনেছেন যে কেউ তাদের পরীক্ষাগুলি খুব দ্রুত হওয়ার বিষয়ে অভিযোগ করেছে? আমিও না।
দ্রুত পরীক্ষা মানে দ্রুত প্রতিক্রিয়া। আপনি সেগুলি স্থানীয়ভাবে চালান বা একটি অবিচ্ছিন্ন ইন্টিগ্রেশন পাইপলাইনে, যত তাড়াতাড়ি আপনার পরীক্ষা শেষ হবে, তত তাড়াতাড়ি আপনি ব্যর্থতার প্রতিক্রিয়া জানাতে পারবেন এবং আপনার কোড উন্নত করতে পারবেন। উৎপাদনশীলতা লাভের পাশাপাশি, এটা সুপরিচিত যে ধীরগতির পরীক্ষাগুলি ডেভেলপারদের বিরক্তিকর করে তোলে। কেউ তাদের ডেভেলপারদের বদমেজাজি পছন্দ করে না।
যতটুকু বলা হয়েছে, একটি বিদ্যুত-দ্রুত টেস্ট স্যুট তৈরি করা সবসময় ততটা সহজ নয় যতটা আপনি আশা করেন। সৌভাগ্যবশত, Rails 6 সমান্তরাল পরীক্ষা নামে একটি উত্তেজনাপূর্ণ বৈশিষ্ট্য চালু করেছে . এটি দিয়ে শুরু করা অনায়াসে এবং আপনার পরীক্ষার গতি বাড়াতে পারে। যাইহোক, কিছু ক্ষতির জন্য সতর্ক থাকতে হবে।
সমান্তরাল পরীক্ষা কি?
সমান্তরাল পরীক্ষার মানে কি?
আপনি যখন একটি টেস্ট স্যুট চালান, তখন আপনার পরীক্ষার রানার সাধারণত একটি একক প্রক্রিয়া তৈরি করবে যাতে আপনার পরীক্ষাগুলি একের পর এক চালানো হয় — অথবা ক্রমিকভাবে . একটি একক পরীক্ষা প্রক্রিয়া একটি একক CPU কোর ব্যবহার করে৷ আপনি সম্ভবত কল্পনা করতে পারেন, এই পদ্ধতিটি আধুনিক হার্ডওয়্যারের সম্পূর্ণ সুবিধা গ্রহণ করে না, যা প্রায়শই ডজন ডজন CPU কোর খেলা করে৷
আপনার কাছে 10টি সিপিইউ কোর সহ একটি অভিনব ম্যাকবুক থাকতে পারে, কিন্তু দুঃখের বিষয়, এটি আপনার পরীক্ষাগুলিকে দ্রুততর করবে না!
আমরা একাধিক কর্মী প্রক্রিয়ায় পৃথক পরীক্ষা বিতরণ করে এটি পরিবর্তন করতে পারি। পরীক্ষাগুলি আর একে অপরের পরে চলবে না, তবে একে অপরের পাশে — সমান্তরালে . আপনার টেস্ট স্যুট দুইজন কর্মী চালনা করা একজন কর্মীকে একই টেস্ট স্যুট চালানোর চেয়ে দ্বিগুণ দ্রুত।
আপনার মেশিনে যত বেশি কোর থাকবে, তত বেশি কর্মী প্রক্রিয়াগুলি সম্ভব হবে এবং এইভাবে, আপনার পরীক্ষা স্যুটটি দ্রুত শেষ হবে। বলুন আপনার পরীক্ষাগুলি সাধারণত আট মিনিট সময় নেয়। চারটি কর্মী প্রক্রিয়া ব্যবহার করে একই পরীক্ষা চালানো হলে রানটাইম প্রায় দুই মিনিটে নেমে যাবে!
একটি সুন্দর, চর্বিযুক্ত 16 কোর মেশিনে একই কাজ করার কল্পনা করুন, যেখানে আমরা ষোলজন কর্মী তৈরি করতে পারি। সত্যিই খুব সুন্দর!
রেলে সমান্তরাল পরীক্ষা কনফিগার করা
তাহলে কিভাবে আমরা সেখানে পেতে পারি? সম্প্রতি অবধি, আপনি আপনার টেস্ট স্যুটকে সমান্তরাল করার জন্য তৃতীয়-পক্ষের রত্ন ব্যবহার করতে পারেন, কিন্তু রেল 6 থেকে শুরু করে, সমান্তরাল পরীক্ষাগুলি মানসম্মত হয়। এটি parallelize যোগ করার মতোই সহজ৷ আপনার পরীক্ষায়:
এই কনফিগারেশনটি ব্যবহার করে, আপনার মেশিনে প্রসেসরের সংখ্যার উপর ভিত্তি করে রেলগুলি স্বয়ংক্রিয়ভাবে কর্মী প্রক্রিয়াগুলি তৈরি করবে। রেলগুলি নামস্থানযুক্ত ডেটাবেসও তৈরি করবে (যেমন database-test-0 , database-test-1 , ইত্যাদি) আপনার পরীক্ষা চালানোর জন্য।
এটা শুরু করতে লাগে সব! অবশ্যই, যদি আপনার প্রয়োজন হয় তবে কিছু অতিরিক্ত কনফিগারেশন বিকল্প রয়েছে।
কখনও কখনও, আপনাকে সমান্তরাল পরীক্ষার জন্য একটি নির্দিষ্ট সেটআপ বা পরিষ্কার করতে হতে পারে। রেলগুলি আপনার ব্যবহারের জন্য দুটি হুক সরবরাহ করে — parallelize_setup এবং parallelize_teardown . নতুন কর্মী প্রক্রিয়ার জন্মের আগে এবং পরে এগুলিকে বলা হয়:
এছাড়াও আপনি ম্যানুয়ালি কর্মীদের সংখ্যা সেট করতে পারেন:
বিকল্পভাবে, PARALLEL_WORKERS ব্যবহার করুন একটি বিদ্যমান কনফিগারেশন ওভাররাইড করতে পরিবেশ পরিবর্তনশীল:
আপনার টেস্ট স্যুটকে সমান্তরাল করতে কর্মীদের পরিবর্তে থ্রেড ব্যবহার করার বিকল্পও রয়েছে।
with: :threads JRuby বা TruffleRuby ব্যবহার করার সময় এটি ডিফল্ট বিকল্প। থ্রেড ব্যবহার করে, তাত্ত্বিকভাবে, কিছুটা ভালো কর্মক্ষমতা প্রদান করে। সব পরে, থ্রেড প্রক্রিয়ার তুলনায় কম ওভারহেড প্রয়োজন. অনুশীলনে, যাইহোক, আমি কখনই থ্রেডসাল ব্যবহার করা খুব দরকারী খুঁজে পাইনি, এবং বেশিরভাগ অংশের জন্য প্রক্রিয়া-ভিত্তিক সমান্তরালকরণে লেগে থাকা আপনার ভাল হওয়া উচিত।
ক্ষতি থেকে সাবধান থাকুন
তাই আপনাকে যা করতে হবে তা হল parallelize যোগ করুন আপনার বিদ্যমান পরীক্ষা অবিশ্বাস্য গতির অভিজ্ঞতা? এটা খুব সহজ!
আপনি যদি ভাগ্যবান হন তবে এটি সত্যিই সত্য। আপনার বিদ্যমান টেস্ট স্যুটে প্রথম সমান্তরালকরণ যোগ করার সময় আপনি কিছু অপ্রত্যাশিত স্নেগ আঘাত করার সম্ভাবনা বেশি। এটা অবশ্যই আমার ক্ষেত্রে ছিল!
একটা জিনিস বের করা যাক। আপনি যদি Minitest এর পরিবর্তে RSpec ব্যবহার করেন তবে আপনার ভাগ্যের বাইরে। RSpec রেল 6 বিল্ট-ইন সমান্তরাল পরীক্ষা সমর্থন করে না। এটি পরিবর্তন করার বিষয়ে একটি চলমান আলোচনা চলছে, কিন্তু কিছু সময়ের জন্য কোন উল্লেখযোগ্য অগ্রগতি হয়নি। আপনি যদি RSpec-এর সাথে সমান্তরাল পরীক্ষা চান, আপনার সেরা বাজি এখনও তৃতীয় পক্ষের রত্ন যেমন grosser/parallel_tests ব্যবহার করা।
আরেকটি অপ্রত্যাশিত সমস্যা যা আপনি সম্মুখীন হতে পারেন তা হল সমান্তরালভাবে অল্প সংখ্যক পরীক্ষা চালানোর ফলে শেষ হয় ধীর তারপর তাদের ধারাবাহিকভাবে চালান। সমান্তরাল পরীক্ষা সেট আপ করা একটি গুরুত্বপূর্ণ ওভারহেডের সাথে আসে — যেমন মাল্টিপল ডেটাবেস তৈরি করা — যা সমান্তরালকরণ থেকে আপনি পেতে পারেন এমন কোনও লাভকে দূর করতে পারে৷
অল্প সংখ্যক পরীক্ষার জন্য সমান্তরাল পরীক্ষা নিষ্ক্রিয় করা আপনার পক্ষে ভাল হতে পারে। আপনি PARALLEL_WORKERS ব্যবহার করে তা করতে পারেন পরিবেশ পরিবর্তনশীল:
আপনি যখন অনেক পরীক্ষা চালান তখনই রেল 7 সমান্তরাল এক্সিকিউশন সক্ষম করে এটিকে সমাধান করে। সুতরাং আপনি যদি ইতিমধ্যে আপগ্রেড করে থাকেন তবে আপনি এই সমস্যাটি অনুভব করবেন না। ডিফল্ট অনুযায়ী, সমান্তরাল থ্রেশহোল্ড 50 এ সেট করা হয়েছে, কিন্তু আপনি ওভাররাইড করতে পারেন:
শেষ যে সমস্যাটি আমি হাইলাইট করতে চাই তা হল আপনি যেটির মুখোমুখি হতে পারেন, এবং এটি মোকাবেলা করা সবচেয়ে প্রতারক এবং কঠিন। আপনার পরীক্ষার স্যুটের জন্য সমান্তরাল পরীক্ষাগুলি সক্ষম করার সময় আপনি র্যান্ডম ব্যর্থতা দেখতে শুরু করতে পারেন। কীভাবে সমান্তরালকরণ এটি ঘটাতে পারে তা বোঝার জন্য, আসুন একটি সাধারণ পরীক্ষার ক্ষেত্রে দেখি:
কিছুটা অকেজো হওয়ার পাশাপাশি, এই পরীক্ষাটি পুরোপুরি সূক্ষ্ম। যতক্ষণ পর্যন্ত এটি ক্রমিকভাবে চালানো হবে ততক্ষণ এটি 100% সময় পাস করবে। প্রতিটি পরীক্ষা আলাদা করা হয়, এবং এই পরীক্ষাগুলি এলোমেলো ক্রমে সম্পাদন করা তাদের ব্যর্থ হওয়ার কারণ হয় না। আপনি যখন মিশ্রণে একাধিক প্রক্রিয়া বা থ্রেড যোগ করেন তখন এটি পরিবর্তন হয়।
সমান্তরালভাবে পরীক্ষা চালানোর সময়, CPU শিডিউলিংয়ের কারণে আপনার পরীক্ষায় পৃথক বিবৃতিগুলির সম্পাদনের ক্রম পরিবর্তিত হতে পারে। উদাহরণের দিকে তাকালে, আপনি কখনও কখনও মৃত্যুদন্ডের আদেশ দেখতে পাবেন যেমন এটি:
যেহেতু ওয়ার্কার 2 ওয়ার্কার 1 এর দাবী কার্যকর করার আগে ফাইলটি মুছে দিয়েছে, প্রথম পরীক্ষাটি ব্যর্থ হবে — কখনও কখনও। আঘাতের সাথে অপমান করার জন্য, একটি ভিন্ন মৃত্যুদন্ডের আদেশ কখনও কখনও দ্বিতীয় পরীক্ষাকে ব্যর্থ করে দেয় এবং প্রথমটি পাস করে।
এই সাধারণ উদাহরণটি এমন একটি সমস্যাকে চিত্রিত করে যা শুধুমাত্র ফাইলগুলিতেই নয়, যেকোন সিঙ্গেলটন রিসোর্সেও প্রসারিত হয় যা আপনার পরীক্ষা একটি নন-থ্রেড-নিরাপদ উপায়ে অ্যাক্সেস করে। ধরুন আপনি একটি Redis ডাটাবেস বা একটি Elasticsearch সূচকে লিখুন। সেই ক্ষেত্রে, আপনি সম্ভবত অনুরূপ জটিলতার সম্মুখীন হবেন। সবচেয়ে খারাপ বিষয় হল, র্যান্ডম ব্যর্থতার কারণ সমস্ত পরীক্ষাগুলি উন্মোচন করতে আপনার কিছুটা সময় লাগতে পারে — এবং সবগুলি ঠিক করতে আরও বেশি সময় লাগতে পারে৷
ফ্ল্যাকি সমান্তরাল পরীক্ষা মোকাবেলার জন্য কোন সিলভার বুলেট নেই। সাধারণভাবে, আপনাকে নিশ্চিত করতে হবে যে একাধিক পরীক্ষা প্রক্রিয়া সম্পদ ভাগ করে না। ফাইলগুলির জন্য, Tempfiles ব্যবহার করুন৷ parallelize_setup ব্যবহার করুন৷ নামস্থানযুক্ত সংস্থান তৈরি করতে (যেমন রেডিস ডেটাবেস)। ইত্যাদি।
বিদ্যমান রেল পরীক্ষায় সমান্তরাল পরীক্ষা যোগ করা হচ্ছে
ধরা যাক আপনি সমান্তরালকরণের কারণে এলোমেলো পরীক্ষা ব্যর্থতার সাথে লড়াই করছেন এবং সেগুলি ঠিক করার সময় নেই। যাইহোক, আপনি এখনও সমান্তরাল পরীক্ষার সুবিধা পেতে চান। আপনি শুধুমাত্র আপনার পরীক্ষার একটি উপসেটের জন্য এটি সক্ষম করতে পছন্দ করতে পারেন।
শুধুমাত্র পরীক্ষা করে যে কল parallelize সব পরে সমান্তরাল করা হবে, এবং উদ্বেগ বা অভিভাবক ক্লাস ব্যবহার করে, আপনি আপনার পরীক্ষা স্যুটে একটি সময়ে একটি পরীক্ষা ক্লাস সমান্তরাল যোগ করতে পারেন। আপনি এই মত একটি মডিউল তৈরি করতে পারেন:
এই মডিউলটি অন্তর্ভুক্ত যেকোন পরীক্ষা ক্লাস এখন সমান্তরালে চলবে:
বিকল্পভাবে, আপনি ParallelTest-এর মতো একটি নতুন পরীক্ষার ক্লাস তৈরি করতে পারেন :
তারপর, সমান্তরালভাবে চালানো উচিত এমন পরীক্ষাগুলির জন্য এটি থেকে উত্তরাধিকারসূত্রে প্রাপ্ত করুন — এবং যেগুলি সমস্যাযুক্ত প্রমাণিত হয় সেগুলি ত্যাগ করুন৷
একটি ব্যান্ডাইড হিসাবে সমান্তরাল পরীক্ষা
সমান্তরাল পরীক্ষা সামান্য প্রচেষ্টার জন্য চিত্তাকর্ষক গতি লাভ প্রদান করে। যদিও প্রতারিত হবেন না:আপনার টেস্ট স্যুটগুলির গতি উন্নত করার জন্য এটি অন্য পদ্ধতির বিকল্প নয়, বরং একটি সংযোজন।
আপনি যদি দেখেন যে আপনার টেস্ট স্যুটটি ধীরগতির এবং প্রচেষ্টাকে ছাড় দিতে পারে, তবে এটির প্রোফাইলে কিছু সময় ব্যয় করুন এবং ধীরতার মূল কারণ/গুলিকে মোকাবেলা করুন। এতে সমান্তরাল টেস্টিং যুক্ত একটি ধীরগতির টেস্ট স্যুট দ্রুততর হবে, কিন্তু ইতিমধ্যেই দ্রুততম টেস্ট স্যুটের মতো দ্রুত হবে না যা সমান্তরালে চলে!
রেপ আপ
এই পোস্টে, আমরা সমান্তরাল পরীক্ষা কী তা দেখেছি, আপনি কীভাবে এটি সেট আপ করতে পারেন এবং কীভাবে এটি কনফিগার করবেন। আপনার পরীক্ষাগুলিকে দ্রুততর করার জন্য আপনার যদি কোনও উপায়ের প্রয়োজন হয়, সমান্তরাল পরীক্ষা ঠিক সেইটিই প্রদান করে৷
৷আপনার পরীক্ষা স্যুটে সমান্তরাল পরীক্ষা যোগ করার সময় আপনি কিছু বাধার সম্মুখীন হতে পারেন। আশ্চর্য হবেন না যখন বছরের পর বছর ধরে অস্থিতিশীল পরীক্ষাগুলি হঠাৎ ব্যর্থ হতে শুরু করে। আপনি আপনার পরীক্ষা স্যুটের একটি উপসেটকে সমান্তরাল করে তাদের চারপাশে কাজ করতে পারেন।
আপনি যে পদ্ধতিই বেছে নিন না কেন, সমান্তরাল পরীক্ষা আপনার পরীক্ষার গতি বাড়ানোর জন্য একটি দুর্দান্ত সরঞ্জাম!
শুভ কোডিং!
পি.এস. আপনি যদি রুবি ম্যাজিক পোস্টগুলি প্রেস থেকে বের হওয়ার সাথে সাথে পড়তে চান তবে আমাদের রুবি ম্যাজিক নিউজলেটারে সাবস্ক্রাইব করুন এবং একটি পোস্ট মিস করবেন না!
Hans-Jörg Schnedlitz
আমাদের অতিথি লেখক হ্যান্স ভিয়েনা, অস্ট্রিয়ার একজন রেল ইঞ্জিনিয়ার। তিনি তার বেশিরভাগ সময় কোডিং বা কোডিং সম্পর্কে পড়ার জন্য ব্যয় করেন এবং কখনও কখনও তার ব্লগে এটি সম্পর্কে লেখেন! তিনি যখন স্ক্রিনের সামনে বসে থাকবেন না, তখন সম্ভবত আপনি তাকে বাইরে পাহাড়ে আরোহণ করে খুঁজে পাবেন।
Hans-Jörg Schnedlitz
এর সমস্ত নিবন্ধ