আজ আমরা ওয়েব অ্যাপ্লিকেশনের অটোমেটিক ফাংশনাল টেস্ট সম্পর্কে জানব। ফাংশনাল টেস্ট কী, ওয়েব অ্যাপ্লিকেশনে ফাংশনাল টেস্ট কীভাবে করা হয়, আমরা Python এবং Selenium WebDriver ব্যবহার করে কীভাবে এটিকে স্বয়ংক্রিয় করতে পারি এবং কী কী বিষয় লক্ষ্য রাখতে হবে সে সম্পর্কে আলোচনা করবো।

ফাংশনাল টেস্ট কী

ফাংশনাল টেস্ট হচ্ছে এমন এক ধরনের টেস্ট যার মাধ্যমে একটি অ্যাপ্লিকেশন কিংবা সফটওয়্যারের Requirements অনুসারে সব ফাংশনালিটি সঠিক ভাবে কাজ করছে কিনা তা নিশ্চিত করা। এটি মূলত এক প্রকার ব্ল্যাকবক্স টেস্টিং। এখানে অ্যাপ্লিকেশনের সোর্স কোড নিয়ে তেমন মাথা ঘামানো হয় না। ফাংশনালিটি টেস্টের মাথা ঘামানোর মূল বিষয় হচ্ছে End-user Usability, Application Programming Inteface, Database এর মতো বিষয়াদি। ফাংশনাল টেস্ট ম্যানুয়ালি এবং অটোমেটেড দুইভাবেই করা যায়।

ওয়েব অ্যাপ্লিকেশনে কীভাবে ফাংশনাল টেস্ট করা হয়

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

সেলেনিয়াম ওয়েবড্রাইভার (Selenium WebDriver)

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

Selenium WebDriver এর ইতিহাস

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

ড্রাইবার ডাউনলোড

এখন আমরা গুগল ক্রোমের জন্য Selenium WebDriver ডাউনলোড করবো। ইচ্ছা করলে আমরা অন্য ব্রাউজারের জন্য করতে পারি। https://www.seleniumhq.org/download/ সাইট থেকে পছন্দমত ব্রাউজারের ড্রাইভার ডাউনলোড করতে পারি। ক্রোমের জন্য সরাসরি এই লিংক https://sites.google.com/a/chromium.org/chromedriver/ থেকে ড্রাইভার ডাউনলোড করা যায়।

ইন্সটলেশন

  • সবার প্রথমে আমরা পাইথন ৩ ইন্সটল করতে হবে। নিচের কমান্ড গুলো Ubuntu টার্মিনালে পেস্ট করে পাইথন ৩ ইন্সটল করতে পারি

    1. sudo add-apt-repository ppa:jonathonf/python-3.6
    2. sudo apt-get update
    3. sudo apt-get install python3.6

    পাইথন সঠিকভাবে ইন্সটল হয়েছে কিনা নিশ্চিত করতে টার্মিনালে python3 -V লিখে এন্টার দিলে ভার্সন নম্বর দেখতে পাবো

Screenshot-from-2019-07-29-19-49-46-5

  • তারপর pip ইন্সটল করতে হবে। pip হচ্ছে পাইথনের একটি প্যাকেজ ম্যানেজার। pip দিয়ে পাইথনের বিভিন্ন প্যাকেজ ইন্সটল করতে পারি, যে প্যাকেজ গুলো পাইথনের স্ট্যান্ডার্ড লাইব্রেরীর অন্তর্ভুক্ত নয়। নিচের কমান্ডটি Ubuntu টার্মিনালে পেস্ট করে pip3 ইন্সটল করতে পারি

    • sudo apt install python3-pip

    pip সঠিকভাবে ইন্সটল হয়েছে কিনা নিশ্চিত করতে টার্মিনালে pip3 --version লিখে এন্টার দিলে ভার্সন নম্বর দেখতে পাবো।

Screenshot-from-2019-08-08-15-51-03-1

  • এরপর pip ব্যবহার করে python virtual environment ইন্সটল করতে পারি। virtual environment পাইথনের সকল প্যাকেজ সিস্টেম থেকে isolated করে রাখে, এতে করে একই সিস্টেমে পাইথনের দুই বা তার অধিক প্রজেক্টে কোন সমস্যা ছাড়া কাজ করা যায়। virtual environment নিচের কমান্ডের মাধ্যমে ইন্সটল করব

    • pip install virtualenv
  • তারপর আমরা নতুন virtual environment ক্রিয়েট করবো। টার্মিনালে virtualenv venv লিখে এন্টার করলে বর্তমান working directory তে venv নামক একটি virtual environment ক্রিয়েট হবে। virtual environment এক্টিভ করতে টার্মিনালে source venv/bin/activate লিখে এন্টার করবো। সবকিছু ঠিক থাকলে টার্মিনালে (venv) লিখাটা ইউজারের নামের আগে দেখা যাবে, এর মানে virtual environment এক্টিভ হয়েছে।

