আপনার পরীক্ষাগুলি সিঙ্ক্রোনাইজ করুন

রচনা পরীক্ষাগুলি আপনার UI এর সাথে ডিফল্টরূপে সিঙ্ক্রোনাইজ করা হয়। আপনি যখন ComposeTestRule এর সাথে একটি দাবী বা একটি ক্রিয়া কল করেন, তখন পরীক্ষাটি আগেই সিঙ্ক্রোনাইজ করা হয়, UI ট্রি নিষ্ক্রিয় না হওয়া পর্যন্ত অপেক্ষা করা হয়।

সাধারণত, আপনাকে কোনো পদক্ষেপ নিতে হবে না। যাইহোক, এমন কিছু এজ কেস আছে যা আপনার জানা উচিত।

যখন একটি পরীক্ষা সিঙ্ক্রোনাইজ করা হয়, আপনার রচনা অ্যাপটি একটি ভার্চুয়াল ঘড়ি ব্যবহার করে সময়মতো উন্নত হয়৷ এর অর্থ কম্পোজ পরীক্ষাগুলি রিয়েল টাইমে চলে না, তাই তারা যত দ্রুত সম্ভব পাস করতে পারে।

যাইহোক, যদি আপনি এমন পদ্ধতিগুলি ব্যবহার না করেন যা আপনার পরীক্ষাগুলিকে সিঙ্ক্রোনাইজ করে, কোন পুনর্গঠন ঘটবে না এবং UI বিরাম দেওয়া হয়েছে বলে মনে হবে।

@Test
fun counterTest() {
    val myCounter = mutableStateOf(0) // State that can cause recompositions.
    var lastSeenValue = 0 // Used to track recompositions.
    composeTestRule.setContent {
        Text(myCounter.value.toString())
        lastSeenValue = myCounter.value
    }
    myCounter.value = 1 // The state changes, but there is no recomposition.

    // Fails because nothing triggered a recomposition.
    assertTrue(lastSeenValue == 1)

    // Passes because the assertion triggers recomposition.
    composeTestRule.onNodeWithText("1").assertExists()
}

মনে রাখবেন যে এই প্রয়োজনীয়তাটি শুধুমাত্র রচনা অনুক্রমের ক্ষেত্রে প্রযোজ্য এবং বাকি অ্যাপের ক্ষেত্রে নয়।

স্বয়ংক্রিয় সিঙ্ক্রোনাইজেশন অক্ষম করুন

আপনি যখন assertExists() এর মতো ComposeTestRule মাধ্যমে একটি দাবী বা ক্রিয়া কল করেন, তখন আপনার পরীক্ষাটি রচনা UI এর সাথে সিঙ্ক্রোনাইজ করা হয়। কিছু ক্ষেত্রে আপনি এই সিঙ্ক্রোনাইজেশন বন্ধ করতে এবং ঘড়িটি নিজেই নিয়ন্ত্রণ করতে চাইতে পারেন। উদাহরণস্বরূপ, আপনি একটি বিন্দুতে একটি অ্যানিমেশনের সঠিক স্ক্রিনশট নেওয়ার জন্য সময় নিয়ন্ত্রণ করতে পারেন যেখানে UI এখনও ব্যস্ত থাকবে। স্বয়ংক্রিয় সিঙ্ক্রোনাইজেশন অক্ষম করতে, mainClockautoAdvance বৈশিষ্ট্যটি false সেট করুন:

composeTestRule.mainClock.autoAdvance = false

সাধারণত আপনি নিজেই সময় এগিয়ে নেবেন। advanceTimeByFrame() দিয়ে বা advanceTimeBy() দিয়ে একটি নির্দিষ্ট সময়ের মধ্যে আপনি ঠিক একটি ফ্রেম এগিয়ে নিতে পারেন:

composeTestRule.mainClock.advanceTimeByFrame()
composeTestRule.mainClock.advanceTimeBy(milliseconds)

অলস সম্পদ

কম্পোজ পরীক্ষা এবং UI সিঙ্ক্রোনাইজ করতে পারে যাতে প্রতিটি ক্রিয়া এবং দাবী একটি নিষ্ক্রিয় অবস্থায় সম্পন্ন হয়, প্রয়োজন অনুসারে ঘড়ির কাঁটা অপেক্ষা করে বা অগ্রসর হয়। যাইহোক, কিছু অ্যাসিঙ্ক্রোনাস ক্রিয়াকলাপ যার ফলাফলগুলি UI অবস্থাকে প্রভাবিত করে সেগুলি ব্যাকগ্রাউন্ডে চালানো যেতে পারে যখন পরীক্ষাটি সেগুলি সম্পর্কে অজানা থাকে৷

