হেলথ কানেক্ট টেস্টিং লাইব্রেরি ( androidx.health.connect:connect-testing ) স্বয়ংক্রিয় পরীক্ষা তৈরিকে সহজ করে তোলে। আপনি এই লাইব্রেরিটি ব্যবহার করে আপনার অ্যাপ্লিকেশনের আচরণ যাচাই করতে পারেন এবং যাচাই করতে পারেন যে এটি অস্বাভাবিক ক্ষেত্রে সঠিকভাবে সাড়া দেয়, যা ম্যানুয়ালি পরীক্ষা করা কঠিন।
আপনি স্থানীয় ইউনিট পরীক্ষা তৈরি করতে লাইব্রেরি ব্যবহার করতে পারেন, যা সাধারণত আপনার অ্যাপের Health Connect ক্লায়েন্টের সাথে ইন্টারঅ্যাক্ট করে এমন ক্লাসগুলির আচরণ যাচাই করে।
লাইব্রেরি ব্যবহার শুরু করতে, এটি একটি পরীক্ষামূলক নির্ভরতা হিসাবে যুক্ত করুন:
testImplementation("androidx.health.connect:connect-testing:1.0.0-alpha03")
লাইব্রেরিতে প্রবেশের স্থান হল FakeHealthConnectClient ক্লাস, যা আপনি HealthConnectClient প্রতিস্থাপনের জন্য পরীক্ষায় ব্যবহার করেন। FakeHealthConnectClient এর নিম্নলিখিত বৈশিষ্ট্য রয়েছে:
- রেকর্ডগুলির একটি ইন-মেমরি উপস্থাপনা, যাতে আপনি সেগুলি সন্নিবেশ করতে, অপসারণ করতে, মুছতে এবং পড়তে পারেন।
- পরিবর্তন টোকেন তৈরি এবং পরিবর্তন ট্র্যাকিং
- রেকর্ড এবং পরিবর্তনের জন্য পৃষ্ঠাঙ্কন
- একত্রিতকরণ প্রতিক্রিয়াগুলি স্টাবগুলির সাথে সমর্থিত
- যেকোনো ফাংশনকে ব্যতিক্রম নিক্ষেপ করার অনুমতি দেয়
- একটি
FakePermissionControllerযা অনুমতি পরীক্ষা অনুকরণ করতে ব্যবহার করা যেতে পারে
পরীক্ষায় নির্ভরতা প্রতিস্থাপন সম্পর্কে আরও জানতে, "অ্যান্ড্রয়েডে নির্ভরতা ইনজেকশন" পড়ুন। নকল সম্পর্কে আরও জানতে, "অ্যান্ড্রয়েডে পরীক্ষা দ্বিগুণ ব্যবহার" পড়ুন।
উদাহরণস্বরূপ, যদি ক্লায়েন্টের সাথে ইন্টারঅ্যাক্ট করে এমন ক্লাসটিকে HealthConnectManager বলা হয় এবং এটি একটি HealthConnectClient একটি নির্ভরতা হিসেবে গ্রহণ করে, তাহলে এটি দেখতে এরকম হবে:
class HealthConnectManager(
private val healthConnectClient: HealthConnectClient,
...
) { }
পরীক্ষায়, আপনি পরীক্ষার অধীনে আপনার ক্লাসে একটি জাল পাস করতে পারেন:
import androidx.health.connect.client.testing.ExperimentalTestingApi
import androidx.health.connect.client.testing.FakeHealthConnectClient
import kotlinx.coroutines.test.runTest
@OptIn(ExperimentalTestingApi::class)
class HealthConnectManagerTest {
@Test
fun readRecords_filterByActivity() = runTest {
// Create a Fake with 2 running records.
val fake = FakeHealthConnectClient()
fake.insertRecords(listOf(fakeRunRecord1, fakeBikeRecord1))
// Create a manager that depends on the fake.
val manager = HealthConnectManager(fake)
// Read running records only.
val runningRecords = manager.fetchReport(activity = Running)
// Verify that the records were filtered correctly.
assertTrue(runningRecords.size == 1)
}
}
এই পরীক্ষাটি যাচাই করে যে HealthConnectManager এর কাল্পনিক fetchReport ফাংশনটি কার্যকলাপ অনুসারে রেকর্ডগুলিকে সঠিকভাবে ফিল্টার করে।
ব্যতিক্রম যাচাই করা হচ্ছে
HealthConnectClient এ প্রায় প্রতিটি কলেই ব্যতিক্রম থাকতে পারে। উদাহরণস্বরূপ, insertRecords এর ডকুমেন্টেশনে এই ব্যতিক্রমগুলি উল্লেখ করা হয়েছে:
- যেকোনো IPC পরিবহন ব্যর্থতার জন্য
@throws android.os.RemoteException। -
@throws SecurityExceptionঅননুমোদিত অ্যাক্সেস সহ অনুরোধগুলির জন্য। - যেকোনো ডিস্ক I/O সমস্যার জন্য
@throws java.io.IOException।
এই ব্যতিক্রমগুলি খারাপ সংযোগ বা ডিভাইসে কোনও স্থান অবশিষ্ট না থাকার মতো ক্ষেত্রে প্রযোজ্য। আপনার অ্যাপকে এই রানটাইম সমস্যাগুলির জন্য সঠিকভাবে প্রতিক্রিয়া জানাতে হবে, কারণ এগুলি যে কোনও সময় ঘটতে পারে।
import androidx.health.connect.client.testing.stubs.stub
@Test
fun addRecords_throwsRemoteException_errorIsExposed() {
// Create Fake that throws a RemoteException
// when insertRecords is called.
val fake = FakeHealthConnectClient()
fake.overrides.insertRecords = stub { throw RemoteException() }
// Create a manager that depends on the fake.
val manager = HealthConnectManager(fake)
// Insert a record.
manager.addRecords(fakeRunRecord1)
// Verify that the manager is exposing an error.
assertTrue(manager.errors.size == 1)
}
সমষ্টি
অ্যাগ্রিগেশন কলগুলিতে জাল বাস্তবায়ন থাকে না। পরিবর্তে, অ্যাগ্রিগেশন কলগুলি স্টাব ব্যবহার করে যা আপনি একটি নির্দিষ্ট উপায়ে আচরণ করার জন্য প্রোগ্রাম করতে পারেন। আপনি FakeHealthConnectClient এর overrides সম্পত্তির মাধ্যমে স্টাবগুলি অ্যাক্সেস করতে পারেন।
উদাহরণস্বরূপ, আপনি একটি নির্দিষ্ট ফলাফল ফেরত দেওয়ার জন্য সমষ্টিগত ফাংশনটি প্রোগ্রাম করতে পারেন:
import androidx.health.connect.client.testing.AggregationResult
import androidx.health.connect.client.records.HeartRateRecord
import androidx.health.connect.client.records.ExerciseSessionRecord
import java.time.Duration
@Test
fun aggregate() {
// Create a fake result.
val result =
AggregationResult(metrics =
buildMap {
put(HeartRateRecord.BPM_AVG, 74.0)
put(
ExerciseSessionRecord.EXERCISE_DURATION_TOTAL,
Duration.ofMinutes(30)
)
}
)
// Create a fake that always returns the fake
// result when aggregate() is called.
val fake = FakeHealthConnectClient()
fake.overrides.aggregate = stub(result)
তারপর, আপনি যাচাই করতে পারবেন যে আপনার পরীক্ষার অধীনে থাকা ক্লাস, এই ক্ষেত্রে HealthConnectManager , ফলাফল সঠিকভাবে প্রক্রিয়া করেছে:
// Create a manager that depends on the fake.
val manager = HealthConnectManager(fake)
// Call the function that in turn calls aggregate on the client.
val report = manager.getHeartRateReport()
// Verify that the manager is exposing an error.
assertThat(report.bpmAverage).isEqualTo(74.0)
অনুমতিসমূহ
টেস্টিং লাইব্রেরিতে একটি FakePermissionController রয়েছে, যা FakeHealthConnectClient উপর নির্ভরতা হিসেবে ব্যবহার করা যেতে পারে।
আপনার পরীক্ষাধীন সাবজেক্ট HealthConnectClient ইন্টারফেসের permissionController প্রোপার্টির মাধ্যমে অ্যাক্সেস করা PermissionController ব্যবহার করে অনুমতি পরীক্ষা করতে পারে। এটি সাধারণত ক্লায়েন্টকে প্রতিটি কল করার আগে করা হয়।
এই কার্যকারিতা পরীক্ষা করার জন্য, আপনি FakePermissionController ব্যবহার করে কোন অনুমতিগুলি উপলব্ধ তা সেট করতে পারেন:
import androidx.health.connect.client.testing.FakePermissionController
@Test
fun newRecords_noPermissions_errorIsExposed() {
// Create a permission controller with no permissions.
val permissionController = FakePermissionController(grantAll = false)
// Create a fake client with the permission controller.
val fake = FakeHealthConnectClient(permissionController = permissionController)
// Create a manager that depends on the fake.
val manager = HealthConnectManager(fake)
// Call addRecords so that the permission check is made.
manager.addRecords(fakeRunRecord1)
// Verify that the manager is exposing an error.
assertThat(manager.errors).hasSize(1)
}
পৃষ্ঠাঙ্কন
পৃষ্ঠাঙ্কন বাগের একটি খুব সাধারণ উৎস, তাই FakeHealthConnectClient আপনাকে রেকর্ড এবং পরিবর্তনের জন্য আপনার পেজিং বাস্তবায়ন সঠিকভাবে কাজ করছে কিনা তা যাচাই করতে সাহায্য করার জন্য প্রক্রিয়া সরবরাহ করে।
আপনার পরীক্ষার অধীনে থাকা বিষয়, আমাদের উদাহরণে HealthConnectManager , ReadRecordsRequest এ পৃষ্ঠার আকার নির্দিষ্ট করতে পারে:
fun fetchRecordsReport(pageSize: Int = 1000) }
val pagedRequest =
ReadRecordsRequest(
timeRangeFilter = ...,
recordType = ...,
pageToken = page1.pageToken,
pageSize = pageSize,
)
val page = client.readRecords(pagedRequest)
...
পৃষ্ঠার আকার একটি ছোট মান, যেমন 2, সেট করলে আপনি পৃষ্ঠাঙ্কন পরীক্ষা করতে পারবেন। উদাহরণস্বরূপ, আপনি 5টি রেকর্ড সন্নিবেশ করতে পারেন যাতে readRecords 3টি ভিন্ন পৃষ্ঠা ফেরত দেয়:
@Test
fun readRecords_multiplePages() = runTest {
// Create a Fake with 2 running records.
val fake = FakeHealthConnectClient()
fake.insertRecords(generateRunningRecords(5))
// Create a manager that depends on the fake.
val manager = HealthConnectManager(fake)
// Read records with a page size of 2.
val report = manager.generateReport(pageSize = 2)
// Verify that all the pages were processed correctly.
assertTrue(report.records.size == 5)
}
পরীক্ষার তথ্য
লাইব্রেরিতে এখনও জাল ডেটা তৈরি করার জন্য API অন্তর্ভুক্ত করা হয়নি, তবে আপনি Android Code Search- এ লাইব্রেরিতে ব্যবহৃত ডেটা এবং জেনারেটর ব্যবহার করতে পারেন।
পরীক্ষাগুলিতে মেটাডেটা মানগুলিকে উপহাস করার জন্য, আপনি MetadataTestHelper ব্যবহার করতে পারেন। এটি populatedWithTestValues() এক্সটেনশন ফাংশন প্রদান করে, যা রেকর্ড সন্নিবেশের সময় Health Connect-এর মাধ্যমে মেটাডেটা মানগুলিকে পপুলেট করে।
স্টাব
FakeHealthConnectClient এর overrides প্রপার্টি আপনাকে এর যেকোনো ফাংশন প্রোগ্রাম (অথবা stub out ) করতে দেয় যাতে কল করার সময় ব্যতিক্রমগুলি ফেলে দেওয়া যায়। Aggregation কলগুলিও ইচ্ছামত ডেটা ফেরত দিতে পারে এবং এটি একাধিক প্রতিক্রিয়া সারিবদ্ধকরণ সমর্থন করে। আরও তথ্যের জন্য Stub এবং MutableStub দেখুন।
প্রান্তের মামলার সারাংশ
- ক্লায়েন্ট যখন ব্যতিক্রমগুলি ছুঁড়ে দেয় তখন আপনার অ্যাপটি প্রত্যাশা অনুযায়ী আচরণ করে কিনা তা যাচাই করুন। কোন ব্যতিক্রমগুলি পরীক্ষা করা উচিত তা নির্ধারণ করতে প্রতিটি ফাংশনের ডকুমেন্টেশন পরীক্ষা করুন।
- ক্লায়েন্টকে করা প্রতিটি কলের আগে যথাযথ অনুমতি পরীক্ষা করা হয়েছে কিনা তা যাচাই করুন।
- আপনার পৃষ্ঠাঙ্কন বাস্তবায়ন যাচাই করুন।
- একাধিক পৃষ্ঠা আনলে কিন্তু একটির মেয়াদোত্তীর্ণ টোকেন থাকলে কী হবে তা যাচাই করুন।