Screenshot-from-2019-07-29-19-53-04-1

  • virtual environment এক্টিভ হওয়ার পর আমার Selenium এর প্যাকেজ ইন্সটল করবো। নিচের কমান্ড ফলো করে আমরা প্যাকেজটি ইন্সটল করতে পারি

    • pip install selenium
  • এখানে জটিলতা পরিহার করার জন্য প্রজেক্টের route directory তে পূর্বের ডাউনলোড করা chromedriver ফাইলটি রাখবো এবং ফাইলটিকে executable পারমিশন দিতে হবে। টার্মিনাল থেকে sudo chmod +x chromedriver লিখে এন্টার চাপলে ফাইলটি executable পারমিশন পাবে

  • এখন প্রজেক্টের route directory তে functional_test.py নামের (নাম ইচ্ছা মত দিতে পারি) একটি ফাইল ক্রিয়েট করবো।

অটোমেটেড টেস্ট কেস লেখা

Screenshot-from-2019-07-29-18-45-22

  • functional_test.py ফাইলটি যেকোন টেক্সট এডিটরে ওপেন করি। সবার প্রথমে আমরা webdriver এবং unittest ইমপোট করি।

  • তারপর আমরা একটি python class লিখবো যেটি unittest সুপার ক্লাসকে ইনহেরিটেড করেছে।

  • class এর ভিতর আমরা শুরুতে setup মেথড লিখবো যেটি কিনা test case execute হওয়ার আগে রান হয়। টেস্ট শুরু করার পূর্বে প্রয়োজনীয় কাজ গুলো এই মেথডে লিখবো। আমরা এইখানে chromedriver এর path দেখিয়ে দিয়েছি

  • Class এর শেষে tearDown মেথডে টেস্ট পরবর্তী কাজ গুলো করা হয়। আমাদের ক্ষেত্রে শুধুমাত্র ব্রাউজার ক্লোজ করছি

  • মাঝে আমরা এক বা একাধিক টেস্ট কেস লিখতে পারি। আমরা এখানে একটি মাত্র টেস্ট কেস লিখলাম। ধরি আমরা python.org সাইটে ব্রাউজ করে pycon কিওয়ার্ড লিখে সার্চ করবো যা কিছু সার্চ রেজাল্ট দিবে। টেস্ট মেথডের শুরুতে আমরা www.python.org সাইটে ভিজিট করছি। সাইটের প্রবেশের পর সাইট টাইটেল Python কিনা সেটা assert করে নিচ্ছি।

Screenshot-from-2019-07-29-19-12-11

  • সাইটে প্রবেশ নিশ্চিত করার পর সার্চবক্সে pycon কিওয়ার্ড insert করতে হবে। তবে কিওয়ার্ড insert করার পূর্বে সার্চবক্সটি খুঁজে পেতে হবে। WebDriver দিয়ে আমরা Document Object Model (button, text-field, drop-down ইত্যাদি) খুঁজে পেতে পারি। name, id, xpath, css-selector ব্যবহার করে DOM নির্দেশ করতে পারি। গুগলে ক্রমের Developer মোডে গিয়ে ইলিমেন্ট ট্যাব থেকে আমরা কাঙ্ক্ষিত name, id, xpath,css-selector ইন্সপেক্ট করে বের করতে পারি। অন্যান্য ব্রাউজারেও inspact করার সুবিধা রয়েছে।

    [ক্রোম থেকে কি-বোর্ড শর্টকাট crt+shift+i প্রেস করে কিংবা থ্রি-ডট মেনু থেকে More Tools তারপর Developer Tools ক্লিক করে Developer মুডে যেতে পারি। Developer মুডে থেকে ইলিমেন্ট ট্যাব ক্লিক করলে ওয়েভপেইজ সোর্স দেখতে পাবো। সোর্স কোডে কাঙ্ক্ষিত DOM ইলিমেন্ট পৌছাতে Developer ুডের cursor আইকন ক্লিক করে ইউজার ইন্টারফেসে মাউসের cursor নিয়ে hover করলে DOM ইলিমেন্টির সোর্স কোড হাইলাইট হবে]

  • সার্চবক্সে send_keys মেথড ব্যবহার করে pycon কিওয়ার্ড insert করতে পারি। এইবার আমাদের এন্টার প্রেস করতে হবে। এর জন্যে send_keys এর মধ্যে বিশেষ কোড পাস করে আমরা এন্টার প্রেস করতে পারি। এধরনের বিশেষ কোড https://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.common.keys এই লিংকে পাওয়া যাবে

  • এবং শেষে আমরা পেইজ সোর্সে No results found এই লাইনটি যাতে না থাকে সেটি নিশ্চিত করলাম

টেস্ট রান করা

Screenshot-from-2019-07-29-19-33-23

  • টার্মিনাল থেকে python functional_test.py লিখে এন্টার চাপলেই ব্রাউজার অটোমেটিক ওপেন হয়ে প্রত্যাশিত টেস্ট রান করবে

Test Run

Reference