টেস্ট অটোমেশনে ব্যবহৃত ডিজাইন প্যাটার্ন -TAP অথবা POM

টেস্ট অটোমেশনে ব্যবহৃত ডিজাইন প্যাটার্ন  -TAP অথবা POM
অগাস্ট ৩১, বুধবার, ২০১৬


আগের এক লেখায় বলেছিলাম Seleniam IDE ব্যবহার করার পর ইচ্ছা আছে Selenium WebDriver নিয়ে টেস্ট অটোমেশনের কাজ করবো। কিছুটা কাজ এর মধ্যে করেছি, আর তা করতে গিয়ে Selenium WebDriver নিয়ে যতটা না মুগ্ধ হয়েছি, তার থেকে বেশি হয়েছি প্রজেক্টে ব্যবহৃত ডিজাইন প্যাটার্ন নিয়ে।


ডিজাইন প্যাটার্ন ব্যবহার করায় কোডের পুনঃব্যবহার বা কোড রি-ইউসেবিলিটি যে কতটা সহজ হয় আর তাতে করে যেকোনো প্রজেক্ট কত সহজে "নামানো' যায় - তাই শিখলাম এই কয়দিনে।

প্রথমতঃ Selenium IDE  আর Selenium WebDriver -এর পার্থক্যটা পরিষ্কার করে নেই।  প্রথমটা Mozilla Firefox ব্রাউজার -এর একটা এড-অন বা প্লাগ-ইন -- যা একজন ইউসারের ওয়েবসাইটে করা বিভিন্ন ক্লিক, টাইপ ইত্যাদি রেকর্ড করে পরে আবার সেই অ্যাকশন গুলো রিপ্লে করতে দেয়।    পরেরটা (Seleinum  WebDriver) বিভিন্ন ল্যাঙ্গুয়েজে (যেমন, Java, C#, Ruby, Python  ইত্যাদি) ইমপ্লিমেন্ট করা API -এর কালেকশন। সোজা কথায়, Seleium WebDriver ব্যবহার করতে আপনাকে কোনো একটা প্রোগ্রামিং ল্যাঙ্গুয়েজে ব্যবহার করতে হবে।  আমরা java ব্যবহার করছি।

আচ্ছা, এইবার তাহলে ডিজাইন প্যাটার্ন -এর কথা বলি।

ধরা যাক, আমাদের একটা ওয়েবসাইটের লগইন পেজ আছে (ছবি -১)।
ছবি - ১: লগইন পেজ 
যাতে ইউসারনেম / পাসওয়ার্ড দিয়ে লগইন করলে ব্রাউসার মূল আরেকটা পেজে যায় (ছবি -২)। সেই মূল পেজে অনেকগুলো অপশন আছে। আমরা শুধু এই মূল পেজে যাবার কাজ টুকুই অটোমেট করবো।

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

আরেকটু খুলে বলি, আইডিয়াটা হচ্ছে, প্রতিটা ওয়েবপেজের জন্য একটা Java ক্লাস ফাইল থাকবে, যা পেজটাকে রিপ্রেজেন্ট করবে। এই ক্লাস ওই পেজের যাবতীয় এলিমেন্ট হ্যান্ডেল করবে। যেমন, আমাদের লগইন পেজে দুটো টেক্সট বক্স আর একটা বাটন আছে।  এর জন্য একটা ক্লাস অনেকটা নিচের মতো হবে :

ছবি -৩: লগইন পেজের জন্য ক্লাস 

ক্লাসের এলিমেন্ট গুলো হচ্ছে ওই টেক্সট বক্স আর বাটন। ব্রাউসার থেকে ঐগুলো চিনে নেয়ার জন্য 'defineRequired' মেথডটা ওদের নাম ব্যবহার করছে, যেমন 'login'। আর নাম দিয়ে এলিমেন্ট গুলো ব্রাউসার থেকে খুঁজে নেয়ার জন্য ব্রাউসার-এর ড্রাইভার (driver) ব্যবহার করছে। এই নাম গুলো খুব সহজেই ব্রাউসার-র view source থেকে (গুগল Chrome -এ F12 key চাপলেই তা ওপেন হবে) বের করা যায় (ছবি - ৪) :
ছবি - ৪: ব্রাউজারের View Source (F -১২ বাটন)
এই মেথড আরেকটা কাজ করছে। আমরা আসলেই লগইন পেজে আছি কিনা এটা যাচাই করছে। খেয়াল করে দেখুন সবগুলো এলিমেন্ট খুঁজে পাওয়ার পর অর্থাৎ নন-নাল হলেই কেবল মেথডটি true রিটার্ন করছে।  অন্যদিকে মেথড 'loginAs' এই এলিমেন্টে গুলো ব্যবহার করে ব্যবহারকারীকে লগইন করার সুযোগ করে দিচ্ছে।

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

এইবার আসি অ্যাকশন এর কথায়।  আমাদের অ্যাকশন (অর্থাৎ, লগইন পেজে যাওয়া আর ইউসারনেম/পাসওয়ার্ড দিয়ে সাবমিট বাটন ক্লিক করা) এই দুইটি পেজ ব্যবহার করে করবে। আরেকটু স্পেসিফিকভাবে বললে, এই দুইটি পেজের মেথড গুলো ব্যবহার করবে। অর্থাৎ, আমাদের অ্যাকশন আরেকটা Java ক্লাস হবে, যে আবার নিজের মধ্যেই ওই দুই পেজের অবজেক্ট রেফারেন্স রেখে দিবে (new অবজেক্ট তৈরি করে নিবে)। এই অ্যাকশন ক্লাসটা দেখতে নিচের (ছবি - ৫)মতো হবেঃ  

ছবি - ৫: অ্যাকশন পেজ-র java ক্লাস  
প্রথমে লগইন পেজে যাওয়ার পর, চেক করে দেখতে হবে আমরা আসলেই লগইন পেজে আছি কিনা। ছবি - ৫ -এ ৯১ নম্বর লাইনে 'isCurrentPage()' [সুপার ক্লাসের একটা মেথড] আসলে লগইন পেজের 'defineRequired()' মেথড কল করছে এইটা নিশ্চিত হবার জন্য। এরপর 'loginAs' মেথড কল করে লগইন করছে। শেষমেশ, মূল পেজের [ছবি ৫-এর লাইন ৯৩] 'isCurrentPage()' মেথড কল করে আমরা নিশ্চিত হচ্ছি যে আমরা লগইন করে মূল পেজে আছি কিনা।

আর আমাদের টেস্টকেসে এই অ্যাকশন-এর অবজেক্ট তৈরি করে এর execute() মেথড কল করলেই হবে। নিচের ছবি - ৬ -এ লাইন ৪৬-এ অবজেক্ট তৈরি করছে,  আর ৫২ নম্বর লাইনে execute মেথড কল করছে: 

ছবি - ৬: টেস্ট -এর java ক্লাস 
ব্যস, আমাদের  টেস্ট (T) ,অ্যাকশন (A)  আর পেইজ (P ) - TAP ডিজাইন প্যাটার্ন  ইমপ্লিমেন্ট করা শেষ।  আপাত দৃষ্টিতে অনেকবেশি কাজ মনে হলেও কাজগুলো কিন্ত আমাদের প্রথম করা চিন্তার সাথে যায়।  

এখন প্রশ্ন হচ্ছে এতে করে লাভ কি হলো? আর কোড রি-ইউসেবিলিটিও বা কিভাবে হলো? 

একটু ভেবে দেখুন, এরপর আমাদের যেকোনো টেস্ট কেস যেখানে লগইন করার দরকার হবে, আমরা কেবল আমাদের লগইন অ্যাকশন অবজেক্ট তৈরি করে এর execute মেথড কল করবো, কাজ হয়ে যাবে। একইভাবে, আমাদের অন্য কোনো অ্যাকশন (ধরা যাক মূল পেজে কোনো লিংক যেমন 'Companies' ক্লিক করা) ইমপ্লিমেন্ট করার দরকার হলে, মূল পেজ -এর জাভা ক্লাস, নতুন করে ইমপ্লিমেন্ট করার দরকার নাই।  আগের ক্লাসটাই ব্যবহার করতে পারবো।  এছাড়াও আরেকটা বড় সুবিধা হলো, ভবিষ্যতে যদি আমাদের ওয়েবপেজের UI বদলে যায় (এটা খুবই কমোন একটা ব্যাপার, হবেই মোটামুটি ধরে নেয়া যায়)। যেমন, নতুন এলিমেন্ট যোগ হতে পারে, এলিমেন্ট গুলোর নাম বদলে যেতে পারে ইত্যাদি। আমাদের পরিচিত/ব্যবহৃত ওয়েবসাইট গুলোর কথা একটু চিন্তা করে দেখলেই দেখবেন যে গত কয়েক বছরে কতবার এদের UI বা চেহারা পাল্টেছে। তাহলে পুরো টেস্ট টা নতুন করে লেখার দরকার নাই, শুধু পেজের Java ক্লাসটা আপডেট করে নিলেই হবে।  

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


ছবি -৭: TAP - কোড স্ট্রাকচার 

আমাদের এই TAP আসলে Page Object Model বা POM -এরই আরেকটা উদাহরণ। ইন্টারনেটে POM -র উপর অনেক ভালো ভালো আর্টিকেল আছে।  আমি আমার মতো করেই লিখলাম আর কি। কারো আরো কোনো ভালো আর্টিকেল জানা থাকলে কমেন্টে দিয়ে দেবেন, প্লিজ। 


ধন্যবাদ, 
--ইশতিয়াক।

সিস্টেম ডিজাইনের উপর সম্ভাব্য ইন্টারভিউ প্রশ্নের জন্য যেভাবে প্রিপারেশন নিতে পারেন

সিস্টেম ডিজাইনের উপর সম্ভাব্য ইন্টারভিউ প্রশ্নের জন্য যেভাবে প্রিপারেশন নিতে পারেন ১৪ এপ্রিল, শুক্রবার, ২০১৭ সাইফুল ভাই লোকটা খুবই মজার,...