কীভাবে করবেন

কম্পোজ টেস্টে রিসোর্স নিষ্ক্রিয় রাখার বিকল্প: waitUntil এপিআই (হালনাগাদকৃত)

৩ মিনিটের পাঠ
Jose Alcérreca
ডেভেলপার সম্পর্ক প্রকৌশলী

এই আর্টিকেলে আপনি শিখবেন, নির্দিষ্ট কিছু শর্ত পূরণ হওয়া পর্যন্ত অপেক্ষা করার জন্য Compose-এ কীভাবে waitUntil test API ব্যবহার করতে হয়। কিছু পরিস্থিতিতে Idling Resources ব্যবহারের এটি একটি ভালো বিকল্প।

[২০২৩ আপডেট] সারসংক্ষেপ: Compose টেস্টে সিঙ্ক্রোনাইজ করার জন্য নতুন waitUntil API ব্যবহার করুন (v1.4.0+)।


সিঙ্ক্রোনাইজেশন কী?

টেস্টগুলোকে শ্রেণীবদ্ধ করার একটি উপায় হলো সেগুলোর পরিধি। ছোট টেস্ট, বা ইউনিট টেস্ট, আপনার অ্যাপের ছোট ছোট অংশের উপর মনোযোগ দেয়, অন্যদিকে বড় টেস্ট, বা এন্ড-টু-এন্ড টেস্ট, আপনার অ্যাপের একটি বড় অংশকে অন্তর্ভুক্ত করে। আপনি নতুনভাবে আপডেট করা টেস্টিং ডকুমেন্টেশনে এই এবং অন্যান্য ধরণের টেস্ট সম্পর্কে পড়তে পারেন।

সম্পূর্ণ আকারে ছবিটি দেখতে এন্টার চাপুন বা ক্লিক করুন।

large_0_9n_Nqkt_HHUTOQ_In_AI_b113b43bcf.png
একটি অ্যাপে বিভিন্ন পরীক্ষার পরিধি

সিনক্রোনাইজেশন হলো সেই প্রক্রিয়া যা টেস্টকে জানিয়ে দেয় কখন পরবর্তী অপারেশনটি চালাতে হবে। আপনি যাচাই করার জন্য যত বড় কোড বেছে নেবেন, টেস্টের সাথে সিনক্রোনাইজ করা তত কঠিন হয়ে পড়বে। ইউনিট টেস্টে, যাচাই করার জন্য কোডের এক্সিকিউশনের উপর সম্পূর্ণ নিয়ন্ত্রণ রাখা সহজ। কিন্তু, যখন আমরা আরও ক্লাস, মডিউল এবং লেয়ার অন্তর্ভুক্ত করে এর পরিধি বাড়াই, তখন অ্যাপটি কোনো অপারেশনের মাঝখানে আছে কি না, তা টেস্ট ফ্রেমওয়ার্কের পক্ষে বোঝা বেশ জটিল হয়ে পড়ে।

সম্পূর্ণ আকারে ছবিটি দেখতে এন্টার চাপুন বা ক্লিক করুন।

large_correct_b1a355f41b.webp
টেস্ট এবং অ্যাপের মধ্যে সঠিক সিঙ্ক্রোনাইজেশন

androidx.test এবং এর ফলস্বরূপ Compose Test , অভ্যন্তরীণভাবে কিছু কৌশল ব্যবহার করে, যাতে আপনাকে এই বিষয়ে খুব বেশি চিন্তা করতে না হয়। উদাহরণস্বরূপ, যদি প্রধান থ্রেড ব্যস্ত থাকে, তাহলে পরবর্তী লাইনটি কার্যকর করার আগ পর্যন্ত পরীক্ষাটি থেমে থাকে।