আপনার পরীক্ষায় এই অলস সংস্থানগুলি তৈরি করুন এবং নিবন্ধন করুন যাতে পরীক্ষার অধীনে অ্যাপটি ব্যস্ত বা নিষ্ক্রিয় কিনা তা সিদ্ধান্ত নেওয়ার সময় সেগুলি বিবেচনায় নেওয়া হয়। অতিরিক্ত নিষ্ক্রিয় সংস্থান নিবন্ধন না করা পর্যন্ত আপনাকে পদক্ষেপ নিতে হবে না, উদাহরণস্বরূপ, আপনি যদি এমন একটি ব্যাকগ্রাউন্ড কাজ চালান যা Espresso বা রচনার সাথে সিঙ্ক্রোনাইজ করা হয় না।

পরীক্ষার অধীন বিষয় নিষ্ক্রিয় বা ব্যস্ত কিনা তা নির্দেশ করার জন্য এই APIটি Espresso-এর Idling Resources- এর অনুরূপ। IdlingResource এর বাস্তবায়ন নিবন্ধন করতে কম্পোজ পরীক্ষার নিয়ম ব্যবহার করুন।

composeTestRule.registerIdlingResource(idlingResource)
composeTestRule.unregisterIdlingResource(idlingResource)

ম্যানুয়াল সিঙ্ক্রোনাইজেশন

কিছু ক্ষেত্রে, আপনাকে আপনার পরীক্ষার অন্যান্য অংশ বা আপনি যে অ্যাপটি পরীক্ষা করছেন তার সাথে কম্পোজ UI সিঙ্ক্রোনাইজ করতে হবে।

waitForIdle() ফাংশন রচনাটি নিষ্ক্রিয় হওয়ার জন্য অপেক্ষা করে, কিন্তু ফাংশনটি autoAdvance বৈশিষ্ট্যের উপর নির্ভর করে:

composeTestRule.mainClock.autoAdvance = true // Default
composeTestRule.waitForIdle() // Advances the clock until Compose is idle.

composeTestRule.mainClock.autoAdvance = false
composeTestRule.waitForIdle() // Only waits for idling resources to become idle.

মনে রাখবেন যে উভয় ক্ষেত্রেই, waitForIdle() মুলতুবি ড্র এবং লেআউট পাসের জন্যও অপেক্ষা করে।

এছাড়াও, একটি নির্দিষ্ট শর্ত অগ্রসর না হওয়া পর্যন্ত আপনি ঘড়ি অগ্রসর করতে পারেন advanceTimeUntil()

composeTestRule.mainClock.advanceTimeUntil(timeoutMs) { condition }

উল্লেখ্য যে প্রদত্ত শর্তটি এই ঘড়ি দ্বারা প্রভাবিত হতে পারে এমন অবস্থা পরীক্ষা করা উচিত (এটি শুধুমাত্র রচনা অবস্থার সাথে কাজ করে)।

শর্তের জন্য অপেক্ষা করুন

যে কোনো শর্ত যা বাহ্যিক কাজের উপর নির্ভর করে, যেমন ডেটা লোডিং বা অ্যান্ড্রয়েডের পরিমাপ বা অঙ্কন (অর্থাৎ, কম্পোজ করার জন্য বাহ্যিক পরিমাপ বা আঁকা), অপেক্ষাকৃত সাধারণ ধারণা ব্যবহার করা উচিত যেমন waitUntil() :

composeTestRule.waitUntil(timeoutMs) { condition }

আপনি waitUntil সাহায্যকারীর যেকোনো একটি ব্যবহার করতে পারেন:

composeTestRule.waitUntilAtLeastOneExists(matcher, timeoutMs)

composeTestRule.waitUntilDoesNotExist(matcher, timeoutMs)

composeTestRule.waitUntilExactlyOneExists(matcher, timeoutMs)

composeTestRule.waitUntilNodeCount(matcher, count, timeoutMs)

অতিরিক্ত সম্পদ