অ্যাপ অ্যাকশন টেস্ট লাইব্রেরি (AATL) ডেভেলপারদের অ্যাপ অ্যাকশন পরিপূর্ণতা প্রোগ্রাম্যাটিকভাবে পরীক্ষা করতে সক্ষম করার ক্ষমতা প্রদান করে, স্বয়ংক্রিয় পরীক্ষা যা সাধারণত প্রকৃত ভয়েস কোয়েরি বা অ্যাপ অ্যাকশন টেস্ট টুল ব্যবহার করে করা হয়।
লাইব্রেরি নিশ্চিত করতে সাহায্য করে যে shortcut.xml
কনফিগারেশন সঠিক এবং বর্ণিত Android উদ্দেশ্য আহ্বান সফল হয়েছে। অ্যাপ অ্যাকশন টেস্ট লাইব্রেরি একটি অ্যান্ড্রয়েড ডিপ লিঙ্ক বা অ্যান্ড্রয়েড অভিপ্রায়ে রূপান্তর করে প্রদত্ত Google অ্যাসিস্ট্যান্ট অভিপ্রায় এবং পরামিতিগুলি পূরণ করার জন্য আপনার অ্যাপের ক্ষমতা পরীক্ষা করার জন্য একটি প্রক্রিয়া প্রদান করে, যেটি নিশ্চিত করা যেতে পারে এবং একটি অ্যান্ড্রয়েড অ্যাক্টিভিটি চালু করতে ব্যবহার করা যেতে পারে।
অ্যান্ড্রয়েড পরিবেশে রোবোলেক্ট্রিক ইউনিট বা যন্ত্রযুক্ত পরীক্ষার আকারে পরীক্ষা করা হয়। এটি বিকাশকারীদের প্রকৃত অ্যাপ আচরণ অনুকরণ করে ব্যাপকভাবে তাদের অ্যাপ্লিকেশন পরীক্ষা করার অনুমতি দেয়। BII, কাস্টম ইন্টেন্ট বা গভীর লিঙ্ক পরিপূর্ণতা পরীক্ষা করার জন্য, যেকোন যন্ত্রযুক্ত টেস্টিং ফ্রেমওয়ার্ক ব্যবহার করা যেতে পারে (UI Automator, Espresso, JUnit4, Appium, Detox, Calabash)।
যদি অ্যাপ্লিকেশনটি বহু-ভাষিক হয়, তবে বিকাশকারীরা যাচাই করতে পারে যে অ্যাপ্লিকেশনটির কার্যকারিতা বিভিন্ন লোকেলে সঠিকভাবে আচরণ করছে৷
এটা কিভাবে কাজ করে
অ্যাপের পরীক্ষার পরিবেশের মধ্যে অ্যাপ অ্যাকশন টেস্ট লাইব্রেরি সংহত করতে, ডেভেলপারদের অ্যাপের app
মডিউলে নতুন তৈরি করা বা বিদ্যমান রোবোলেক্ট্রিক বা যন্ত্রযুক্ত পরীক্ষাগুলি আপডেট করা উচিত।
পরীক্ষার কোডে নিম্নলিখিত অংশগুলি রয়েছে:
- সাধারণ সেটআপ পদ্ধতিতে বা পৃথক পরীক্ষার ক্ষেত্রে লাইব্রেরি উদাহরণের প্রাথমিককরণ।
- প্রতিটি স্বতন্ত্র পরীক্ষা উদ্দেশ্য তৈরির ফলাফল তৈরি করতে লাইব্রেরির উদাহরণের
fulfill
পদ্ধতিকে কল করে। - বিকাশকারী তারপরে গভীর লিঙ্কটি জাহির করে বা অ্যাপ পূর্ণতা ট্রিগার করে এবং অ্যাপ স্টেটে কাস্টম বৈধতা চালায়।
সেটআপ প্রয়োজনীয়তা
পরীক্ষা লাইব্রেরি ব্যবহার করার জন্য, আপনার অ্যাপ্লিকেশনে পরীক্ষাগুলি যোগ করার আগে কিছু প্রাথমিক অ্যাপ কনফিগারেশন প্রয়োজন।
কনফিগারেশন
অ্যাপ অ্যাকশন টেস্ট লাইব্রেরি ব্যবহার করতে, নিশ্চিত করুন যে আপনার অ্যাপটি এইভাবে কনফিগার করা আছে:
- অ্যান্ড্রয়েড গ্রেডল প্লাগইন (এজিপি) ইনস্টল করুন
-
app
মডিউলেরres/xml
ফোল্ডারে একটিshortcuts.xml
ফাইল অন্তর্ভুক্ত করুন। - নিশ্চিত করুন যে
AndroidManifest.xml
যেকোন একটির অধীনে<meta-data android:name="android.app.shortcuts" android:resource=”@xml/shortcuts” />
অন্তর্ভুক্ত রয়েছে:-
<application>
ট্যাগ - লঞ্চার
<activity>
ট্যাগ
-
-
shortcuts.xml
এ<shortcuts>
উপাদানের ভিতরে<capability>
উপাদানটি রাখুন
অ্যাপ অ্যাকশন টেস্ট লাইব্রেরি নির্ভরতা যোগ করুন
settings.gradle
এ প্রোজেক্ট রিপোজিটরির তালিকায় Google সংগ্রহস্থল যোগ করুন:allprojects { repositories { … google() } }
অ্যাপ মডিউল
build.gradle
ফাইলে, AATL নির্ভরতা যোগ করুন:androidTestImplementation 'com.google.assistant.appactions:testing:1.0.0'
আপনার ডাউনলোড করা লাইব্রেরির সংস্করণ নম্বর ব্যবহার করা নিশ্চিত করুন।
ইন্টিগ্রেশন পরীক্ষা তৈরি করুন
app/src/androidTest
এর অধীনে নতুন পরীক্ষা তৈরি করুন। রোবোলেক্ট্রিক পরীক্ষার জন্য, এগুলিকেapp/src/test
অধীনে তৈরি করুন:কোটলিন
import android.content.Context import android.content.Intent import android.widget.TextView import androidx.test.core.app.ApplicationProvider import androidx.test.core.app.ActivityScenario import com.google.assistant.appactions.testing.aatl.AppActionsTestManager import com.google.assistant.appactions.testing.aatl.fulfillment.AppActionsFulfillmentIntentResult import com.google.assistant.appactions.testing.aatl.fulfillment.AppActionsFulfillmentResult import com.google.assistant.appactions.testing.aatl.fulfillment.FulfillmentType import com.google.common.collect.ImmutableMap import org.junit.Assert.assertEquals import org.junit.Before import org.junit.runner.RunWith import org.junit.Test import org.robolectric.RobolectricTestRunner … @Test fun IntentTestExample() { val intentParams = mapOf("feature" to "settings") val intentName = "actions.intent.OPEN_APP_FEATURE" val result = aatl.fulfill(intentName, intentParams) assertEquals(FulfillmentType.INTENT, result.getFulfillmentType()) val intentResult = result as AppActionsFulfillmentIntentResult val intent = intentResult.intent // Developer can choose to assert different relevant properties of the returned intent, such as the action, activity, package, scheme and so on assertEquals("youtube", intent.scheme) assertEquals("settings", intent.getStringExtra("featureParam")) assertEquals("actions.intent.OPEN_APP_FEATURE", intent.action) assertEquals("com.google.android.youtube/.MainActivity", intent.component.flattenToShortString()) assertEquals("com.google.myapp", intent.package) // Developers can choose to use returned Android Intent to launch and assess the activity. Below are examples for how it will look like for Robolectric and Espresso tests. // Please note that the below part is just a possible example of how Android tests are validating Activity functionality correctness for given Android Intent. // Robolectric example: val activity = Robolectric.buildActivity(MainActivity::class.java, intentResult.intent).create().resume().get() val title: TextView = activity.findViewById(R.id.startActivityTitle) assertEquals(title?.text?.toString(), "Launching…") }
জাভা
import android.content.Context; import android.content.Intent; import android.widget.TextView; import androidx.test.core.app.ApplicationProvider; import androidx.test.core.app.ActivityScenario; import com.google.assistant.appactions.testing.aatl.AppActionsTestManager; import com.google.assistant.appactions.testing.aatl.fulfillment.AppActionsFulfillmentIntentResult; import com.google.assistant.appactions.testing.aatl.fulfillment.AppActionsFulfillmentResult; import com.google.assistant.appactions.testing.aatl.fulfillment.FulfillmentType; import com.google.common.collect.ImmutableMap; import org.junit.Assert.assertEquals; import org.junit.Before; import org.junit.runner.RunWith; import org.junit.Test; import org.robolectric.RobolectricTestRunner; ... @Test public void IntentTestExample() throws Exception { Map<String, String> intentParams = ImmutableMap.of("feature", "settings"); String intentName = "actions.intent.OPEN_APP_FEATURE"; AppActionsFulfillmentResult result = aatl.fulfill(intentName, intentParams); assertEquals(FulfillmentType.INTENT, result.getFulfillmentType()); AppActionsFulfillmentIntentResult intentResult = (AppActionsFulfillmentIntentResult) result; Intent intent = intentResult.getIntent(); // Developer can choose to assert different relevant properties of the returned intent, such as the action, activity, package, or scheme assertEquals("settings", intent.getStringExtra("featureParam")); assertEquals("actions.intent.OPEN_APP_FEATURE", intent.getAction()); assertEquals("com.google.android.youtube/.MainActivity", intent.getComponent().flattenToShortString()); assertEquals("com.google.myapp", intent.getPackage()); // Developers can choose to use returned Android Intent to launch and assess the activity. Below are examples for how it will look like for Robolectric and Espresso tests. // Please note that the below part is just a possible example of how Android tests are validating Activity functionality correctness for given Android Intent. // Robolectric example: MainActivity activity = Robolectric.buildActivity(MainActivity.class,intentResult.intent).create().resume().get(); TextView title: TextView = activity.findViewById(R.id.startActivityTitle) assertEquals(title?.getText()?.toString(), "Launching…") }
আপনি যদি Espresso ব্যবহার করেন, তাহলে AATL ফলাফলের উপর ভিত্তি করে আপনি কীভাবে অ্যাক্টিভিটি চালু করবেন তা আপনাকে পরিবর্তন করতে হবে।
ActivityScenario
পদ্ধতি ব্যবহার করে Espresso-এর জন্য এখানে একটি উদাহরণ দেওয়া হল:কোটলিন
ActivityScenario.launch<MainActivity>(intentResult.intent); Espresso.onView(ViewMatchers.withId(R.id.startActivityTitle)) .check(ViewAssertions.matches(ViewMatchers.withText("Launching…")))
জাভা
ActivityScenario.launch<MainActivity>(intentResult.intent); Espresso.onView(ViewMatchers.withId(R.id.startActivityTitle)) .check(ViewAssertions.matches(ViewMatchers.withText("Launching…")))
প্যারামিটার ম্যাপিংয়ের নাম এবং মূল বৈশিষ্ট্যগুলি BII-এর পরামিতিগুলির সাথে মেলে৷ উদাহরণ স্বরূপ,
exercisePlan.forExercise.name
GET_EXERCISE_PLAN
এর প্যারামিটারের ডকুমেন্টেশনের সাথে মেলে।অ্যান্ড্রয়েড কনটেক্সট প্যারামিটার দিয়ে এপিআই ইনস্ট্যান্স ইনস্ট্যান্টিয়েট করুন (
ApplicationProvider
বাInstrumentationRegistry
থেকে প্রাপ্ত):- একক মডিউল অ্যাপ আর্কিটেকচার:
কোটলিন
private lateinit var aatl: AppActionsTestManager @Before fun init() { val appContext = ApplicationProvider.getApplicationContext() aatl = AppActionsTestManager(appContext) }
জাভা
private AppActionsTestManager aatl; @Before public void init() { Context appContext = ApplicationProvider.getApplicationContext(); aatl = new AppActionsTestManager(appContext); }
- মাল্টি-মডিউল অ্যাপ আর্কিটেকচার:
কোটলিন
private lateinit var aatl: AppActionsTestManager @Before fun init() { val appContext = ApplicationProvider.getApplicationContext() val lookupPackages = listOf("com.myapp.mainapp", "com.myapp.resources") aatl = AppActionsTestManager(appContext, lookupPackages) }
জাভা
private AppActionsTestManager aatl; @Before public void init() throws Exception { Context appContext = ApplicationProvider.getApplicationContext(); List<String> lookupPackages = Arrays.asList("com.myapp.mainapp","com.myapp.resources"); aatl = new AppActionsTestManager(appContext, Optional.of(lookupPackages)); }
এপিআই-এর
fulfill
পদ্ধতি চালান এবংAppActionsFulfillmentResult
অবজেক্ট পান।
দাবী সঞ্চালন
অ্যাপ অ্যাকশন টেস্ট লাইব্রেরি জাহির করার প্রস্তাবিত উপায় হল:
-
AppActionsFulfillmentResult
এর পরিপূর্ণতার ধরন জাহির করুন। অপ্রত্যাশিত BII অনুরোধের ক্ষেত্রে অ্যাপটি কীভাবে আচরণ করে তা পরীক্ষা করার জন্য এটিFulfillmentType.INTENT
, বাFulfillmentType.UNFULFILLED
হতে হবে। - পূর্ণতার 2টি স্বাদ রয়েছে:
INTENT
এবংDEEPLINK
পূর্ণতা।- সাধারণত, বিকাশকারী লাইব্রেরি ট্রিগার করার মাধ্যমে যেটি পূরণ করছে তা
shortcuts.xml
এ অভিপ্রায় ট্যাগ দেখেINTENT
এবংDEEPLINK
পূরণের মধ্যে পার্থক্য করতে পারে। - যদি অভিপ্রায় ট্যাগের অধীনে একটি url-টেমপ্লেট ট্যাগ থাকে, তাহলে এটি নির্দেশ করে যে
DEEPLINK
এই অভিপ্রায় পূরণ করে। - যদি ফলাফলের অভিপ্রায়ের
getData()
পদ্ধতিটি একটি নন-নাল অবজেক্ট প্রদান করে, তাহলে এটিDEEPLINK
পূর্ণতাও নির্দেশ করে। একইভাবে, যদিgetData
null
ফেরত দেয় তবে এর অর্থ হল এটি একটিINTENT
পূর্ণতা।
- সাধারণত, বিকাশকারী লাইব্রেরি ট্রিগার করার মাধ্যমে যেটি পূরণ করছে তা
-
INTENT
ক্ষেত্রে,AppActionsIntentFulfillmentResult
এAppActionsFulfillmentResult
টাইপকাস্ট করুন,getIntent
পদ্ধতিতে কল করে Android ইন্টেন্ট আনুন এবং নিম্নলিখিতগুলির মধ্যে একটি করুন:- অ্যান্ড্রয়েড ইন্টেন্টের স্বতন্ত্র ক্ষেত্রগুলি জাহির করুন।
- intent.getData.getHost পদ্ধতির মাধ্যমে অ্যাক্সেস করা একটি অভিপ্রায়ের uri দাবি করুন।
-
DEEPLINK
ক্ষেত্রে,AppActionsIntentFulfillmentResult
এAppActionsFulfillmentResult
টাইপকাস্ট করুন (উপরেরINTENT
দৃশ্যের মতো),getIntent
পদ্ধতিতে কল করে Android ইন্টেন্ট আনুন এবং ডিপলিংক url (intent.getData.getHost
এর মাধ্যমে অ্যাক্সেস করা হয়েছে) নিশ্চিত করুন। -
INTENT
এবংDEEPLINK
উভয়ের জন্য, আপনি নির্বাচিত অ্যান্ড্রয়েড টেস্টিং ফ্রেমওয়ার্কের সাথে অ্যাক্টিভিটি আরম্ভ করতে ফলাফলের উদ্দেশ্য ব্যবহার করতে পারেন।
আন্তর্জাতিকীকরণ
আপনার অ্যাপে একাধিক লোকেল থাকলে, আপনি একটি নির্দিষ্ট লোকেল আন্ডার-টেস্ট চালানোর জন্য পরীক্ষা কনফিগার করতে পারেন। বিকল্পভাবে, আপনি সরাসরি লোকেল পরিবর্তন করতে পারেন:
কোটলিন
import android.content.res.Configuration import java.util.Locale ... val newLocale = Locale("es") val conf = context.resources.configuration conf = Configuration(conf) conf.setLocale(newLocale)
জাভা
Locale newLocale = new Locale("es"); Configuration conf = context.getResources().getConfiguration(); conf = new Configuration(conf); conf.setLocale(newLocale);
এখানে স্প্যানিশ (ES) লোকেলের জন্য কনফিগার করা AATL পরীক্ষার একটি উদাহরণ রয়েছে:
কোটলিন
import com.google.common.truth.Truth.assertThat import org.junit.Assert.assertEquals import android.content.Context import android.content.res.Configuration import androidx.test.platform.app.InstrumentationRegistry import com.google.assistant.appactions.testing.aatl.AppActionsTestManager import com.google.assistant.appactions.testing.aatl.fulfillment.AppActionsFulfillmentIntentResult import com.google.assistant.appactions.testing.aatl.fulfillment.AppActionsFulfillmentResult import com.google.assistant.appactions.testing.aatl.fulfillment.FulfillmentType import com.google.common.collect.ImmutableMap import java.util.Locale import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import org.robolectric.RobolectricTestRunner @RunWith(RobolectricTestRunner::class) class ShortcutForDifferentLocaleTest { @Before fun setUp() { val context = InstrumentationRegistry.getInstrumentation().getContext() // change the device locale to 'es' val newLocale = Locale("es") val conf = context.resources.configuration conf = Configuration(conf) conf.setLocale(newLocale) val localizedContext = context.createConfigurationContext(conf) } @Test fun shortcutForDifferentLocale_succeeds() { val aatl = AppActionsTestManager(localizedContext) val intentName = "actions.intent.GET_EXERCISE_PLAN" val intentParams = ImmutableMap.of("exercisePlan.forExercise.name", "Running") val result = aatl.fulfill(intentName, intentParams) assertThat(result.getFulfillmentType()).isEqualTo(FulfillmentType.INTENT) val intentResult = result as AppActionsFulfillmentIntentResult assertThat(intentResult.getIntent().getData().toString()) .isEqualTo("myexercise://browse?plan=running_weekly") } }
জাভা
import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertEquals; import android.content.Context; import android.content.res.Configuration; import androidx.test.platform.app.InstrumentationRegistry; import com.google.assistant.appactions.testing.aatl.AppActionsTestManager; import com.google.assistant.appactions.testing.aatl.fulfillment.AppActionsFulfillmentIntentResult; import com.google.assistant.appactions.testing.aatl.fulfillment.AppActionsFulfillmentResult; import com.google.assistant.appactions.testing.aatl.fulfillment.FulfillmentType; import com.google.common.collect.ImmutableMap; import java.util.Locale; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; @Test public void shortcutForDifferentLocale_succeeds() throws Exception { Context context = InstrumentationRegistry.getInstrumentation().getContext(); // change the device locale to 'es' Locale newLocale = new Locale("es"); Configuration conf = context.getResources().getConfiguration(); conf = new Configuration(conf); conf.setLocale(newLocale); Context localizedContext = context.createConfigurationContext(conf); AppActionsTestManager aatl = new AppActionsTestManager(localizedContext); String intentName = "actions.intent.GET_EXERCISE_PLAN"; ImmutableMap<String, String> intentParams = ImmutableMap.of("exercisePlan.forExercise.name", "Running"); AppActionsFulfillmentResult result = aatl.fulfill(intentName, intentParams); assertThat(result.getFulfillmentType()).isEqualTo(FulfillmentType.INTENT); AppActionsFulfillmentIntentResult intentResult = (AppActionsFulfillmentIntentResult) result; assertThat(intentResult.getIntent().getData().toString()) .isEqualTo("myexercise://browse?plan=running_weekly"); }
সমস্যা সমাধান
আপনার ইন্টিগ্রেশন পরীক্ষা অপ্রত্যাশিতভাবে ব্যর্থ হলে, আপনি সতর্কতা বা ত্রুটি স্তরের বার্তা পেতে Android স্টুডিও লগক্যাট উইন্ডোতে AATL লগ বার্তাগুলি সন্ধান করতে পারেন। আপনি লাইব্রেরি থেকে আরও আউটপুট ক্যাপচার করতে লগিং স্তর বাড়াতে পারেন।
সীমাবদ্ধতা
এগুলি হল অ্যাপ অ্যাকশন টেস্ট লাইব্রেরির বর্তমান সীমাবদ্ধতা:
- AATL ন্যাচারাল ল্যাঙ্গুয়েজ আন্ডারস্ট্যান্ডিং (NLU) বা স্পিচ-টু-টেক্সট (STT) বৈশিষ্ট্য পরীক্ষা করে না।
- ডিফল্ট অ্যাপ মডিউল ছাড়া অন্য মডিউলে পরীক্ষা হলে AATL কাজ করে না।
- AATL শুধুমাত্র Android 7.0 "Nougat" (API লেভেল 24) এবং নতুন সংস্করণের সাথে সামঞ্জস্যপূর্ণ।
অ্যাপ অ্যাকশন টেস্ট লাইব্রেরি (AATL) ডেভেলপারদের অ্যাপ অ্যাকশন পরিপূর্ণতা প্রোগ্রাম্যাটিকভাবে পরীক্ষা করতে সক্ষম করার ক্ষমতা প্রদান করে, স্বয়ংক্রিয় পরীক্ষা যা সাধারণত প্রকৃত ভয়েস কোয়েরি বা অ্যাপ অ্যাকশন টেস্ট টুল ব্যবহার করে করা হয়।
লাইব্রেরি নিশ্চিত করতে সাহায্য করে যে shortcut.xml
কনফিগারেশন সঠিক এবং বর্ণিত Android উদ্দেশ্য আহ্বান সফল হয়েছে। অ্যাপ অ্যাকশন টেস্ট লাইব্রেরি একটি অ্যান্ড্রয়েড ডিপ লিঙ্ক বা অ্যান্ড্রয়েড অভিপ্রায়ে রূপান্তর করে প্রদত্ত Google অ্যাসিস্ট্যান্ট অভিপ্রায় এবং পরামিতিগুলি পূরণ করার জন্য আপনার অ্যাপের ক্ষমতা পরীক্ষা করার জন্য একটি প্রক্রিয়া প্রদান করে, যেটি নিশ্চিত করা যেতে পারে এবং একটি অ্যান্ড্রয়েড অ্যাক্টিভিটি চালু করতে ব্যবহার করা যেতে পারে।
অ্যান্ড্রয়েড পরিবেশে রোবোলেক্ট্রিক ইউনিট বা যন্ত্রযুক্ত পরীক্ষার আকারে পরীক্ষা করা হয়। এটি বিকাশকারীদের প্রকৃত অ্যাপ আচরণ অনুকরণ করে ব্যাপকভাবে তাদের অ্যাপ্লিকেশন পরীক্ষা করার অনুমতি দেয়। BII, কাস্টম ইন্টেন্ট বা গভীর লিঙ্ক পরিপূর্ণতা পরীক্ষা করার জন্য, যেকোন যন্ত্রযুক্ত টেস্টিং ফ্রেমওয়ার্ক ব্যবহার করা যেতে পারে (UI Automator, Espresso, JUnit4, Appium, Detox, Calabash)।
যদি অ্যাপ্লিকেশনটি বহু-ভাষিক হয়, তবে বিকাশকারীরা যাচাই করতে পারে যে অ্যাপ্লিকেশনটির কার্যকারিতা বিভিন্ন লোকেলে সঠিকভাবে আচরণ করছে৷
এটা কিভাবে কাজ করে
অ্যাপের পরীক্ষার পরিবেশের মধ্যে অ্যাপ অ্যাকশন টেস্ট লাইব্রেরি সংহত করতে, ডেভেলপারদের অ্যাপের app
মডিউলে নতুন তৈরি করা বা বিদ্যমান রোবোলেক্ট্রিক বা যন্ত্রযুক্ত পরীক্ষাগুলি আপডেট করা উচিত।
পরীক্ষার কোডে নিম্নলিখিত অংশগুলি রয়েছে:
- সাধারণ সেটআপ পদ্ধতিতে বা পৃথক পরীক্ষার ক্ষেত্রে লাইব্রেরি উদাহরণের প্রাথমিককরণ।
- প্রতিটি স্বতন্ত্র পরীক্ষা উদ্দেশ্য তৈরির ফলাফল তৈরি করতে লাইব্রেরির উদাহরণের
fulfill
পদ্ধতিকে কল করে। - বিকাশকারী তারপরে গভীর লিঙ্কটি জাহির করে বা অ্যাপ পূর্ণতা ট্রিগার করে এবং অ্যাপ স্টেটে কাস্টম বৈধতা চালায়।
সেটআপ প্রয়োজনীয়তা
পরীক্ষা লাইব্রেরি ব্যবহার করার জন্য, আপনার অ্যাপ্লিকেশনে পরীক্ষাগুলি যোগ করার আগে কিছু প্রাথমিক অ্যাপ কনফিগারেশন প্রয়োজন।
কনফিগারেশন
অ্যাপ অ্যাকশন টেস্ট লাইব্রেরি ব্যবহার করতে, নিশ্চিত করুন যে আপনার অ্যাপটি এইভাবে কনফিগার করা আছে:
- অ্যান্ড্রয়েড গ্রেডল প্লাগইন (এজিপি) ইনস্টল করুন
-
app
মডিউলেরres/xml
ফোল্ডারে একটিshortcuts.xml
ফাইল অন্তর্ভুক্ত করুন। - নিশ্চিত করুন যে
AndroidManifest.xml
যেকোন একটির অধীনে<meta-data android:name="android.app.shortcuts" android:resource=”@xml/shortcuts” />
অন্তর্ভুক্ত রয়েছে:-
<application>
ট্যাগ - লঞ্চার
<activity>
ট্যাগ
-
-
shortcuts.xml
এ<shortcuts>
উপাদানের ভিতরে<capability>
উপাদানটি রাখুন
অ্যাপ অ্যাকশন টেস্ট লাইব্রেরি নির্ভরতা যোগ করুন
settings.gradle
এ প্রোজেক্ট রিপোজিটরির তালিকায় Google সংগ্রহস্থল যোগ করুন:allprojects { repositories { … google() } }
অ্যাপ মডিউল
build.gradle
ফাইলে, AATL নির্ভরতা যোগ করুন:androidTestImplementation 'com.google.assistant.appactions:testing:1.0.0'
আপনার ডাউনলোড করা লাইব্রেরির সংস্করণ নম্বর ব্যবহার করা নিশ্চিত করুন।
ইন্টিগ্রেশন পরীক্ষা তৈরি করুন
app/src/androidTest
এর অধীনে নতুন পরীক্ষা তৈরি করুন। রোবোলেক্ট্রিক পরীক্ষার জন্য, এগুলিকেapp/src/test
অধীনে তৈরি করুন:কোটলিন
import android.content.Context import android.content.Intent import android.widget.TextView import androidx.test.core.app.ApplicationProvider import androidx.test.core.app.ActivityScenario import com.google.assistant.appactions.testing.aatl.AppActionsTestManager import com.google.assistant.appactions.testing.aatl.fulfillment.AppActionsFulfillmentIntentResult import com.google.assistant.appactions.testing.aatl.fulfillment.AppActionsFulfillmentResult import com.google.assistant.appactions.testing.aatl.fulfillment.FulfillmentType import com.google.common.collect.ImmutableMap import org.junit.Assert.assertEquals import org.junit.Before import org.junit.runner.RunWith import org.junit.Test import org.robolectric.RobolectricTestRunner … @Test fun IntentTestExample() { val intentParams = mapOf("feature" to "settings") val intentName = "actions.intent.OPEN_APP_FEATURE" val result = aatl.fulfill(intentName, intentParams) assertEquals(FulfillmentType.INTENT, result.getFulfillmentType()) val intentResult = result as AppActionsFulfillmentIntentResult val intent = intentResult.intent // Developer can choose to assert different relevant properties of the returned intent, such as the action, activity, package, scheme and so on assertEquals("youtube", intent.scheme) assertEquals("settings", intent.getStringExtra("featureParam")) assertEquals("actions.intent.OPEN_APP_FEATURE", intent.action) assertEquals("com.google.android.youtube/.MainActivity", intent.component.flattenToShortString()) assertEquals("com.google.myapp", intent.package) // Developers can choose to use returned Android Intent to launch and assess the activity. Below are examples for how it will look like for Robolectric and Espresso tests. // Please note that the below part is just a possible example of how Android tests are validating Activity functionality correctness for given Android Intent. // Robolectric example: val activity = Robolectric.buildActivity(MainActivity::class.java, intentResult.intent).create().resume().get() val title: TextView = activity.findViewById(R.id.startActivityTitle) assertEquals(title?.text?.toString(), "Launching…") }
জাভা
import android.content.Context; import android.content.Intent; import android.widget.TextView; import androidx.test.core.app.ApplicationProvider; import androidx.test.core.app.ActivityScenario; import com.google.assistant.appactions.testing.aatl.AppActionsTestManager; import com.google.assistant.appactions.testing.aatl.fulfillment.AppActionsFulfillmentIntentResult; import com.google.assistant.appactions.testing.aatl.fulfillment.AppActionsFulfillmentResult; import com.google.assistant.appactions.testing.aatl.fulfillment.FulfillmentType; import com.google.common.collect.ImmutableMap; import org.junit.Assert.assertEquals; import org.junit.Before; import org.junit.runner.RunWith; import org.junit.Test; import org.robolectric.RobolectricTestRunner; ... @Test public void IntentTestExample() throws Exception { Map<String, String> intentParams = ImmutableMap.of("feature", "settings"); String intentName = "actions.intent.OPEN_APP_FEATURE"; AppActionsFulfillmentResult result = aatl.fulfill(intentName, intentParams); assertEquals(FulfillmentType.INTENT, result.getFulfillmentType()); AppActionsFulfillmentIntentResult intentResult = (AppActionsFulfillmentIntentResult) result; Intent intent = intentResult.getIntent(); // Developer can choose to assert different relevant properties of the returned intent, such as the action, activity, package, or scheme assertEquals("settings", intent.getStringExtra("featureParam")); assertEquals("actions.intent.OPEN_APP_FEATURE", intent.getAction()); assertEquals("com.google.android.youtube/.MainActivity", intent.getComponent().flattenToShortString()); assertEquals("com.google.myapp", intent.getPackage()); // Developers can choose to use returned Android Intent to launch and assess the activity. Below are examples for how it will look like for Robolectric and Espresso tests. // Please note that the below part is just a possible example of how Android tests are validating Activity functionality correctness for given Android Intent. // Robolectric example: MainActivity activity = Robolectric.buildActivity(MainActivity.class,intentResult.intent).create().resume().get(); TextView title: TextView = activity.findViewById(R.id.startActivityTitle) assertEquals(title?.getText()?.toString(), "Launching…") }
আপনি যদি Espresso ব্যবহার করেন, তাহলে AATL ফলাফলের উপর ভিত্তি করে আপনি কীভাবে অ্যাক্টিভিটি চালু করবেন তা আপনাকে পরিবর্তন করতে হবে।
ActivityScenario
পদ্ধতি ব্যবহার করে Espresso-এর জন্য এখানে একটি উদাহরণ দেওয়া হল:কোটলিন
ActivityScenario.launch<MainActivity>(intentResult.intent); Espresso.onView(ViewMatchers.withId(R.id.startActivityTitle)) .check(ViewAssertions.matches(ViewMatchers.withText("Launching…")))
জাভা
ActivityScenario.launch<MainActivity>(intentResult.intent); Espresso.onView(ViewMatchers.withId(R.id.startActivityTitle)) .check(ViewAssertions.matches(ViewMatchers.withText("Launching…")))
প্যারামিটার ম্যাপিংয়ের নাম এবং মূল বৈশিষ্ট্যগুলি BII-এর পরামিতিগুলির সাথে মেলে৷ উদাহরণ স্বরূপ,
exercisePlan.forExercise.name
GET_EXERCISE_PLAN
এর প্যারামিটারের ডকুমেন্টেশনের সাথে মেলে।অ্যান্ড্রয়েড কনটেক্সট প্যারামিটার দিয়ে এপিআই ইনস্ট্যান্স ইনস্ট্যান্টিয়েট করুন (
ApplicationProvider
বাInstrumentationRegistry
থেকে প্রাপ্ত):- একক মডিউল অ্যাপ আর্কিটেকচার:
কোটলিন
private lateinit var aatl: AppActionsTestManager @Before fun init() { val appContext = ApplicationProvider.getApplicationContext() aatl = AppActionsTestManager(appContext) }
জাভা
private AppActionsTestManager aatl; @Before public void init() { Context appContext = ApplicationProvider.getApplicationContext(); aatl = new AppActionsTestManager(appContext); }
- মাল্টি-মডিউল অ্যাপ আর্কিটেকচার:
কোটলিন
private lateinit var aatl: AppActionsTestManager @Before fun init() { val appContext = ApplicationProvider.getApplicationContext() val lookupPackages = listOf("com.myapp.mainapp", "com.myapp.resources") aatl = AppActionsTestManager(appContext, lookupPackages) }
জাভা
private AppActionsTestManager aatl; @Before public void init() throws Exception { Context appContext = ApplicationProvider.getApplicationContext(); List<String> lookupPackages = Arrays.asList("com.myapp.mainapp","com.myapp.resources"); aatl = new AppActionsTestManager(appContext, Optional.of(lookupPackages)); }
এপিআই-এর
fulfill
পদ্ধতি চালান এবংAppActionsFulfillmentResult
অবজেক্ট পান।
দাবী সঞ্চালন
অ্যাপ অ্যাকশন টেস্ট লাইব্রেরি জাহির করার প্রস্তাবিত উপায় হল:
-
AppActionsFulfillmentResult
এর পরিপূর্ণতার ধরন জাহির করুন। অপ্রত্যাশিত BII অনুরোধের ক্ষেত্রে অ্যাপটি কীভাবে আচরণ করে তা পরীক্ষা করার জন্য এটিFulfillmentType.INTENT
, বাFulfillmentType.UNFULFILLED
হতে হবে। - পূর্ণতার 2টি স্বাদ রয়েছে:
INTENT
এবংDEEPLINK
পূর্ণতা।- সাধারণত, বিকাশকারী লাইব্রেরি ট্রিগার করার মাধ্যমে যেটি পূরণ করছে তা
shortcuts.xml
এ অভিপ্রায় ট্যাগ দেখেINTENT
এবংDEEPLINK
পূরণের মধ্যে পার্থক্য করতে পারে। - যদি অভিপ্রায় ট্যাগের অধীনে একটি url-টেমপ্লেট ট্যাগ থাকে, তাহলে এটি নির্দেশ করে যে
DEEPLINK
এই অভিপ্রায় পূরণ করে। - যদি ফলাফলের অভিপ্রায়ের
getData()
পদ্ধতিটি একটি নন-নাল অবজেক্ট প্রদান করে, তাহলে এটিDEEPLINK
পূর্ণতাও নির্দেশ করে। একইভাবে, যদিgetData
null
ফেরত দেয় তবে এর অর্থ হল এটি একটিINTENT
পূর্ণতা।
- সাধারণত, বিকাশকারী লাইব্রেরি ট্রিগার করার মাধ্যমে যেটি পূরণ করছে তা
-
INTENT
ক্ষেত্রে,AppActionsIntentFulfillmentResult
এAppActionsFulfillmentResult
টাইপকাস্ট করুন,getIntent
পদ্ধতিতে কল করে Android ইন্টেন্ট আনুন এবং নিম্নলিখিতগুলির মধ্যে একটি করুন:- অ্যান্ড্রয়েড ইন্টেন্টের স্বতন্ত্র ক্ষেত্রগুলি জাহির করুন।
- intent.getData.getHost পদ্ধতির মাধ্যমে অ্যাক্সেস করা একটি অভিপ্রায়ের uri দাবি করুন।
-
DEEPLINK
ক্ষেত্রে,AppActionsIntentFulfillmentResult
এAppActionsFulfillmentResult
টাইপকাস্ট করুন (উপরেরINTENT
দৃশ্যের মতো),getIntent
পদ্ধতিতে কল করে Android ইন্টেন্ট আনুন এবং ডিপলিংক url (intent.getData.getHost
এর মাধ্যমে অ্যাক্সেস করা হয়েছে) নিশ্চিত করুন। -
INTENT
এবংDEEPLINK
উভয়ের জন্য, আপনি নির্বাচিত অ্যান্ড্রয়েড টেস্টিং ফ্রেমওয়ার্কের সাথে অ্যাক্টিভিটি আরম্ভ করতে ফলাফলের উদ্দেশ্য ব্যবহার করতে পারেন।
আন্তর্জাতিকীকরণ
আপনার অ্যাপে একাধিক লোকেল থাকলে, আপনি একটি নির্দিষ্ট লোকেল আন্ডার-টেস্ট চালানোর জন্য পরীক্ষা কনফিগার করতে পারেন। বিকল্পভাবে, আপনি সরাসরি লোকেল পরিবর্তন করতে পারেন:
কোটলিন
import android.content.res.Configuration import java.util.Locale ... val newLocale = Locale("es") val conf = context.resources.configuration conf = Configuration(conf) conf.setLocale(newLocale)
জাভা
Locale newLocale = new Locale("es"); Configuration conf = context.getResources().getConfiguration(); conf = new Configuration(conf); conf.setLocale(newLocale);
এখানে স্প্যানিশ (ES) লোকেলের জন্য কনফিগার করা AATL পরীক্ষার একটি উদাহরণ রয়েছে:
কোটলিন
import com.google.common.truth.Truth.assertThat import org.junit.Assert.assertEquals import android.content.Context import android.content.res.Configuration import androidx.test.platform.app.InstrumentationRegistry import com.google.assistant.appactions.testing.aatl.AppActionsTestManager import com.google.assistant.appactions.testing.aatl.fulfillment.AppActionsFulfillmentIntentResult import com.google.assistant.appactions.testing.aatl.fulfillment.AppActionsFulfillmentResult import com.google.assistant.appactions.testing.aatl.fulfillment.FulfillmentType import com.google.common.collect.ImmutableMap import java.util.Locale import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import org.robolectric.RobolectricTestRunner @RunWith(RobolectricTestRunner::class) class ShortcutForDifferentLocaleTest { @Before fun setUp() { val context = InstrumentationRegistry.getInstrumentation().getContext() // change the device locale to 'es' val newLocale = Locale("es") val conf = context.resources.configuration conf = Configuration(conf) conf.setLocale(newLocale) val localizedContext = context.createConfigurationContext(conf) } @Test fun shortcutForDifferentLocale_succeeds() { val aatl = AppActionsTestManager(localizedContext) val intentName = "actions.intent.GET_EXERCISE_PLAN" val intentParams = ImmutableMap.of("exercisePlan.forExercise.name", "Running") val result = aatl.fulfill(intentName, intentParams) assertThat(result.getFulfillmentType()).isEqualTo(FulfillmentType.INTENT) val intentResult = result as AppActionsFulfillmentIntentResult assertThat(intentResult.getIntent().getData().toString()) .isEqualTo("myexercise://browse?plan=running_weekly") } }
জাভা
import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertEquals; import android.content.Context; import android.content.res.Configuration; import androidx.test.platform.app.InstrumentationRegistry; import com.google.assistant.appactions.testing.aatl.AppActionsTestManager; import com.google.assistant.appactions.testing.aatl.fulfillment.AppActionsFulfillmentIntentResult; import com.google.assistant.appactions.testing.aatl.fulfillment.AppActionsFulfillmentResult; import com.google.assistant.appactions.testing.aatl.fulfillment.FulfillmentType; import com.google.common.collect.ImmutableMap; import java.util.Locale; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; @Test public void shortcutForDifferentLocale_succeeds() throws Exception { Context context = InstrumentationRegistry.getInstrumentation().getContext(); // change the device locale to 'es' Locale newLocale = new Locale("es"); Configuration conf = context.getResources().getConfiguration(); conf = new Configuration(conf); conf.setLocale(newLocale); Context localizedContext = context.createConfigurationContext(conf); AppActionsTestManager aatl = new AppActionsTestManager(localizedContext); String intentName = "actions.intent.GET_EXERCISE_PLAN"; ImmutableMap<String, String> intentParams = ImmutableMap.of("exercisePlan.forExercise.name", "Running"); AppActionsFulfillmentResult result = aatl.fulfill(intentName, intentParams); assertThat(result.getFulfillmentType()).isEqualTo(FulfillmentType.INTENT); AppActionsFulfillmentIntentResult intentResult = (AppActionsFulfillmentIntentResult) result; assertThat(intentResult.getIntent().getData().toString()) .isEqualTo("myexercise://browse?plan=running_weekly"); }
সমস্যা সমাধান
আপনার ইন্টিগ্রেশন পরীক্ষা অপ্রত্যাশিতভাবে ব্যর্থ হলে, আপনি সতর্কতা বা ত্রুটি স্তরের বার্তা পেতে Android স্টুডিও লগক্যাট উইন্ডোতে AATL লগ বার্তাগুলি সন্ধান করতে পারেন। আপনি লাইব্রেরি থেকে আরও আউটপুট ক্যাপচার করতে লগিং স্তর বাড়াতে পারেন।
সীমাবদ্ধতা
এগুলি হল অ্যাপ অ্যাকশন টেস্ট লাইব্রেরির বর্তমান সীমাবদ্ধতা:
- AATL ন্যাচারাল ল্যাঙ্গুয়েজ আন্ডারস্ট্যান্ডিং (NLU) বা স্পিচ-টু-টেক্সট (STT) বৈশিষ্ট্য পরীক্ষা করে না।
- ডিফল্ট অ্যাপ মডিউল ছাড়া অন্য মডিউলে পরীক্ষা হলে AATL কাজ করে না।
- AATL শুধুমাত্র Android 7.0 "Nougat" (API লেভেল 24) এবং নতুন সংস্করণের সাথে সামঞ্জস্যপূর্ণ।
অ্যাপ অ্যাকশন টেস্ট লাইব্রেরি (AATL) ডেভেলপারদের অ্যাপ অ্যাকশন পরিপূর্ণতা প্রোগ্রাম্যাটিকভাবে পরীক্ষা করতে সক্ষম করার ক্ষমতা প্রদান করে, স্বয়ংক্রিয় পরীক্ষা যা সাধারণত প্রকৃত ভয়েস কোয়েরি বা অ্যাপ অ্যাকশন টেস্ট টুল ব্যবহার করে করা হয়।
লাইব্রেরি নিশ্চিত করতে সাহায্য করে যে shortcut.xml
কনফিগারেশন সঠিক এবং বর্ণিত Android উদ্দেশ্য আহ্বান সফল হয়েছে। অ্যাপ অ্যাকশন টেস্ট লাইব্রেরি একটি অ্যান্ড্রয়েড ডিপ লিঙ্ক বা অ্যান্ড্রয়েড অভিপ্রায়ে রূপান্তর করে প্রদত্ত Google অ্যাসিস্ট্যান্ট অভিপ্রায় এবং পরামিতিগুলি পূরণ করার জন্য আপনার অ্যাপের ক্ষমতা পরীক্ষা করার জন্য একটি প্রক্রিয়া প্রদান করে, যেটি নিশ্চিত করা যেতে পারে এবং একটি অ্যান্ড্রয়েড অ্যাক্টিভিটি চালু করতে ব্যবহার করা যেতে পারে।
অ্যান্ড্রয়েড পরিবেশে রোবোলেক্ট্রিক ইউনিট বা যন্ত্রযুক্ত পরীক্ষার আকারে পরীক্ষা করা হয়। এটি বিকাশকারীদের প্রকৃত অ্যাপ আচরণ অনুকরণ করে ব্যাপকভাবে তাদের অ্যাপ্লিকেশন পরীক্ষা করার অনুমতি দেয়। BII, কাস্টম ইন্টেন্ট বা গভীর লিঙ্ক পরিপূর্ণতা পরীক্ষা করার জন্য, যেকোন যন্ত্রযুক্ত টেস্টিং ফ্রেমওয়ার্ক ব্যবহার করা যেতে পারে (UI Automator, Espresso, JUnit4, Appium, Detox, Calabash)।
যদি অ্যাপ্লিকেশনটি বহু-ভাষিক হয়, তবে বিকাশকারীরা যাচাই করতে পারে যে অ্যাপ্লিকেশনটির কার্যকারিতা বিভিন্ন লোকেলে সঠিকভাবে আচরণ করছে৷
এটা কিভাবে কাজ করে
অ্যাপের পরীক্ষার পরিবেশের মধ্যে অ্যাপ অ্যাকশন টেস্ট লাইব্রেরি সংহত করতে, ডেভেলপারদের অ্যাপের app
মডিউলে নতুন তৈরি করা বা বিদ্যমান রোবোলেক্ট্রিক বা যন্ত্রযুক্ত পরীক্ষাগুলি আপডেট করা উচিত।
পরীক্ষার কোডে নিম্নলিখিত অংশগুলি রয়েছে:
- সাধারণ সেটআপ পদ্ধতিতে বা পৃথক পরীক্ষার ক্ষেত্রে লাইব্রেরি উদাহরণের প্রাথমিককরণ।
- প্রতিটি স্বতন্ত্র পরীক্ষা উদ্দেশ্য তৈরির ফলাফল তৈরি করতে লাইব্রেরির উদাহরণের
fulfill
পদ্ধতিকে কল করে। - বিকাশকারী তারপরে গভীর লিঙ্কটি জাহির করে বা অ্যাপ পূর্ণতা ট্রিগার করে এবং অ্যাপ স্টেটে কাস্টম বৈধতা চালায়।
সেটআপ প্রয়োজনীয়তা
পরীক্ষা লাইব্রেরি ব্যবহার করার জন্য, আপনার অ্যাপ্লিকেশনে পরীক্ষাগুলি যোগ করার আগে কিছু প্রাথমিক অ্যাপ কনফিগারেশন প্রয়োজন।
কনফিগারেশন
অ্যাপ অ্যাকশন টেস্ট লাইব্রেরি ব্যবহার করতে, নিশ্চিত করুন যে আপনার অ্যাপটি এইভাবে কনফিগার করা আছে:
- অ্যান্ড্রয়েড গ্রেডল প্লাগইন (এজিপি) ইনস্টল করুন
-
app
মডিউলেরres/xml
ফোল্ডারে একটিshortcuts.xml
ফাইল অন্তর্ভুক্ত করুন। - নিশ্চিত করুন যে
AndroidManifest.xml
যেকোন একটির অধীনে<meta-data android:name="android.app.shortcuts" android:resource=”@xml/shortcuts” />
অন্তর্ভুক্ত রয়েছে:-
<application>
ট্যাগ - লঞ্চার
<activity>
ট্যাগ
-
-
shortcuts.xml
এ<shortcuts>
উপাদানের ভিতরে<capability>
উপাদানটি রাখুন
অ্যাপ অ্যাকশন টেস্ট লাইব্রেরি নির্ভরতা যোগ করুন
settings.gradle
এ প্রোজেক্ট রিপোজিটরির তালিকায় Google সংগ্রহস্থল যোগ করুন:allprojects { repositories { … google() } }
অ্যাপ মডিউল
build.gradle
ফাইলে, AATL নির্ভরতা যোগ করুন:androidTestImplementation 'com.google.assistant.appactions:testing:1.0.0'
আপনার ডাউনলোড করা লাইব্রেরির সংস্করণ নম্বর ব্যবহার করা নিশ্চিত করুন।
ইন্টিগ্রেশন পরীক্ষা তৈরি করুন
app/src/androidTest
এর অধীনে নতুন পরীক্ষা তৈরি করুন। রোবোলেক্ট্রিক পরীক্ষার জন্য, এগুলিকেapp/src/test
অধীনে তৈরি করুন:কোটলিন
import android.content.Context import android.content.Intent import android.widget.TextView import androidx.test.core.app.ApplicationProvider import androidx.test.core.app.ActivityScenario import com.google.assistant.appactions.testing.aatl.AppActionsTestManager import com.google.assistant.appactions.testing.aatl.fulfillment.AppActionsFulfillmentIntentResult import com.google.assistant.appactions.testing.aatl.fulfillment.AppActionsFulfillmentResult import com.google.assistant.appactions.testing.aatl.fulfillment.FulfillmentType import com.google.common.collect.ImmutableMap import org.junit.Assert.assertEquals import org.junit.Before import org.junit.runner.RunWith import org.junit.Test import org.robolectric.RobolectricTestRunner … @Test fun IntentTestExample() { val intentParams = mapOf("feature" to "settings") val intentName = "actions.intent.OPEN_APP_FEATURE" val result = aatl.fulfill(intentName, intentParams) assertEquals(FulfillmentType.INTENT, result.getFulfillmentType()) val intentResult = result as AppActionsFulfillmentIntentResult val intent = intentResult.intent // Developer can choose to assert different relevant properties of the returned intent, such as the action, activity, package, scheme and so on assertEquals("youtube", intent.scheme) assertEquals("settings", intent.getStringExtra("featureParam")) assertEquals("actions.intent.OPEN_APP_FEATURE", intent.action) assertEquals("com.google.android.youtube/.MainActivity", intent.component.flattenToShortString()) assertEquals("com.google.myapp", intent.package) // Developers can choose to use returned Android Intent to launch and assess the activity. Below are examples for how it will look like for Robolectric and Espresso tests. // Please note that the below part is just a possible example of how Android tests are validating Activity functionality correctness for given Android Intent. // Robolectric example: val activity = Robolectric.buildActivity(MainActivity::class.java, intentResult.intent).create().resume().get() val title: TextView = activity.findViewById(R.id.startActivityTitle) assertEquals(title?.text?.toString(), "Launching…") }
জাভা
import android.content.Context; import android.content.Intent; import android.widget.TextView; import androidx.test.core.app.ApplicationProvider; import androidx.test.core.app.ActivityScenario; import com.google.assistant.appactions.testing.aatl.AppActionsTestManager; import com.google.assistant.appactions.testing.aatl.fulfillment.AppActionsFulfillmentIntentResult; import com.google.assistant.appactions.testing.aatl.fulfillment.AppActionsFulfillmentResult; import com.google.assistant.appactions.testing.aatl.fulfillment.FulfillmentType; import com.google.common.collect.ImmutableMap; import org.junit.Assert.assertEquals; import org.junit.Before; import org.junit.runner.RunWith; import org.junit.Test; import org.robolectric.RobolectricTestRunner; ... @Test public void IntentTestExample() throws Exception { Map<String, String> intentParams = ImmutableMap.of("feature", "settings"); String intentName = "actions.intent.OPEN_APP_FEATURE"; AppActionsFulfillmentResult result = aatl.fulfill(intentName, intentParams); assertEquals(FulfillmentType.INTENT, result.getFulfillmentType()); AppActionsFulfillmentIntentResult intentResult = (AppActionsFulfillmentIntentResult) result; Intent intent = intentResult.getIntent(); // Developer can choose to assert different relevant properties of the returned intent, such as the action, activity, package, or scheme assertEquals("settings", intent.getStringExtra("featureParam")); assertEquals("actions.intent.OPEN_APP_FEATURE", intent.getAction()); assertEquals("com.google.android.youtube/.MainActivity", intent.getComponent().flattenToShortString()); assertEquals("com.google.myapp", intent.getPackage()); // Developers can choose to use returned Android Intent to launch and assess the activity. Below are examples for how it will look like for Robolectric and Espresso tests. // Please note that the below part is just a possible example of how Android tests are validating Activity functionality correctness for given Android Intent. // Robolectric example: MainActivity activity = Robolectric.buildActivity(MainActivity.class,intentResult.intent).create().resume().get(); TextView title: TextView = activity.findViewById(R.id.startActivityTitle) assertEquals(title?.getText()?.toString(), "Launching…") }
আপনি যদি Espresso ব্যবহার করেন, তাহলে AATL ফলাফলের উপর ভিত্তি করে আপনি কীভাবে অ্যাক্টিভিটি চালু করবেন তা আপনাকে পরিবর্তন করতে হবে।
ActivityScenario
পদ্ধতি ব্যবহার করে Espresso-এর জন্য এখানে একটি উদাহরণ দেওয়া হল:কোটলিন
ActivityScenario.launch<MainActivity>(intentResult.intent); Espresso.onView(ViewMatchers.withId(R.id.startActivityTitle)) .check(ViewAssertions.matches(ViewMatchers.withText("Launching…")))
জাভা
ActivityScenario.launch<MainActivity>(intentResult.intent); Espresso.onView(ViewMatchers.withId(R.id.startActivityTitle)) .check(ViewAssertions.matches(ViewMatchers.withText("Launching…")))
প্যারামিটার ম্যাপিংয়ের নাম এবং মূল বৈশিষ্ট্যগুলি BII-এর পরামিতিগুলির সাথে মেলে৷ উদাহরণ স্বরূপ,
exercisePlan.forExercise.name
GET_EXERCISE_PLAN
এর প্যারামিটারের ডকুমেন্টেশনের সাথে মেলে।অ্যান্ড্রয়েড কনটেক্সট প্যারামিটার দিয়ে এপিআই ইনস্ট্যান্স ইনস্ট্যান্টিয়েট করুন (
ApplicationProvider
বাInstrumentationRegistry
থেকে প্রাপ্ত):- একক মডিউল অ্যাপ আর্কিটেকচার:
কোটলিন
private lateinit var aatl: AppActionsTestManager @Before fun init() { val appContext = ApplicationProvider.getApplicationContext() aatl = AppActionsTestManager(appContext) }
জাভা
private AppActionsTestManager aatl; @Before public void init() { Context appContext = ApplicationProvider.getApplicationContext(); aatl = new AppActionsTestManager(appContext); }
- মাল্টি-মডিউল অ্যাপ আর্কিটেকচার:
কোটলিন
private lateinit var aatl: AppActionsTestManager @Before fun init() { val appContext = ApplicationProvider.getApplicationContext() val lookupPackages = listOf("com.myapp.mainapp", "com.myapp.resources") aatl = AppActionsTestManager(appContext, lookupPackages) }
জাভা
private AppActionsTestManager aatl; @Before public void init() throws Exception { Context appContext = ApplicationProvider.getApplicationContext(); List<String> lookupPackages = Arrays.asList("com.myapp.mainapp","com.myapp.resources"); aatl = new AppActionsTestManager(appContext, Optional.of(lookupPackages)); }
এপিআই-এর
fulfill
পদ্ধতি চালান এবংAppActionsFulfillmentResult
অবজেক্ট পান।
দাবী সঞ্চালন
অ্যাপ অ্যাকশন টেস্ট লাইব্রেরি জাহির করার প্রস্তাবিত উপায় হল:
-
AppActionsFulfillmentResult
এর পরিপূর্ণতার ধরন জাহির করুন। অপ্রত্যাশিত BII অনুরোধের ক্ষেত্রে অ্যাপটি কীভাবে আচরণ করে তা পরীক্ষা করার জন্য এটিFulfillmentType.INTENT
, বাFulfillmentType.UNFULFILLED
হতে হবে। - পূর্ণতার 2টি স্বাদ রয়েছে:
INTENT
এবংDEEPLINK
পূর্ণতা।- সাধারণত, বিকাশকারী লাইব্রেরি ট্রিগার করার মাধ্যমে যেটি পূরণ করছে তা
shortcuts.xml
এ অভিপ্রায় ট্যাগ দেখেINTENT
এবংDEEPLINK
পূরণের মধ্যে পার্থক্য করতে পারে। - যদি অভিপ্রায় ট্যাগের অধীনে একটি url-টেমপ্লেট ট্যাগ থাকে, তাহলে এটি নির্দেশ করে যে
DEEPLINK
এই অভিপ্রায় পূরণ করে। - যদি ফলাফলের অভিপ্রায়ের
getData()
পদ্ধতিটি একটি নন-নাল অবজেক্ট প্রদান করে, তাহলে এটিDEEPLINK
পূর্ণতাও নির্দেশ করে। একইভাবে, যদিgetData
null
ফেরত দেয় তবে এর অর্থ হল এটি একটিINTENT
পূর্ণতা।
- সাধারণত, বিকাশকারী লাইব্রেরি ট্রিগার করার মাধ্যমে যেটি পূরণ করছে তা
-
INTENT
ক্ষেত্রে,AppActionsIntentFulfillmentResult
এAppActionsFulfillmentResult
টাইপকাস্ট করুন,getIntent
পদ্ধতিতে কল করে Android ইন্টেন্ট আনুন এবং নিম্নলিখিতগুলির মধ্যে একটি করুন:- অ্যান্ড্রয়েড ইন্টেন্টের স্বতন্ত্র ক্ষেত্রগুলি জাহির করুন।
- intent.getData.getHost পদ্ধতির মাধ্যমে অ্যাক্সেস করা একটি অভিপ্রায়ের uri দাবি করুন।
-
DEEPLINK
ক্ষেত্রে,AppActionsIntentFulfillmentResult
এAppActionsFulfillmentResult
টাইপকাস্ট করুন (উপরেরINTENT
দৃশ্যের মতো),getIntent
পদ্ধতিতে কল করে Android ইন্টেন্ট আনুন এবং ডিপলিংক url (intent.getData.getHost
এর মাধ্যমে অ্যাক্সেস করা হয়েছে) নিশ্চিত করুন। -
INTENT
এবংDEEPLINK
উভয়ের জন্য, আপনি নির্বাচিত অ্যান্ড্রয়েড টেস্টিং ফ্রেমওয়ার্কের সাথে অ্যাক্টিভিটি আরম্ভ করতে ফলাফলের উদ্দেশ্য ব্যবহার করতে পারেন।
আন্তর্জাতিকীকরণ
আপনার অ্যাপে একাধিক লোকেল থাকলে, আপনি একটি নির্দিষ্ট লোকেল আন্ডার-টেস্ট চালানোর জন্য পরীক্ষা কনফিগার করতে পারেন। বিকল্পভাবে, আপনি সরাসরি লোকেল পরিবর্তন করতে পারেন:
কোটলিন
import android.content.res.Configuration import java.util.Locale ... val newLocale = Locale("es") val conf = context.resources.configuration conf = Configuration(conf) conf.setLocale(newLocale)
জাভা
Locale newLocale = new Locale("es"); Configuration conf = context.getResources().getConfiguration(); conf = new Configuration(conf); conf.setLocale(newLocale);
এখানে স্প্যানিশ (ES) লোকেলের জন্য কনফিগার করা AATL পরীক্ষার একটি উদাহরণ রয়েছে:
কোটলিন
import com.google.common.truth.Truth.assertThat import org.junit.Assert.assertEquals import android.content.Context import android.content.res.Configuration import androidx.test.platform.app.InstrumentationRegistry import com.google.assistant.appactions.testing.aatl.AppActionsTestManager import com.google.assistant.appactions.testing.aatl.fulfillment.AppActionsFulfillmentIntentResult import com.google.assistant.appactions.testing.aatl.fulfillment.AppActionsFulfillmentResult import com.google.assistant.appactions.testing.aatl.fulfillment.FulfillmentType import com.google.common.collect.ImmutableMap import java.util.Locale import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import org.robolectric.RobolectricTestRunner @RunWith(RobolectricTestRunner::class) class ShortcutForDifferentLocaleTest { @Before fun setUp() { val context = InstrumentationRegistry.getInstrumentation().getContext() // change the device locale to 'es' val newLocale = Locale("es") val conf = context.resources.configuration conf = Configuration(conf) conf.setLocale(newLocale) val localizedContext = context.createConfigurationContext(conf) } @Test fun shortcutForDifferentLocale_succeeds() { val aatl = AppActionsTestManager(localizedContext) val intentName = "actions.intent.GET_EXERCISE_PLAN" val intentParams = ImmutableMap.of("exercisePlan.forExercise.name", "Running") val result = aatl.fulfill(intentName, intentParams) assertThat(result.getFulfillmentType()).isEqualTo(FulfillmentType.INTENT) val intentResult = result as AppActionsFulfillmentIntentResult assertThat(intentResult.getIntent().getData().toString()) .isEqualTo("myexercise://browse?plan=running_weekly") } }
জাভা
import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertEquals; import android.content.Context; import android.content.res.Configuration; import androidx.test.platform.app.InstrumentationRegistry; import com.google.assistant.appactions.testing.aatl.AppActionsTestManager; import com.google.assistant.appactions.testing.aatl.fulfillment.AppActionsFulfillmentIntentResult; import com.google.assistant.appactions.testing.aatl.fulfillment.AppActionsFulfillmentResult; import com.google.assistant.appactions.testing.aatl.fulfillment.FulfillmentType; import com.google.common.collect.ImmutableMap; import java.util.Locale; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; @Test public void shortcutForDifferentLocale_succeeds() throws Exception { Context context = InstrumentationRegistry.getInstrumentation().getContext(); // change the device locale to 'es' Locale newLocale = new Locale("es"); Configuration conf = context.getResources().getConfiguration(); conf = new Configuration(conf); conf.setLocale(newLocale); Context localizedContext = context.createConfigurationContext(conf); AppActionsTestManager aatl = new AppActionsTestManager(localizedContext); String intentName = "actions.intent.GET_EXERCISE_PLAN"; ImmutableMap<String, String> intentParams = ImmutableMap.of("exercisePlan.forExercise.name", "Running"); AppActionsFulfillmentResult result = aatl.fulfill(intentName, intentParams); assertThat(result.getFulfillmentType()).isEqualTo(FulfillmentType.INTENT); AppActionsFulfillmentIntentResult intentResult = (AppActionsFulfillmentIntentResult) result; assertThat(intentResult.getIntent().getData().toString()) .isEqualTo("myexercise://browse?plan=running_weekly"); }
সমস্যা সমাধান
আপনার ইন্টিগ্রেশন পরীক্ষা অপ্রত্যাশিতভাবে ব্যর্থ হলে, আপনি সতর্কতা বা ত্রুটি স্তরের বার্তা পেতে Android স্টুডিও লগক্যাট উইন্ডোতে AATL লগ বার্তাগুলি সন্ধান করতে পারেন। আপনি লাইব্রেরি থেকে আরও আউটপুট ক্যাপচার করতে লগিং স্তর বাড়াতে পারেন।
সীমাবদ্ধতা
এগুলি হল অ্যাপ অ্যাকশন টেস্ট লাইব্রেরির বর্তমান সীমাবদ্ধতা:
- AATL ন্যাচারাল ল্যাঙ্গুয়েজ আন্ডারস্ট্যান্ডিং (NLU) বা স্পিচ-টু-টেক্সট (STT) বৈশিষ্ট্য পরীক্ষা করে না।
- ডিফল্ট অ্যাপ মডিউল ছাড়া অন্য মডিউলে পরীক্ষা হলে AATL কাজ করে না।
- AATL শুধুমাত্র Android 7.0 "Nougat" (API লেভেল 24) এবং নতুন সংস্করণের সাথে সামঞ্জস্যপূর্ণ।
অ্যাপ অ্যাকশন টেস্ট লাইব্রেরি (AATL) ডেভেলপারদের অ্যাপ অ্যাকশন পরিপূর্ণতা প্রোগ্রাম্যাটিকভাবে পরীক্ষা করতে সক্ষম করার ক্ষমতা প্রদান করে, স্বয়ংক্রিয় পরীক্ষা যা সাধারণত প্রকৃত ভয়েস কোয়েরি বা অ্যাপ অ্যাকশন টেস্ট টুল ব্যবহার করে করা হয়।
লাইব্রেরি নিশ্চিত করতে সাহায্য করে যে shortcut.xml
কনফিগারেশন সঠিক এবং বর্ণিত Android উদ্দেশ্য আহ্বান সফল হয়েছে। অ্যাপ অ্যাকশন টেস্ট লাইব্রেরি একটি অ্যান্ড্রয়েড ডিপ লিঙ্ক বা অ্যান্ড্রয়েড অভিপ্রায়ে রূপান্তর করে প্রদত্ত Google অ্যাসিস্ট্যান্ট অভিপ্রায় এবং পরামিতিগুলি পূরণ করার জন্য আপনার অ্যাপের ক্ষমতা পরীক্ষা করার জন্য একটি প্রক্রিয়া প্রদান করে, যেটি নিশ্চিত করা যেতে পারে এবং একটি অ্যান্ড্রয়েড অ্যাক্টিভিটি চালু করতে ব্যবহার করা যেতে পারে।
অ্যান্ড্রয়েড পরিবেশে রোবোলেক্ট্রিক ইউনিট বা যন্ত্রযুক্ত পরীক্ষার আকারে পরীক্ষা করা হয়। এটি বিকাশকারীদের প্রকৃত অ্যাপ আচরণ অনুকরণ করে ব্যাপকভাবে তাদের অ্যাপ্লিকেশন পরীক্ষা করার অনুমতি দেয়। BII, কাস্টম ইন্টেন্ট বা গভীর লিঙ্ক পরিপূর্ণতা পরীক্ষা করার জন্য, যেকোন যন্ত্রযুক্ত টেস্টিং ফ্রেমওয়ার্ক ব্যবহার করা যেতে পারে (UI Automator, Espresso, JUnit4, Appium, Detox, Calabash)।
যদি অ্যাপ্লিকেশনটি বহু-ভাষিক হয়, তবে বিকাশকারীরা যাচাই করতে পারে যে অ্যাপ্লিকেশনটির কার্যকারিতা বিভিন্ন লোকেলে সঠিকভাবে আচরণ করছে৷
এটা কিভাবে কাজ করে
অ্যাপের পরীক্ষার পরিবেশের মধ্যে অ্যাপ অ্যাকশন টেস্ট লাইব্রেরি সংহত করতে, ডেভেলপারদের অ্যাপের app
মডিউলে নতুন তৈরি করা বা বিদ্যমান রোবোলেক্ট্রিক বা যন্ত্রযুক্ত পরীক্ষাগুলি আপডেট করা উচিত।
পরীক্ষার কোডে নিম্নলিখিত অংশগুলি রয়েছে:
- সাধারণ সেটআপ পদ্ধতিতে বা পৃথক পরীক্ষার ক্ষেত্রে লাইব্রেরি উদাহরণের প্রাথমিককরণ।
- প্রতিটি স্বতন্ত্র পরীক্ষা উদ্দেশ্য তৈরির ফলাফল তৈরি করতে লাইব্রেরির উদাহরণের
fulfill
পদ্ধতিকে কল করে। - বিকাশকারী তারপরে গভীর লিঙ্কটি জাহির করে বা অ্যাপ পূর্ণতা ট্রিগার করে এবং অ্যাপ স্টেটে কাস্টম বৈধতা চালায়।
সেটআপ প্রয়োজনীয়তা
পরীক্ষা লাইব্রেরি ব্যবহার করার জন্য, আপনার অ্যাপ্লিকেশনে পরীক্ষাগুলি যোগ করার আগে কিছু প্রাথমিক অ্যাপ কনফিগারেশন প্রয়োজন।
কনফিগারেশন
অ্যাপ অ্যাকশন টেস্ট লাইব্রেরি ব্যবহার করতে, নিশ্চিত করুন যে আপনার অ্যাপটি এইভাবে কনফিগার করা আছে:
- অ্যান্ড্রয়েড গ্রেডল প্লাগইন (এজিপি) ইনস্টল করুন
-
app
মডিউলেরres/xml
ফোল্ডারে একটিshortcuts.xml
ফাইল অন্তর্ভুক্ত করুন। - নিশ্চিত করুন যে
AndroidManifest.xml
যেকোন একটির অধীনে<meta-data android:name="android.app.shortcuts" android:resource=”@xml/shortcuts” />
অন্তর্ভুক্ত রয়েছে:-
<application>
ট্যাগ - লঞ্চার
<activity>
ট্যাগ
-
-
shortcuts.xml
এ<shortcuts>
উপাদানের ভিতরে<capability>
উপাদানটি রাখুন
অ্যাপ অ্যাকশন টেস্ট লাইব্রেরি নির্ভরতা যোগ করুন
settings.gradle
এ প্রোজেক্ট রিপোজিটরির তালিকায় Google সংগ্রহস্থল যোগ করুন:allprojects { repositories { … google() } }
অ্যাপ মডিউল
build.gradle
ফাইলে, AATL নির্ভরতা যোগ করুন:androidTestImplementation 'com.google.assistant.appactions:testing:1.0.0'
আপনার ডাউনলোড করা লাইব্রেরির সংস্করণ নম্বর ব্যবহার করা নিশ্চিত করুন।
ইন্টিগ্রেশন পরীক্ষা তৈরি করুন
app/src/androidTest
এর অধীনে নতুন পরীক্ষা তৈরি করুন। রোবোলেক্ট্রিক পরীক্ষার জন্য, এগুলিকেapp/src/test
অধীনে তৈরি করুন:কোটলিন
import android.content.Context import android.content.Intent import android.widget.TextView import androidx.test.core.app.ApplicationProvider import androidx.test.core.app.ActivityScenario import com.google.assistant.appactions.testing.aatl.AppActionsTestManager import com.google.assistant.appactions.testing.aatl.fulfillment.AppActionsFulfillmentIntentResult import com.google.assistant.appactions.testing.aatl.fulfillment.AppActionsFulfillmentResult import com.google.assistant.appactions.testing.aatl.fulfillment.FulfillmentType import com.google.common.collect.ImmutableMap import org.junit.Assert.assertEquals import org.junit.Before import org.junit.runner.RunWith import org.junit.Test import org.robolectric.RobolectricTestRunner … @Test fun IntentTestExample() { val intentParams = mapOf("feature" to "settings") val intentName = "actions.intent.OPEN_APP_FEATURE" val result = aatl.fulfill(intentName, intentParams) assertEquals(FulfillmentType.INTENT, result.getFulfillmentType()) val intentResult = result as AppActionsFulfillmentIntentResult val intent = intentResult.intent // Developer can choose to assert different relevant properties of the returned intent, such as the action, activity, package, scheme and so on assertEquals("youtube", intent.scheme) assertEquals("settings", intent.getStringExtra("featureParam")) assertEquals("actions.intent.OPEN_APP_FEATURE", intent.action) assertEquals("com.google.android.youtube/.MainActivity", intent.component.flattenToShortString()) assertEquals("com.google.myapp", intent.package) // Developers can choose to use returned Android Intent to launch and assess the activity. Below are examples for how it will look like for Robolectric and Espresso tests. // Please note that the below part is just a possible example of how Android tests are validating Activity functionality correctness for given Android Intent. // Robolectric example: val activity = Robolectric.buildActivity(MainActivity::class.java, intentResult.intent).create().resume().get() val title: TextView = activity.findViewById(R.id.startActivityTitle) assertEquals(title?.text?.toString(), "Launching…") }
জাভা
import android.content.Context; import android.content.Intent; import android.widget.TextView; import androidx.test.core.app.ApplicationProvider; import androidx.test.core.app.ActivityScenario; import com.google.assistant.appactions.testing.aatl.AppActionsTestManager; import com.google.assistant.appactions.testing.aatl.fulfillment.AppActionsFulfillmentIntentResult; import com.google.assistant.appactions.testing.aatl.fulfillment.AppActionsFulfillmentResult; import com.google.assistant.appactions.testing.aatl.fulfillment.FulfillmentType; import com.google.common.collect.ImmutableMap; import org.junit.Assert.assertEquals; import org.junit.Before; import org.junit.runner.RunWith; import org.junit.Test; import org.robolectric.RobolectricTestRunner; ... @Test public void IntentTestExample() throws Exception { Map<String, String> intentParams = ImmutableMap.of("feature", "settings"); String intentName = "actions.intent.OPEN_APP_FEATURE"; AppActionsFulfillmentResult result = aatl.fulfill(intentName, intentParams); assertEquals(FulfillmentType.INTENT, result.getFulfillmentType()); AppActionsFulfillmentIntentResult intentResult = (AppActionsFulfillmentIntentResult) result; Intent intent = intentResult.getIntent(); // Developer can choose to assert different relevant properties of the returned intent, such as the action, activity, package, or scheme assertEquals("settings", intent.getStringExtra("featureParam")); assertEquals("actions.intent.OPEN_APP_FEATURE", intent.getAction()); assertEquals("com.google.android.youtube/.MainActivity", intent.getComponent().flattenToShortString()); assertEquals("com.google.myapp", intent.getPackage()); // Developers can choose to use returned Android Intent to launch and assess the activity. Below are examples for how it will look like for Robolectric and Espresso tests. // Please note that the below part is just a possible example of how Android tests are validating Activity functionality correctness for given Android Intent. // Robolectric example: MainActivity activity = Robolectric.buildActivity(MainActivity.class,intentResult.intent).create().resume().get(); TextView title: TextView = activity.findViewById(R.id.startActivityTitle) assertEquals(title?.getText()?.toString(), "Launching…") }
আপনি যদি Espresso ব্যবহার করেন, তাহলে AATL ফলাফলের উপর ভিত্তি করে আপনি কীভাবে অ্যাক্টিভিটি চালু করবেন তা আপনাকে পরিবর্তন করতে হবে।
ActivityScenario
পদ্ধতি ব্যবহার করে Espresso-এর জন্য এখানে একটি উদাহরণ দেওয়া হল:কোটলিন
ActivityScenario.launch<MainActivity>(intentResult.intent); Espresso.onView(ViewMatchers.withId(R.id.startActivityTitle)) .check(ViewAssertions.matches(ViewMatchers.withText("Launching…")))
জাভা
ActivityScenario.launch<MainActivity>(intentResult.intent); Espresso.onView(ViewMatchers.withId(R.id.startActivityTitle)) .check(ViewAssertions.matches(ViewMatchers.withText("Launching…")))
প্যারামিটার ম্যাপিংয়ের নাম এবং মূল বৈশিষ্ট্যগুলি BII-এর পরামিতিগুলির সাথে মেলে৷ উদাহরণ স্বরূপ,
exercisePlan.forExercise.name
GET_EXERCISE_PLAN
এর প্যারামিটারের ডকুমেন্টেশনের সাথে মেলে।অ্যান্ড্রয়েড কনটেক্সট প্যারামিটার দিয়ে এপিআই ইনস্ট্যান্স ইনস্ট্যান্টিয়েট করুন (
ApplicationProvider
বাInstrumentationRegistry
থেকে প্রাপ্ত):- একক মডিউল অ্যাপ আর্কিটেকচার:
কোটলিন
private lateinit var aatl: AppActionsTestManager @Before fun init() { val appContext = ApplicationProvider.getApplicationContext() aatl = AppActionsTestManager(appContext) }
জাভা
private AppActionsTestManager aatl; @Before public void init() { Context appContext = ApplicationProvider.getApplicationContext(); aatl = new AppActionsTestManager(appContext); }
- মাল্টি-মডিউল অ্যাপ আর্কিটেকচার:
কোটলিন
private lateinit var aatl: AppActionsTestManager @Before fun init() { val appContext = ApplicationProvider.getApplicationContext() val lookupPackages = listOf("com.myapp.mainapp", "com.myapp.resources") aatl = AppActionsTestManager(appContext, lookupPackages) }
জাভা
private AppActionsTestManager aatl; @Before public void init() throws Exception { Context appContext = ApplicationProvider.getApplicationContext(); List<String> lookupPackages = Arrays.asList("com.myapp.mainapp","com.myapp.resources"); aatl = new AppActionsTestManager(appContext, Optional.of(lookupPackages)); }
এপিআই-এর
fulfill
পদ্ধতি চালান এবংAppActionsFulfillmentResult
অবজেক্ট পান।
দাবী সঞ্চালন
অ্যাপ অ্যাকশন টেস্ট লাইব্রেরি জাহির করার প্রস্তাবিত উপায় হল:
-
AppActionsFulfillmentResult
এর পরিপূর্ণতার ধরন জাহির করুন। অপ্রত্যাশিত BII অনুরোধের ক্ষেত্রে অ্যাপটি কীভাবে আচরণ করে তা পরীক্ষা করার জন্য এটিFulfillmentType.INTENT
, বাFulfillmentType.UNFULFILLED
হতে হবে। - পূর্ণতার 2টি স্বাদ রয়েছে:
INTENT
এবংDEEPLINK
পূর্ণতা।- সাধারণত, বিকাশকারী লাইব্রেরি ট্রিগার করার মাধ্যমে যেটি পূরণ করছে তা
shortcuts.xml
এ অভিপ্রায় ট্যাগ দেখেINTENT
এবংDEEPLINK
পূরণের মধ্যে পার্থক্য করতে পারে। - যদি অভিপ্রায় ট্যাগের অধীনে একটি url-টেমপ্লেট ট্যাগ থাকে, তাহলে এটি নির্দেশ করে যে
DEEPLINK
এই অভিপ্রায় পূরণ করে। - যদি ফলাফলের অভিপ্রায়ের
getData()
পদ্ধতিটি একটি নন-নাল অবজেক্ট প্রদান করে, তাহলে এটিDEEPLINK
পূর্ণতাও নির্দেশ করে। একইভাবে, যদিgetData
null
ফেরত দেয় তবে এর অর্থ হল এটি একটিINTENT
পূর্ণতা।
- সাধারণত, বিকাশকারী লাইব্রেরি ট্রিগার করার মাধ্যমে যেটি পূরণ করছে তা
-
INTENT
ক্ষেত্রে,AppActionsIntentFulfillmentResult
এAppActionsFulfillmentResult
টাইপকাস্ট করুন,getIntent
পদ্ধতিতে কল করে Android ইন্টেন্ট আনুন এবং নিম্নলিখিতগুলির মধ্যে একটি করুন:- অ্যান্ড্রয়েড ইন্টেন্টের স্বতন্ত্র ক্ষেত্রগুলি জাহির করুন।
- intent.getData.getHost পদ্ধতির মাধ্যমে অ্যাক্সেস করা একটি অভিপ্রায়ের uri দাবি করুন।
-
DEEPLINK
ক্ষেত্রে,AppActionsIntentFulfillmentResult
এAppActionsFulfillmentResult
টাইপকাস্ট করুন (উপরেরINTENT
দৃশ্যের মতো),getIntent
পদ্ধতিতে কল করে Android ইন্টেন্ট আনুন এবং ডিপলিংক url (intent.getData.getHost
এর মাধ্যমে অ্যাক্সেস করা হয়েছে) নিশ্চিত করুন। -
INTENT
এবংDEEPLINK
উভয়ের জন্য, আপনি নির্বাচিত অ্যান্ড্রয়েড টেস্টিং ফ্রেমওয়ার্কের সাথে অ্যাক্টিভিটি আরম্ভ করতে ফলাফলের উদ্দেশ্য ব্যবহার করতে পারেন।
আন্তর্জাতিকীকরণ
আপনার অ্যাপে একাধিক লোকেল থাকলে, আপনি একটি নির্দিষ্ট লোকেল আন্ডার-টেস্ট চালানোর জন্য পরীক্ষা কনফিগার করতে পারেন। বিকল্পভাবে, আপনি সরাসরি লোকেল পরিবর্তন করতে পারেন:
কোটলিন
import android.content.res.Configuration import java.util.Locale ... val newLocale = Locale("es") val conf = context.resources.configuration conf = Configuration(conf) conf.setLocale(newLocale)
জাভা
Locale newLocale = new Locale("es"); Configuration conf = context.getResources().getConfiguration(); conf = new Configuration(conf); conf.setLocale(newLocale);
এখানে স্প্যানিশ (ES) লোকেলের জন্য কনফিগার করা AATL পরীক্ষার একটি উদাহরণ রয়েছে:
কোটলিন
import com.google.common.truth.Truth.assertThat import org.junit.Assert.assertEquals import android.content.Context import android.content.res.Configuration import androidx.test.platform.app.InstrumentationRegistry import com.google.assistant.appactions.testing.aatl.AppActionsTestManager import com.google.assistant.appactions.testing.aatl.fulfillment.AppActionsFulfillmentIntentResult import com.google.assistant.appactions.testing.aatl.fulfillment.AppActionsFulfillmentResult import com.google.assistant.appactions.testing.aatl.fulfillment.FulfillmentType import com.google.common.collect.ImmutableMap import java.util.Locale import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import org.robolectric.RobolectricTestRunner @RunWith(RobolectricTestRunner::class) class ShortcutForDifferentLocaleTest { @Before fun setUp() { val context = InstrumentationRegistry.getInstrumentation().getContext() // change the device locale to 'es' val newLocale = Locale("es") val conf = context.resources.configuration conf = Configuration(conf) conf.setLocale(newLocale) val localizedContext = context.createConfigurationContext(conf) } @Test fun shortcutForDifferentLocale_succeeds() { val aatl = AppActionsTestManager(localizedContext) val intentName = "actions.intent.GET_EXERCISE_PLAN" val intentParams = ImmutableMap.of("exercisePlan.forExercise.name", "Running") val result = aatl.fulfill(intentName, intentParams) assertThat(result.getFulfillmentType()).isEqualTo(FulfillmentType.INTENT) val intentResult = result as AppActionsFulfillmentIntentResult assertThat(intentResult.getIntent().getData().toString()) .isEqualTo("myexercise://browse?plan=running_weekly") } }
জাভা
import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertEquals; import android.content.Context; import android.content.res.Configuration; import androidx.test.platform.app.InstrumentationRegistry; import com.google.assistant.appactions.testing.aatl.AppActionsTestManager; import com.google.assistant.appactions.testing.aatl.fulfillment.AppActionsFulfillmentIntentResult; import com.google.assistant.appactions.testing.aatl.fulfillment.AppActionsFulfillmentResult; import com.google.assistant.appactions.testing.aatl.fulfillment.FulfillmentType; import com.google.common.collect.ImmutableMap; import java.util.Locale; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; @Test public void shortcutForDifferentLocale_succeeds() throws Exception { Context context = InstrumentationRegistry.getInstrumentation().getContext(); // change the device locale to 'es' Locale newLocale = new Locale("es"); Configuration conf = context.getResources().getConfiguration(); conf = new Configuration(conf); conf.setLocale(newLocale); Context localizedContext = context.createConfigurationContext(conf); AppActionsTestManager aatl = new AppActionsTestManager(localizedContext); String intentName = "actions.intent.GET_EXERCISE_PLAN"; ImmutableMap<String, String> intentParams = ImmutableMap.of("exercisePlan.forExercise.name", "Running"); AppActionsFulfillmentResult result = aatl.fulfill(intentName, intentParams); assertThat(result.getFulfillmentType()).isEqualTo(FulfillmentType.INTENT); AppActionsFulfillmentIntentResult intentResult = (AppActionsFulfillmentIntentResult) result; assertThat(intentResult.getIntent().getData().toString()) .isEqualTo("myexercise://browse?plan=running_weekly"); }
সমস্যা সমাধান
আপনার ইন্টিগ্রেশন পরীক্ষা অপ্রত্যাশিতভাবে ব্যর্থ হলে, আপনি সতর্কতা বা ত্রুটি স্তরের বার্তা পেতে Android স্টুডিও লগক্যাট উইন্ডোতে AATL লগ বার্তাগুলি সন্ধান করতে পারেন। আপনি লাইব্রেরি থেকে আরও আউটপুট ক্যাপচার করতে লগিং স্তর বাড়াতে পারেন।
সীমাবদ্ধতা
এগুলি হল অ্যাপ অ্যাকশন টেস্ট লাইব্রেরির বর্তমান সীমাবদ্ধতা:
- AATL ন্যাচারাল ল্যাঙ্গুয়েজ আন্ডারস্ট্যান্ডিং (NLU) বা স্পিচ-টু-টেক্সট (STT) বৈশিষ্ট্য পরীক্ষা করে না।
- ডিফল্ট অ্যাপ মডিউল ছাড়া অন্য মডিউলে পরীক্ষা হলে AATL কাজ করে না।
- AATL শুধুমাত্র Android 7.0 "Nougat" (API লেভেল 24) এবং নতুন সংস্করণের সাথে সামঞ্জস্যপূর্ণ।