তবে, তারা সবকিছু জানতে পারে না। উদাহরণস্বরূপ, আপনি যদি একটি ব্যাকগ্রাউন্ড থ্রেডে ডেটা লোড করেন, তাহলে টেস্ট ফ্রেমওয়ার্কটি খুব তাড়াতাড়ি পরবর্তী অপারেশনটি সম্পাদন করতে পারে, যার ফলে আপনার টেস্টটি ব্যর্থ হয়ে যাবে। সবচেয়ে খারাপ পরিস্থিতি হলো যখন এটি খুব অল্প শতাংশ ক্ষেত্রে ঘটে, যা টেস্টটিকে ফ্ল্যাকি করে তোলে।

বিকল্প ১: নিষ্ক্রিয় সম্পদ

আইডলিং রিসোর্স হলো এসপ্রেসোর একটি ফিচার, যা আপনাকে, অর্থাৎ ডেভেলপারকে, অ্যাপটি কখন ব্যস্ত থাকবে তা নির্ধারণ করার সুযোগ দেয়। এটি ব্যবহার করার দুটি উপায় রয়েছে:

১. সেগুলোকে এমন ফ্রেমওয়ার্ক বা লাইব্রেরিতে ইনস্টল করা, যা এমন কাজ করে যা টেস্ট দেখতে পায় না।

এর একটি ভালো উদাহরণ হলো RxIdler , যা একটি RxJava শিডিউলারকে র‍্যাপ করে। আইডলিং রিসোর্স রেজিস্টার করার জন্য এটিই সবচেয়ে পছন্দের উপায়, কারণ এটি আপনাকে আপনার টেস্ট সেটআপকে টেস্ট কোড থেকে পরিচ্ছন্নভাবে আলাদা রাখতে সাহায্য করে।

২. আপনার অ্যাপটি ব্যস্ত আছে কি না, সেই তথ্য স্পষ্টভাবে প্রকাশ করার জন্য পরীক্ষাধীন কোডটি পরিবর্তন করা।

উদাহরণস্বরূপ, কোনো ডেটা সোর্স থেকে ডেটা লোড করার সময় এটি ব্যস্ত আছে তা বোঝানোর জন্য আপনি আপনার রিপোজিটরি (বা একটি টেস্ট ডাবল ) পরিবর্তন করতে পারেন:

এটি আদর্শ নয়, কারণ আপনি আপনার প্রোডাকশন কোড দূষিত করছেন, অথবা জটিল টেস্ট ডাবল তৈরি করছেন, এবং কিছু পরিস্থিতিতে এগুলো ইনস্টল করা কঠিন। উদাহরণস্বরূপ, আপনি একটি কোটলিন ফ্লো-তে আইডলিং রিসোর্স কীভাবে ব্যবহার করবেন? কোন আপডেটটি চূড়ান্ত ?

এর পরিবর্তে, আমরা বিভিন্ন জিনিসের জন্য অপেক্ষা করতে পারি।

বিকল্প ২: ভুলভাবে কোনো কিছুর জন্য অপেক্ষা করা...

ডেটা লোড করা সাধারণত দ্রুত হয়, বিশেষ করে যখন নকল ডেটা ব্যবহার করা হয়, তাই যখন আপনি পরীক্ষাটিকে মাত্র কয়েক সেকেন্ডের জন্য রেখে দিতে পারেন, তখন অলস রিসোর্স দিয়ে সময় নষ্ট করবেন কেন?

এই টেস্টটি হয় প্রয়োজনের চেয়ে ধীরগতিতে চলবে অথবা ব্যর্থ হবে । যখন আপনার শত শত বা হাজার হাজার UI টেস্ট থাকে, তখন আপনি চাইবেন টেস্টগুলো যেন যতটা সম্ভব দ্রুত হয়।

এছাড়াও, কখনও কখনও এমুলেটর বা ডিভাইসগুলো ঠিকমতো কাজ করে না এবং আটকে যায়, যার ফলে ওই অপারেশনটি সম্পন্ন হতে ২০০০ মিলিসেকেন্ডের চেয়ে কিছুটা বেশি সময় লাগে এবং আপনার বিল্ডটি ভেঙে যায়। যখন আপনার শত শত টেস্ট থাকে, তখন এটি একটি বিশাল সমস্যা হয়ে দাঁড়ায়।

