কম্পোজ পরীক্ষাগুলি আপনার 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()
}মনে রাখবেন যে এই প্রয়োজনীয়তা শুধুমাত্র কম্পোজ হায়ারার্কির ক্ষেত্রে প্রযোজ্য, অ্যাপের বাকি অংশের ক্ষেত্রে নয়।
স্বয়ংক্রিয় সিঙ্ক্রোনাইজেশন অক্ষম করুন
 যখন আপনি ComposeTestRule যেমন assertExists() মাধ্যমে কোনও অ্যাসারশন বা অ্যাকশন কল করেন, তখন আপনার পরীক্ষাটি Compose UI এর সাথে সিঙ্ক্রোনাইজ করা হয়। কিছু ক্ষেত্রে আপনি এই সিঙ্ক্রোনাইজেশন বন্ধ করে ঘড়িটি নিজেই নিয়ন্ত্রণ করতে চাইতে পারেন। উদাহরণস্বরূপ, আপনি এমন একটি বিন্দুতে অ্যানিমেশনের সঠিক স্ক্রিনশট নেওয়ার জন্য সময় নিয়ন্ত্রণ করতে পারেন যেখানে UI এখনও ব্যস্ত থাকবে। স্বয়ংক্রিয় সিঙ্ক্রোনাইজেশন অক্ষম করতে, mainClock এ autoAdvance প্রোপার্টিটিকে false এ সেট করুন:
composeTestRule.mainClock.autoAdvance = false
 সাধারণত আপনি নিজেই সময় এগিয়ে নেবেন। আপনি advanceTimeByFrame() দিয়ে ঠিক একটি ফ্রেম বা advanceTimeBy() দিয়ে একটি নির্দিষ্ট সময়কাল এগিয়ে নিতে পারেন:
composeTestRule.mainClock.advanceTimeByFrame()
composeTestRule.mainClock.advanceTimeBy(milliseconds)
নিষ্ক্রিয় সম্পদ
কম্পোজ পরীক্ষা এবং UI সিঙ্ক্রোনাইজ করতে পারে যাতে প্রতিটি ক্রিয়া এবং দাবি নিষ্ক্রিয় অবস্থায় করা হয়, অপেক্ষা করা হয় বা প্রয়োজন অনুসারে ঘড়ির কাঁটা এগিয়ে নেওয়া হয়। যাইহোক, কিছু অ্যাসিঙ্ক্রোনাস অপারেশন যার ফলাফল UI অবস্থাকে প্রভাবিত করে তা ব্যাকগ্রাউন্ডে চালানো যেতে পারে যখন পরীক্ষাটি তাদের সম্পর্কে অজ্ঞ থাকে।
আপনার পরীক্ষায় এই অলস রিসোর্সগুলি তৈরি করুন এবং নিবন্ধন করুন যাতে পরীক্ষাধীন অ্যাপটি ব্যস্ত নাকি নিষ্ক্রিয় তা নির্ধারণ করার সময় সেগুলি বিবেচনায় নেওয়া হয়। অতিরিক্ত অলস রিসোর্স নিবন্ধন না করা পর্যন্ত আপনাকে কোনও পদক্ষেপ নিতে হবে না, উদাহরণস্বরূপ, যদি আপনি এমন একটি ব্যাকগ্রাউন্ড কাজ চালান যা Espresso বা Compose এর সাথে সিঙ্ক্রোনাইজ করা হয় না।
 এই APIটি Espresso এর Idling Resources এর সাথে অনেকটাই সাদৃশ্যপূর্ণ, যা পরীক্ষার অধীনে থাকা বিষয়টি নিষ্ক্রিয় নাকি ব্যস্ত তা নির্দেশ করে। IdlingResource এর বাস্তবায়ন নিবন্ধন করতে Compose পরীক্ষার নিয়ম ব্যবহার করুন।
composeTestRule.registerIdlingResource(idlingResource)
composeTestRule.unregisterIdlingResource(idlingResource)
ম্যানুয়াল সিঙ্ক্রোনাইজেশন
কিছু ক্ষেত্রে, আপনাকে আপনার পরীক্ষার অন্যান্য অংশ বা আপনি যে অ্যাপটি পরীক্ষা করছেন তার সাথে Compose UI সিঙ্ক্রোনাইজ করতে হবে।
 waitForIdle() ফাংশনটি Compose নিষ্ক্রিয় থাকা পর্যন্ত অপেক্ষা করে, কিন্তু ফাংশনটি 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 }
মনে রাখবেন যে প্রদত্ত শর্তটি এই ঘড়ি দ্বারা প্রভাবিত হতে পারে এমন অবস্থা পরীক্ষা করা উচিত (এটি শুধুমাত্র কম্পোজ স্টেটের সাথে কাজ করে)।
শর্তের জন্য অপেক্ষা করুন
 যেকোনো অবস্থা যা বাহ্যিক কাজের উপর নির্ভর করে, যেমন ডেটা লোডিং বা অ্যান্ড্রয়েডের measure or draw (অর্থাৎ, Compose-এর জন্য measure or draw external), তার জন্য আরও সাধারণ ধারণা ব্যবহার করা উচিত যেমন waitUntil() :
composeTestRule.waitUntil(timeoutMs) { condition }
 আপনি waitUntil সাহায্যকারীদের যেকোনো একটি ব্যবহার করতে পারেন:
composeTestRule.waitUntilAtLeastOneExists(matcher, timeoutMs)
composeTestRule.waitUntilDoesNotExist(matcher, timeoutMs)
composeTestRule.waitUntilExactlyOneExists(matcher, timeoutMs)
composeTestRule.waitUntilNodeCount(matcher, count, timeoutMs)
অতিরিক্ত সম্পদ
- অ্যান্ড্রয়েডে অ্যাপ পরীক্ষা করুন : মূল অ্যান্ড্রয়েড টেস্টিং ল্যান্ডিং পৃষ্ঠাটি পরীক্ষার মৌলিক বিষয় এবং কৌশলগুলির একটি বিস্তৃত দৃষ্টিভঙ্গি প্রদান করে।
- পরীক্ষার মৌলিক বিষয় : একটি অ্যান্ড্রয়েড অ্যাপ পরীক্ষা করার পিছনে মূল ধারণাগুলি সম্পর্কে আরও জানুন।
- স্থানীয় পরীক্ষা : আপনি আপনার নিজস্ব ওয়ার্কস্টেশনে স্থানীয়ভাবে কিছু পরীক্ষা চালাতে পারেন।
- যন্ত্রচালিত পরীক্ষা : যন্ত্রচালিত পরীক্ষা চালানোও ভালো অভ্যাস। অর্থাৎ, এমন পরীক্ষা যা সরাসরি ডিভাইসে চলে।
- ক্রমাগত ইন্টিগ্রেশন : ক্রমাগত ইন্টিগ্রেশন আপনাকে আপনার পরীক্ষাগুলিকে আপনার স্থাপনার পাইপলাইনে একীভূত করতে দেয়।
- বিভিন্ন স্ক্রিন মাপ পরীক্ষা করুন : ব্যবহারকারীদের জন্য অনেক ডিভাইস উপলব্ধ থাকায়, আপনার বিভিন্ন স্ক্রিন মাপের জন্য পরীক্ষা করা উচিত।
- এসপ্রেসো : ভিউ-ভিত্তিক UI-এর জন্য তৈরি হলেও, এসপ্রেসো জ্ঞান কম্পোজ পরীক্ষার কিছু দিকের জন্য সহায়ক হতে পারে।
