"এটা কোন লাভ নেই! আমি ফ্লটারের ইন্টিগ্রেশন টেস্টের সাথে শেষ থেকে শেষ পরীক্ষা চালাতে পারি না", প্রায় 9 মাস আগে আমাদের একজন গ্রাহক বলেছিল। আমি জিজ্ঞাসা করেছি সমস্যাটি কী ছিল এবং তারা ব্যাখ্যা করেছিল যে তারা লগ ইন করার জন্য Google প্রমাণীকরণ ব্যবহার করছে এবং google_sign_in প্যাকেজ ব্যবহার করেছে কিন্তু লগইন স্ক্রিনের সাথে ইন্টারঅ্যাক্ট করার জন্য Flutter এর ইন্টিগ্রেশন পরীক্ষাগুলি ব্যবহার করা সম্ভব ছিল না। আমি এখনও সমস্যাটি কী তা বুঝতে পারিনি এবং তারপরে এটি ক্লিক করেছে: এই প্লাগইনটি নেটিভ UI উপাদানগুলি ব্যবহার করে যা ইন্টিগ্রেশন পরীক্ষাগুলি কাজ করে না।
আমি বেশ হতাশ ছিলাম যে আমি সেই সময়ে একটি সমাধান দিতে পারিনি এবং এটিকে ছেড়ে দিতে হয়েছিল। যাইহোক, আজকে দ্রুত এগিয়ে এবং একটি দুর্দান্ত নতুন সমাধান উপস্থাপন করেছে যার নাম "প্যাট্রল"
ডেভেলপমেন্ট টিমগুলি কন্টিনিউয়াস ইন্টিগ্রেশন (সিআই) পরিষেবাগুলি ব্যবহার করার অন্যতম প্রধান কারণ
চারটি প্রধান পরীক্ষার পদ্ধতি রয়েছে যা আপনার CI কর্মপ্রবাহের অংশ হিসাবে স্বয়ংক্রিয় হতে পারে। পরীক্ষা করা নিজেই একটি বিষয়, তাই আমি এটিকে সংক্ষিপ্ত রাখব, তবে এই পরীক্ষা পদ্ধতিগুলির সংমিশ্রণ ব্যবহার করা আপনাকে আপনার অ্যাপের গুণমান উন্নত করতে এবং সমস্যাগুলিকে পরে না করে তাড়াতাড়ি ধরতে সাহায্য করবে৷
প্রথমত, "ইউনিট টেস্টিং" আছে যা সাধারণত আপনার ফাংশন এবং পদ্ধতিগুলিকে বিচ্ছিন্নভাবে পরীক্ষা করার জন্য ব্যবহার করা হয় যাতে সেগুলি প্রত্যাশিতভাবে কাজ করে। আপনার ব্যবসার লজিক কোনো অপ্রত্যাশিত ফলাফল ছাড়াই বিভিন্ন পরিস্থিতিতে কাজ করে তা নিশ্চিত করতে ইউনিট পরীক্ষাগুলিও লেখা যেতে পারে।
এর পরে, আমাদের কাছে ফ্লটার "উইজেট পরীক্ষা" রয়েছে যা আপনাকে আপনার UI উপাদানগুলি পরীক্ষা করতে দেয় এবং নিশ্চিত করে যে সেগুলি সঠিকভাবে রেন্ডার করে এবং আপনার প্রত্যাশা অনুযায়ী কাজ করে।
তারপরে "ইন্টিগ্রেশন টেস্টিং" রয়েছে যেখানে আপনি পরীক্ষা করেন যে আপনার অ্যাপ্লিকেশনের ইউনিট এবং উপাদানগুলি প্রত্যাশিত হিসাবে একসাথে কাজ করে কিনা।
অবশেষে, "এন্ড-টু-এন্ড UI টেস্টিং" আছে যেখানে আপনি অ্যাপ্লিকেশনটি এমনভাবে পরীক্ষা করেন যেন এটি একজন প্রকৃত ব্যবহারকারী দ্বারা ব্যবহার করা হচ্ছে। একটি CI ওয়ার্কফ্লোতে, এটি সাধারণত সিমুলেটর বা এমুলেটর ব্যবহার করে স্বয়ংক্রিয়ভাবে আপনার অ্যাপের মাধ্যমে বিভিন্ন পথ পরীক্ষা করার জন্য আপনার কোডে পরিবর্তন করার পরে কোনো সমস্যা নেই তা নিশ্চিত করা হয়।
এখানেই আমি শুরুতে যে গ্রাহকের কথা বলছিলাম তারা আটকে গিয়েছিল কারণ তারা তাদের এন্ড-টু-এন্ড UI পরীক্ষা চালাতে পারেনি কারণ অ্যাপটিতে লগ ইন করা সম্ভব ছিল না। সেই সময়ে তারা একটি 'দেব' সংস্করণ পরীক্ষা করেছিল যা লগ-ইন অংশটিকে বাইপাস করেছিল।
যাইহোক, এখন আর প্রয়োজন নেই যে "প্যাট্রোল" উপলব্ধ!
তাই প্রথমত, পেট্রোল কি? ঠিক আছে, আমি মনে করি ডক্স এটি সর্বোত্তম বলে:
Patrol হল LeanCode দ্বারা বিকশিত Flutter-এর জন্য একটি নতুন এবং ওপেন-সোর্স UI পরীক্ষার কাঠামো৷ এটি ফ্লটারের বিদ্যমান টেস্ট টুলিংয়ের উপরে তৈরি করে যা আপনাকে আগে অসম্ভব জিনিসগুলি করতে দেয়। প্যাট্রোল আপনাকে প্ল্যাটফর্মের নেটিভ বৈশিষ্ট্যগুলি অ্যাক্সেস করতে দেয় যেটিতে Flutter অ্যাপ চলছে৷
এখানে সবচেয়ে গুরুত্বপূর্ণ অংশ হল এটি আপনাকে আপনার ফ্লাটার অ্যাপ যে প্ল্যাটফর্মে চলছে তার নেটিভ বৈশিষ্ট্যগুলি অ্যাক্সেস করতে দেয়।
এর মানে হল যে আপনি এখন কিছু করতে পারেন যেমন:
ঠিক আছে, এটা চমৎকার শোনাচ্ছে, কিন্তু ধরা কি?
ওয়েল, একটি নেই! এবং আরও কী, এটি কেবল বিনামূল্যেই নয়
তাছাড়া, প্যাট্রোল 'কাস্টম ফাইন্ডার'-এর সাথে পরিচয় করিয়ে দেয় যা আপনাকে আপনার পরীক্ষা লেখার জন্য আরও সংক্ষিপ্ত বাক্য গঠন দেয়। আপনি তাদের সম্পর্কে আরো পড়তে পারেন
Patrol এর সাথে শুরু করার জন্য আপনাকে CLI ইনস্টল করতে হবে, আপনার pubspec.yaml- এ প্যাট্রোল নির্ভরতা যোগ করতে হবে এবং আপনার iOS এবং Android প্রকল্পগুলিতে কিছু কনফিগারেশন সেট আপ করতে হবে।
LeanCode কিছু দুর্দান্ত ডকুমেন্টেশন তৈরি করেছে
আপনি যদি কোনো সমস্যায় পড়েন, সাহায্য পাওয়ার সর্বোত্তম জায়গা হল প্যাট্রোল কমিউনিটি ডিসকর্ড সার্ভারে যেখানে আপনি যোগ দিতে পারেন
আপনি যদি কোনো বাগ খুঁজে পান, তাহলে আপনি একটি সমস্যা উত্থাপন করতে পারেন
Patrol এর সাথে শুরু করার জন্য আপনাকে CLI ইনস্টল করতে হবে, আপনার pubspec.yaml- এ প্যাট্রোল নির্ভরতা যোগ করতে হবে এবং আপনার iOS এবং Android প্রকল্পগুলিতে কিছু কনফিগারেশন সেট আপ করতে হবে।
LeanCode কিছু দুর্দান্ত ডকুমেন্টেশন তৈরি করেছে
আপনি যদি কোনো সমস্যায় পড়েন, সাহায্য পাওয়ার সর্বোত্তম জায়গা হল প্যাট্রোল কমিউনিটি ডিসকর্ড সার্ভারে যেখানে আপনি যোগ দিতে পারেন
আপনি যদি কোনো বাগ খুঁজে পান, তাহলে আপনি একটি সমস্যা উত্থাপন করতে পারেন
এখন আপনি সব সেট আপ করেছেন, আসুন কিছু নেটিভ বৈশিষ্ট্য পরীক্ষা করা শুরু করি। এটি নিজে চেষ্টা করার জন্য, আমি একটি এলিভেটেড বোতাম সহ একটি সাধারণ ফ্লাটার অ্যাপ সেট আপ করেছি যেটিতে ক্লিক করা হলে একটি নেটিভ অ্যালার্ট ডায়ালগ খোলে৷
"ঠিক আছে" বা "বাতিল" ক্লিক করা ডায়ালগটি খারিজ করে দেয়।
আবার, আমি পেট্রোলের নিজস্ব ডকুমেন্টেশন ব্যবহার করার সুপারিশ করব যা আপনি খুঁজে পেতে পারেন
তাই আমার পরীক্ষার জন্য, আমি "আমাকে ক্লিক করুন!" লেখা আছে উন্নত বোতামে ক্লিক করতে চেয়েছিলাম। এটি একটি স্ট্যান্ডার্ড ফ্লাটার উইজেট তাই এটি নিম্নলিখিত প্যাট্রোল ফাইন্ডার ব্যবহার করে ট্যাপ করা যেতে পারে:
await $('Click me!').tap();
নেটিভ ডায়ালগটি তখন প্রদর্শিত হওয়া উচিত, তাই আমরা এখন একটি নেটিভ UI উপাদানের সাথে ইন্টারঅ্যাক্ট শুরু করতে পারি। সুতরাং আসুন নেটিভ ফাইন্ডার যুক্ত করি যা আমাদের "ঠিক আছে" বোতামটি আলতো চাপতে দেয়:
await $('Click me!').tap(); await $.native.tap(Selector(text: 'OK'));
এটা সহজ ছিলো! আমি "বাতিল" বোতামটিও পরীক্ষা করতে চাই, তাই আসুন "আমাকে ক্লিক করুন!" বোতামটি আবার চাপুন এবং তারপরে নিম্নরূপ আরও কয়েকটি লাইন যোগ করে নেটিভ ডায়ালগের "বাতিল" বোতামে আলতো চাপুন:
await $('Click me!').tap(); await $.native.tap(Selector(text: 'OK')); await $('Click me!').tap(); await $.native.tap(Selector(text: 'Cancel'));
আপনার সম্পূর্ণ পরীক্ষা ফাইল এই মত দেখতে হবে:
import 'package:cmpatrol/main.dart'; import 'package:patrol/patrol.dart'; void main() { patrolTest( 'Native tests', nativeAutomation: true, ($) async { await $.pumpWidgetAndSettle(const MyApp()); await $('Click me!').tap(); await $.native.tap(Selector(text: 'OK')); await $('Click me!').tap(); await $.native.tap(Selector(text: 'Cancel')); await $('Click me!').tap(); await $.native.tap(Selector(text: 'NO')); }, ); }
আপনি এখন পরীক্ষাটি চালু করতে কমান্ড ব্যবহার করে আপনার এমুলেটর বা একটি বাস্তব ডিভাইসে সেই পরীক্ষাটি চালাতে সক্ষম হবেন। আমার ইন্টিগ্রেশন টেস্ট ফাইলটিকে "button_test" বলা হয়েছিল তাই আমি টার্মিনাল থেকে নিম্নরূপ পরীক্ষা শুরু করেছি:
patrol test -t integration_test/button_test.dart
আপনি সরাসরি টার্মিনালে আপনার পরীক্ষা পাস বা ব্যর্থ হয়েছে কিনা তা দেখতে পাবেন। পরীক্ষায় ব্যর্থ হলে আপনি সম্পূর্ণ পরীক্ষার রিপোর্টের একটি লিঙ্ক পাবেন। বিকল্পভাবে, আপনি যদি আমার মতো অ্যান্ড্রয়েডে আপনার পরীক্ষা চালাচ্ছেন, তাহলে নিম্নলিখিত ডিরেক্টরির index.html- এ ক্লিক করে আপনি রিপোর্টটি অ্যাক্সেস করতে পারেন:
./build/app/reports/androidTest/connected
আপনি অন্যান্য নেটিভ বৈশিষ্ট্যগুলির সাথে আরও পরীক্ষা করতে পারেন যেমন নোটিফিকেশন ট্রে খোলা, ওয়াইফাই অক্ষম করা, ডার্ক মোড সক্ষম করা, অ্যাপটিকে ছোট করা এবং সর্বাধিক করা:
// minimize app await $.native.pressHome(); await $.native.openNotifications(); await $.native.disableWifi(); await $.native.enableDarkMode(); // maximize app await $.native.openApp();
⚠️ মনে রাখবেন যে আপনার অ্যাপটি সম্পূর্ণভাবে বন্ধ করা এবং তারপরে এটি পুনরায় খোলা সম্ভব নয় কারণ এটি করলে পুরো পরীক্ষাটি শেষ হয়ে যাবে এবং তাই এটি ব্যর্থ হবে।
টহল পরামর্শ
আপনার ওয়ার্কফ্লোতে পেট্রোল অন্তর্ভুক্ত করতে, আপনাকে প্রথমে বিল্ড মেশিনে প্যাট্রোল CLI ইনস্টল করতে হবে। এটি মাত্র কয়েক সেকেন্ড সময় নেয় এবং এটি হয়ে গেলে, আপনি আপনার পরীক্ষার স্ক্রিপ্ট চালাতে পারেন। আপনার codemagic.yaml কনফিগারেশন ফাইলের "স্ক্রিপ্ট" বিভাগে আপনি কীভাবে এই পদক্ষেপগুলি যোগ করবেন তার একটি উদাহরণ নীচে দেওয়া হল। আমি প্রথম স্ক্রিপ্ট পদক্ষেপগুলির মধ্যে একটি হিসাবে Patrol CLI ইনস্টল করার জন্য স্ক্রিপ্টটি চালানোর সুপারিশ করব এবং তারপরে আপনি আপনার প্যাট্রোল পরীক্ষাগুলি তার পরপরই চালাতে পারেন বা অন্য কোনও পরীক্ষার পরেও আপনি আগে চালাতে চাইতে পারেন।
আপনার প্যাট্রোল পরীক্ষা চালানোর আগে আপনাকে এমুলেটর চালু করতে হবে তাই আমরা এমুলেটর চালু করার জন্য একটি স্ক্রিপ্ট যোগ করব এবং এটি সম্পূর্ণরূপে বুট হওয়ার জন্য অপেক্ষা করব। মনে রাখবেন যে অ্যাপল ভার্চুয়ালাইজেশন ফ্রেমওয়ার্ক নেস্টেড ভার্চুয়ালাইজেশন সমর্থন না করার কারণে অ্যাপল সিলিকন M1 বা M2 মেশিন ব্যবহার করে অ্যান্ড্রয়েড এমুলেটরগুলি উপলব্ধ নয়। অতএব, আমি অ্যান্ড্রয়েড অ্যাপ্লিকেশনগুলি পরীক্ষা করার সময় একটি লিনাক্স উদাহরণ ব্যবহার করার পরামর্শ দেব।
আপনার codemagic.yaml এর স্ক্রিপ্ট বিভাগটি এইরকম দেখতে হবে:
scripts: ... - name: Install Patrol CLI script: dart pub global activate patrol_cli - name: Launch Android emulator script: | cd $ANDROID_HOME/tools emulator -avd emulator & adb wait-for-device - name: Run tests with Patrol script: patrol test -t integration_test/your_test.dart ignore_failure: true ...
প্যাট্রোল পরীক্ষার ফলাফলগুলি JUnit XML ফর্ম্যাটেও পাওয়া যায়, যার মানে সেগুলি Codemagic বিল্ড ওভারভিউ স্ক্রিনে বিল্ড লগগুলিতে প্রদর্শিত হতে পারে৷ আপনাকে জেনারেট করা JUnit XML ফাইলের পাথে test_report সম্পত্তি পাস যোগ করতে হবে। আপনি বাকী ওয়ার্কফ্লো চলতে চান কিনা তা নিয়ন্ত্রণ করতে আপনি একটি বুলিয়ান সহ ignore_failure সম্পত্তি ব্যবহার করতে পারেন। আপনি যদি পরবর্তী বিভাগে বর্ণিত একটি পরীক্ষা ব্যবস্থাপনা সিস্টেমে আপনার ফলাফল আপলোড করতে চান, তাহলে আপনার এটি সত্যে সেট করা উচিত।
আপনার স্ক্রিপ্ট কেমন হওয়া উচিত তার একটি উদাহরণ এখানে দেওয়া হল:
scripts: ... - name: Run tests with Patrol script: | patrol test -t integration_test/your_test.dart test_report: build/app/outputs/androidTest-results/connected/*.xml ignore_failure: true ...
একটি ব্যর্থ পরীক্ষা এই মত কিছু দেখতে পারে:
একটি অতিরিক্ত জিনিস যা আপনি করতে চাইতে পারেন তা হল একটি বিল্ড আর্টিফ্যাক্ট হিসাবে পরীক্ষার রিপোর্ট আউটপুট সংগ্রহ করা যাতে কোনো ত্রুটি ঘটলে আপনি সম্পূর্ণ প্রতিবেদনটি দেখতে পারেন। এটি করার ফলে বাম দিকের "আর্টিফ্যাক্টস" বিভাগে বিল্ড ওভারভিউ স্ক্রিনে একটি জিপ ফাইল হিসাবে প্রতিবেদনটি ডাউনলোডের জন্য উপলব্ধ হবে৷ এটি করার সবচেয়ে সহজ উপায় হল কোডেম্যাজিক আর্টিফ্যাক্টগুলি রপ্তানি করতে যে ডিরেক্টরিটি ব্যবহার করে রিপোর্ট ফাইলগুলিতে রয়েছে সেটিকে কপি করা। $CM_EXPORT_DIR নামে একটি বিল্ট-ইন এনভায়রনমেন্ট ভেরিয়েবল রয়েছে যা এই ডিরেক্টরিটিকে উল্লেখ করে যা আপনি আপনার স্ক্রিপ্টে ব্যবহার করতে পারেন।
এটি করার জন্য স্ক্রিপ্ট এই মত হওয়া উচিত:
scripts: ... - name: Export Patrol test report script: | cp -r build/app/reports/androidTests/connected $CM_EXPORT_DIR/report ...
প্যাট্রোল অবশেষে UI এবং ইন্টিগ্রেশন পরীক্ষা চালানোর সমস্যাকে কাটিয়ে উঠেছে যা নেটিভ বৈশিষ্ট্যগুলি জড়িত। এটি এখন স্থানীয় বৈশিষ্ট্যগুলি পরীক্ষা করা এবং প্রমাণীকরণ প্রবাহ, নেটিভ ডায়ালগগুলির সাথে ইন্টারঅ্যাক্ট করা এবং এমনকি ওয়াইফাই, সেলুলার, ডার্ক মোডের মতো নেটিভ বৈশিষ্ট্যগুলিকে টগল করা এবং এমনকি আপনার অ্যাপকে ছোট করা এবং এটিকে সর্বাধিক করা সম্ভব৷ উপরন্তু, এটি বিনামূল্যে এবং ওপেন সোর্স উভয়ই এবং Flutter চালু হওয়ার পর থেকে একটি বাস্তব সমস্যার সমাধান প্রদান করে। আরও কী, আপনার কোডম্যাজিক ওয়ার্কফ্লোতে এটি যোগ করা এবং ব্যবহার করা সহজ। LeanCode যে দুর্দান্ত কাজটি করছে আপনি যদি সমর্থন করতে চান, তাহলে pub.dev-এ Patrol একটি লাইক দিন
এই নিবন্ধটি কেভিন সুহাজদা লিখেছেন, সমাধান প্রকৌশলের প্রধান
এছাড়াও এখানে প্রকাশিত.