WorkManager Worker,
ListenableWorker এবং
ListenableWorker ভেরিয়েন্ট
(CoroutineWorker
এবং RxWorker)
টেস্ট করার জন্য API প্রদান করে।
টেস্টিং ওয়ার্কার
ধরা যাক, আমাদের কাছে একটি Worker আছে যা দেখতে এইরকম:
class SleepWorker(context: Context, parameters: WorkerParameters) : Worker(context, parameters) { override fun doWork(): Result { // Sleep on a background thread. Thread.sleep(1000) return Result.success() } }
এই Worker পরীক্ষা করতে, আপনি
TestWorkerBuilder ব্যবহার করতে পারেন। এই
বিল্ডার Worker-এর ইনস্ট্যান্স তৈরি করতে সাহায্য করে যা বিজনেস লজিক টেস্ট করার উদ্দেশ্যে
ব্যবহার করা যেতে পারে।
// Kotlin code uses the TestWorkerBuilder extension to build // the Worker @RunWith(AndroidJUnit4::class) class SleepWorkerTest { private lateinit var context: Context private lateinit var executor: Executor @Before fun setUp() { context = ApplicationProvider.getApplicationContext() executor = Executors.newSingleThreadExecutor() } @Test fun testSleepWorker() { val worker = TestWorkerBuilder<SleepWorker>( context = context, executor = executor ).build() val result = worker.doWork() assertThat(result, `is`(Result.success())) } }
এছাড়াও, TestWorkerBuilder ব্যবহার করে inputData বা
runAttemptCount-এর মতো ট্যাগ সেট করা যায়, যাতে আপনি আলাদাভাবে ওয়ার্কার স্টেট যাচাই করতে পারেন। এমন একটি
উদাহরণ বিবেচনা করুন যেখানে SleepWorker ইনপুট ডেটা হিসেবে ঘুমের সময়কাল নেয়,
যা ওয়ার্কারে নির্দিষ্ট করা কোনও ধ্রুবক নয়:
class SleepWorker(context: Context, parameters: WorkerParameters) : Worker(context, parameters) { override fun doWork(): Result { // Sleep on a background thread. val sleepDuration = inputData.getLong(SLEEP_DURATION, 1000) Thread.sleep(sleepDuration) return Result.success() } companion object { const val SLEEP_DURATION = "SLEEP_DURATION" } }
SleepWorkerTest-এ, আপনি SleepWorker-এর চাহিদা পূরণ করতে আপনার
TestWorkerBuilder-কে সেই ইনপুট ডেটা প্রদান করতে পারেন।
// Kotlin code uses the TestWorkerBuilder extension to build // the Worker @RunWith(AndroidJUnit4::class) class SleepWorkerTest { private lateinit var context: Context private lateinit var executor: Executor @Before fun setUp() { context = ApplicationProvider.getApplicationContext() executor = Executors.newSingleThreadExecutor() } @Test fun testSleepWorker() { val worker = TestWorkerBuilder<SleepWorker>( context = context, executor = executor, inputData = workDataOf("SLEEP_DURATION" to 1000L) ).build() val result = worker.doWork() assertThat(result, `is`(Result.success())) } }
TestWorkerBuilder API সম্পর্কে আরও জানতে, TestListenableWorkerBuilder-এর রেফারেন্স পৃষ্ঠা দেখুন,
যা TestWorkerBuilder-এর সুপারক্লাস।
ListenableWorker ও তার প্রকারভেদ টেস্ট করা
ListenableWorker বা এর
ভেরিয়েন্ট (CoroutineWorker
এবং RxWorker) পরীক্ষা করতে,
TestListenableWorkerBuilder ব্যবহার করুন।
TestWorkerBuilder এবং
TestListenableWorkerBuilder-এর মধ্যে প্রধান পার্থক্য হল,
Worker চালানোর জন্য ব্যবহৃত ব্যাকগ্রাউন্ড Executor নির্দিষ্ট করার সুবিধা TestWorkerBuilder আপনাকে দেয়, যেখানে TestListenableWorkerBuilder,
ListenableWorker ইমপ্লিমেন্টেশনের থ্রেডিং লজিকের উপর নির্ভর করে।
যেমন, ধরুন আমাদের একটি CoroutineWorker পরীক্ষা করতে হবে যা দেখতে এইরকম:
class SleepWorker(context: Context, parameters: WorkerParameters) : CoroutineWorker(context, parameters) { override suspend fun doWork(): Result { delay(1000L) // milliseconds return Result.success() } }
SleepWorker টেস্ট করতে, আমরা প্রথমে TestListenableWorkerBuilder ব্যবহার করে
Worker-এর একটি ইনস্ট্যান্স তৈরি করি এবং তারপরে একটি
কোরুটিনের মধ্যে এর doWork ফাংশন কল করি।
@RunWith(AndroidJUnit4::class) class SleepWorkerTest { private lateinit var context: Context @Before fun setUp() { context = ApplicationProvider.getApplicationContext() } @Test fun testSleepWorker() { val worker = TestListenableWorkerBuilder<SleepWorker>(context).build() runBlocking { val result = worker.doWork() assertThat(result, `is`(Result.success())) } } }
আপনার টেস্টের জন্য কোরুটিন বিল্ডার হিসেবে runBlocking ব্যবহার করা যুক্তিযুক্ত, যাতে অ্যাসিঙ্ক্রোনাসভাবে এক্সিকিউট হওয়া
যেকোনও কোড সমান্তরালভাবে রান করে।
RxWorker প্রয়োগ পরীক্ষা করা CoroutineWorker পরীক্ষা করার মতোই, কারণ
TestListenableWorkerBuilder, ListenableWorker-এর যেকোনও সাবক্লাস ম্যানেজ করতে পারে।
SleepWorker-এর এমন একটি ভার্সন বিবেচনা করুন যা কোরুটিনের পরিবর্তে RxJava ব্যবহার করে।
class SleepWorker( context: Context, parameters: WorkerParameters ) : RxWorker(context, parameters) { override fun createWork(): Single<Result> { return Single.just(Result.success()) .delay(1000L, TimeUnit.MILLISECONDS) } }
SleepWorkerTest-এর একটি ভার্সন যা RxWorker-কে পরীক্ষা করে, সেটি CoroutineWorker-কে পরীক্ষা করা ভার্সনের মতো দেখতে হতে পারে। আপনি একই
TestListenableWorkerBuilder ব্যবহার করেন কিন্তু এখন RxWorker-এর createWork
ফাংশনে কল করেন। createWork একটি Single রিটার্ন করে যা আপনি আপনার কর্মীর আচরণ যাচাই করতে ব্যবহার করতে পারেন। TestListenableWorkerBuilder থ্রেডিং সংক্রান্ত যেকোনও জটিলতা
ম্যানেজ করে এবং আপনার ওয়ার্কার কোড সমান্তরালভাবে এক্সিকিউট করে।
@RunWith(AndroidJUnit4::class) class SleepWorkerTest { private lateinit var context: Context @Before fun setUp() { context = ApplicationProvider.getApplicationContext() } @Test fun testSleepWorker() { val worker = TestListenableWorkerBuilder<SleepWorker>(context).build() worker.createWork().subscribe { result -> assertThat(result, `is`(Result.success())) } } }