0_DOCdjq-JpPDGV5OB.png

বিকল্প ৩: সবকিছু ঠিকঠাক হওয়ার জন্য অপেক্ষা করা!

আপনার পরীক্ষাধীন কোডটি কখন ব্যস্ত আছে তা প্রকাশ করার জন্য যদি আপনি এটি পরিবর্তন করতে না চান, তবে যথেচ্ছভাবে কিছুক্ষণ অপেক্ষা করার পরিবর্তে একটি নির্দিষ্ট শর্ত পূরণ হওয়া পর্যন্ত অপেক্ষা করা আরেকটি বিকল্প।

1_jIYFxE4qlHXMi2SwW6JemA.png

Compose-এ, আপনি waitUntil ফাংশনটি ব্যবহার করতে পারেন, যা এমন একটি ফাংশন গ্রহণ করে যা একটি বুলিয়ান মান তৈরি করে।

২০২৩/০৩/২২ আপডেট: Compose 1.4.0 থেকে, আমরা এক নতুন সেট waitUntil API যোগ করেছি:

[১.৪.০ সংস্করণের আগে: এই হেল্পারগুলো ব্যবহার করুন: waitUntilExists , waitUntilNodeCount ]

…এবং এগুলো এভাবে ব্যবহার করুন:

এই API-গুলো শুধুমাত্র তখনই ব্যবহার করুন যখন আপনার টেস্টকে UI-এর সাথে সিঙ্ক্রোনাইজ করার প্রয়োজন হয়। প্রতিটি টেস্ট স্টেটমেন্টে সিঙ্ক্রোনাইজ করলে তা টেস্ট কোডকে অপ্রয়োজনীয়ভাবে দূষিত করে, ফলে এর রক্ষণাবেক্ষণ আরও কঠিন হয়ে পড়ে।

তাহলে এটি কখন ব্যবহার করা উচিত? এর একটি ভালো ব্যবহার হলো কোনো অবজার্ভেবল (observable) থেকে ডেটা লোড করা (LiveData, Kotlin Flow বা RxJava ব্যবহার করে)। যখন আপনার UI-কে নিষ্ক্রিয় (idle) হিসেবে বিবেচনা করার আগে একাধিক আপডেট গ্রহণ করার প্রয়োজন হয়, তখন আপনি waitUntil ব্যবহার করে সিনক্রোনাইজেশন সহজ করতে চাইতে পারেন।

উদাহরণস্বরূপ, যখন আপনি একটি ভিউ থেকে একটি ফ্লো সংগ্রহ করেন:

এবং আপনি এতে একাধিক আইটেম প্রেরণ করেন:

যদি repository প্রথম ফলাফলটি ফেরত দিতে অনির্দিষ্ট পরিমাণ সময় নেয়, তাহলে টেস্ট ফ্রেমওয়ার্ক “Loading”-কে নিষ্ক্রিয় অবস্থা ( collectAsState এ নির্ধারিত প্রাথমিক মান) হিসেবে ধরে নেবে এবং পরবর্তী স্টেটমেন্ট নিয়ে এগিয়ে যাবে।

সুতরাং, আপনি যদি নিশ্চিত করেন যে UI-তে লোডিং ইন্ডিকেটর দেখানো হচ্ছে না, তাহলে পরীক্ষাটিকে আরও অনেক বেশি নির্ভরযোগ্য করে তুলতে পারবেন:


শুভ… অপেক্ষা করুন… পরীক্ষা!


কোড স্নিপেটের লাইসেন্স:

Copyright 2022 Google LLC.
SPDX-License-Identifier: Apache-2.0
লিখেছেন:

পড়তে থাকুন