WorkManager একটি work-testing
আর্টিফ্যাক্ট প্রদান করে যা আপনার কর্মীদের পরীক্ষা করতে সাহায্য করে।
সেটআপ
work-testing
আর্টিফ্যাক্ট ব্যবহার করতে, এটিকে build.gradle
এ একটি androidTestImplementation
নির্ভরতা হিসেবে যোগ করুন।
গ্রোভি
dependencies { def work_version = "2.5.0" ... // optional - Test helpers androidTestImplementation "androidx.work:work-testing:$work_version" }
কোটলিন
dependencies { val work_version = "2.4.0" ... // optional - Test helpers androidTestImplementation("androidx.work:work-testing:$work_version") }
নির্ভরতা যোগ করার বিষয়ে আরও তথ্যের জন্য, ওয়ার্ক ম্যানেজার রিলিজ নোটে ডিক্লেয়ারিং ডিপেনসিস বিভাগটি দেখুন।
ধারণা
work-testing
পরীক্ষার মোডের জন্য WorkManager-এর একটি বিশেষ বাস্তবায়ন প্রদান করে, যা WorkManagerTestInitHelper
ব্যবহার করে শুরু করা হয়।
work-testing
আর্টিফ্যাক্টটি একটি SynchronousExecutor
প্রদান করে যা একাধিক থ্রেড, লক বা ল্যাচের সাথে মোকাবিলা না করেই সিঙ্ক্রোনাস পদ্ধতিতে পরীক্ষা লেখা সহজ করে তোলে।
এই সমস্ত ক্লাস একসাথে কীভাবে ব্যবহার করবেন তার একটি উদাহরণ এখানে।
কোটলিন
@RunWith(AndroidJUnit4::class) class BasicInstrumentationTest { @Before fun setup() { val context = InstrumentationRegistry.getTargetContext() val config = Configuration.Builder() .setMinimumLoggingLevel(Log.DEBUG) .setExecutor(SynchronousExecutor()) .build() // Initialize WorkManager for instrumentation tests. WorkManagerTestInitHelper.initializeTestWorkManager(context, config) } }
জাভা
@RunWith(AndroidJUnit4.class) public class BasicInstrumentationTest { @Before public void setup() { Context context = InstrumentationRegistry.getTargetContext(); Configuration config = new Configuration.Builder() .setMinimumLoggingLevel(Log.DEBUG) .setExecutor(new SynchronousExecutor()) .build(); // Initialize WorkManager for instrumentation tests. WorkManagerTestInitHelper.initializeTestWorkManager( context, config); } }
স্ট্রাকচারিং টেস্ট
এখন যেহেতু WorkManager পরীক্ষা মোডে শুরু করা হয়েছে, আপনি আপনার কর্মীদের পরীক্ষা করার জন্য প্রস্তুত।
ধরা যাক আপনার কাছে একটি EchoWorker
আছে যেটি কিছু inputData
আশা করে এবং সহজভাবে তার ইনপুটকে outputData
কপি করে (প্রতিধ্বনি)।
কোটলিন
class EchoWorker(context: Context, parameters: WorkerParameters) : Worker(context, parameters) { override fun doWork(): Result { return when(inputData.size()) { 0 -> Result.failure() else -> Result.success(inputData) } } }
জাভা
public class EchoWorker extends Worker { public EchoWorker(Context context, WorkerParameters parameters) { super(context, parameters); } @NonNull @Override public Result doWork() { Data input = getInputData(); if (input.size() == 0) { return Result.failure(); } else { return Result.success(input); } } }
মৌলিক পরীক্ষা
নীচে একটি অ্যান্ড্রয়েড ইন্সট্রুমেন্টেশন পরীক্ষা রয়েছে যা EchoWorker
পরীক্ষা করে। এখানে প্রধান সুবিধা হল যে পরীক্ষা মোডে EchoWorker
পরীক্ষা করা আপনি কীভাবে একটি বাস্তব অ্যাপ্লিকেশনে EchoWorker
ব্যবহার করবেন তার সাথে খুব মিল।
কোটলিন
@Test @Throws(Exception::class) fun testSimpleEchoWorker() { // Define input data val input = workDataOf(KEY_1 to 1, KEY_2 to 2) // Create request val request = OneTimeWorkRequestBuilder<EchoWorker>() .setInputData(input) .build() val workManager = WorkManager.getInstance(applicationContext) // Enqueue and wait for result. This also runs the Worker synchronously // because we are using a SynchronousExecutor. workManager.enqueue(request).result.get() // Get WorkInfo and outputData val workInfo = workManager.getWorkInfoById(request.id).get() val outputData = workInfo.outputData // Assert assertThat(workInfo.state, `is`(WorkInfo.State.SUCCEEDED)) assertThat(outputData, `is`(input)) }
জাভা
@Test public void testSimpleEchoWorker() throws Exception { // Define input data Data input = new Data.Builder() .put(KEY_1, 1) .put(KEY_2, 2) .build(); // Create request OneTimeWorkRequest request = new OneTimeWorkRequest.Builder(EchoWorker.class) .setInputData(input) .build(); WorkManager workManager = WorkManager.getInstance(getApplicationContext()); // Enqueue and wait for result. This also runs the Worker synchronously // because we are using a SynchronousExecutor. workManager.enqueue(request).getResult().get(); // Get WorkInfo and outputData WorkInfo workInfo = workManager.getWorkInfoById(request.getId()).get(); Data outputData = workInfo.getOutputData(); // Assert assertThat(workInfo.getState(), is(WorkInfo.State.SUCCEEDED)); assertThat(outputData, is(input)); }
আসুন আরেকটি পরীক্ষা লিখি যা নিশ্চিত করে যে যখন EchoWorker
কোন ইনপুট ডেটা পায় না, প্রত্যাশিত Result
হল Result.failure()
।
কোটলিন
@Test @Throws(Exception::class) fun testEchoWorkerNoInput() { // Create request val request = OneTimeWorkRequestBuilder<EchoWorker>() .build() val workManager = WorkManager.getInstance(applicationContext) // Enqueue and wait for result. This also runs the Worker synchronously // because we are using a SynchronousExecutor. workManager.enqueue(request).result.get() // Get WorkInfo val workInfo = workManager.getWorkInfoById(request.id).get() // Assert assertThat(workInfo.state, `is`(WorkInfo.State.FAILED)) }
জাভা
@Test public void testEchoWorkerNoInput() throws Exception { // Create request OneTimeWorkRequest request = new OneTimeWorkRequest.Builder(EchoWorker.class) .build(); WorkManager workManager = WorkManager.getInstance(getApplicationContext()); // Enqueue and wait for result. This also runs the Worker synchronously // because we are using a SynchronousExecutor. workManager.enqueue(request).getResult().get(); // Get WorkInfo WorkInfo workInfo = workManager.getWorkInfoById(request.getId()).get(); // Assert assertThat(workInfo.getState(), is(WorkInfo.State.FAILED)); }
সীমাবদ্ধতা, বিলম্ব এবং পর্যায়ক্রমিক কাজ অনুকরণ করুন
WorkManagerTestInitHelper
আপনাকে TestDriver
এর একটি উদাহরণ প্রদান করে যা প্রাথমিক বিলম্ব, শর্ত যেখানে ListenableWorker
দৃষ্টান্তগুলির জন্য সীমাবদ্ধতা পূরণ করা হয়, এবং PeriodicWorkRequest
দৃষ্টান্তগুলির জন্য বিরতিগুলি অনুকরণ করতে ব্যবহার করা যেতে পারে৷
পরীক্ষা প্রাথমিক বিলম্ব
শ্রমিকদের প্রাথমিক বিলম্ব হতে পারে। আপনার পরীক্ষায় initialDelay
জন্য অপেক্ষা করার পরিবর্তে EchoWorker
একটি initialDelay
দিয়ে পরীক্ষা করতে, আপনি setInitialDelayMet
ব্যবহার করে কাজের অনুরোধের প্রাথমিক বিলম্বকে মেট হিসাবে চিহ্নিত করতে TestDriver
ব্যবহার করতে পারেন।
কোটলিন
@Test @Throws(Exception::class) fun testWithInitialDelay() { // Define input data val input = workDataOf(KEY_1 to 1, KEY_2 to 2) // Create request val request = OneTimeWorkRequestBuilder<EchoWorker>() .setInputData(input) .setInitialDelay(10, TimeUnit.SECONDS) .build() val workManager = WorkManager.getInstance(getApplicationContext()) // Get the TestDriver val testDriver = WorkManagerTestInitHelper.getTestDriver() // Enqueue workManager.enqueue(request).result.get() // Tells the WorkManager test framework that initial delays are now met. testDriver.setInitialDelayMet(request.id) // Get WorkInfo and outputData val workInfo = workManager.getWorkInfoById(request.id).get() val outputData = workInfo.outputData // Assert assertThat(workInfo.state, `is`(WorkInfo.State.SUCCEEDED)) assertThat(outputData, `is`(input)) }
জাভা
@Test public void testWithInitialDelay() throws Exception { // Define input data Data input = new Data.Builder() .put(KEY_1, 1) .put(KEY_2, 2) .build(); // Create request OneTimeWorkRequest request = new OneTimeWorkRequest.Builder(EchoWorker.class) .setInputData(input) .setInitialDelay(10, TimeUnit.SECONDS) .build(); WorkManager workManager = WorkManager.getInstance(myContext); // Get the TestDriver TestDriver testDriver = WorkManagerTestInitHelper.getTestDriver(); // Enqueue workManager.enqueue(request).getResult().get(); // Tells the WorkManager test framework that initial delays are now met. testDriver.setInitialDelayMet(request.getId()); // Get WorkInfo and outputData WorkInfo workInfo = workManager.getWorkInfoById(request.getId()).get(); Data outputData = workInfo.getOutputData(); // Assert assertThat(workInfo.getState(), is(WorkInfo.State.SUCCEEDED)); assertThat(outputData, is(input)); }
পরীক্ষার সীমাবদ্ধতা
TestDriver
setAllConstraintsMet
ব্যবহার করে পূরণ করা সীমাবদ্ধতা চিহ্নিত করতেও ব্যবহার করা যেতে পারে। আপনি কীভাবে একজন Worker
সীমাবদ্ধতার সাথে পরীক্ষা করতে পারেন তার একটি উদাহরণ এখানে রয়েছে।
কোটলিন
@Test @Throws(Exception::class) fun testWithConstraints() { // Define input data val input = workDataOf(KEY_1 to 1, KEY_2 to 2) val constraints = Constraints.Builder() .setRequiredNetworkType(NetworkType.CONNECTED) .build() // Create request val request = OneTimeWorkRequestBuilder<EchoWorker>() .setInputData(input) .setConstraints(constraints) .build() val workManager = WorkManager.getInstance(myContext) val testDriver = WorkManagerTestInitHelper.getTestDriver() // Enqueue workManager.enqueue(request).result.get() // Tells the testing framework that all constraints are met. testDriver.setAllConstraintsMet(request.id) // Get WorkInfo and outputData val workInfo = workManager.getWorkInfoById(request.id).get() val outputData = workInfo.outputData // Assert assertThat(workInfo.state, `is`(WorkInfo.State.SUCCEEDED)) assertThat(outputData, `is`(input)) }
জাভা
@Test public void testWithConstraints() throws Exception { // Define input data Data input = new Data.Builder() .put(KEY_1, 1) .put(KEY_2, 2) .build(); // Define constraints Constraints constraints = new Constraints.Builder() .setRequiresDeviceIdle(true) .build(); // Create request OneTimeWorkRequest request = new OneTimeWorkRequest.Builder(EchoWorker.class) .setInputData(input) .setConstraints(constraints) .build(); WorkManager workManager = WorkManager.getInstance(myContext); TestDriver testDriver = WorkManagerTestInitHelper.getTestDriver(); // Enqueue workManager.enqueue(request).getResult().get(); // Tells the testing framework that all constraints are met. testDriver.setAllConstraintsMet(request.getId()); // Get WorkInfo and outputData WorkInfo workInfo = workManager.getWorkInfoById(request.getId()).get(); Data outputData = workInfo.getOutputData(); // Assert assertThat(workInfo.getState(), is(WorkInfo.State.SUCCEEDED)); assertThat(outputData, is(input)); }
পর্যায়ক্রমিক কাজ পরীক্ষা করা
TestDriver
একটি setPeriodDelayMet
ও প্রকাশ করে যা একটি ব্যবধান সম্পূর্ণ হয়েছে তা নির্দেশ করতে ব্যবহার করা যেতে পারে। এখানে setPeriodDelayMet
এর একটি উদাহরণ ব্যবহার করা হচ্ছে।
কোটলিন
@Test @Throws(Exception::class) fun testPeriodicWork() { // Define input data val input = workDataOf(KEY_1 to 1, KEY_2 to 2) // Create request val request = PeriodicWorkRequestBuilder<EchoWorker>(15, MINUTES) .setInputData(input) .build() val workManager = WorkManager.getInstance(myContext) val testDriver = WorkManagerTestInitHelper.getTestDriver() // Enqueue and wait for result. workManager.enqueue(request).result.get() // Tells the testing framework the period delay is met testDriver.setPeriodDelayMet(request.id) // Get WorkInfo and outputData val workInfo = workManager.getWorkInfoById(request.id).get() // Assert assertThat(workInfo.state, `is`(WorkInfo.State.ENQUEUED)) }
জাভা
@Test public void testPeriodicWork() throws Exception { // Define input data Data input = new Data.Builder() .put(KEY_1, 1) .put(KEY_2, 2) .build(); // Create request PeriodicWorkRequest request = new PeriodicWorkRequest.Builder(EchoWorker.class, 15, MINUTES) .setInputData(input) .build(); WorkManager workManager = WorkManager.getInstance(myContext); TestDriver testDriver = WorkManagerTestInitHelper.getTestDriver(); // Enqueue and wait for result. workManager.enqueue(request).getResult().get(); // Tells the testing framework the period delay is met testDriver.setPeriodDelayMet(request.getId()); // Get WorkInfo and outputData WorkInfo workInfo = workManager.getWorkInfoById(request.getId()).get(); // Assert assertThat(workInfo.getState(), is(WorkInfo.State.ENQUEUED)); }