অ্যাপ অ্যাকশন টেস্ট লাইব্রেরি

অ্যাপ অ্যাকশন টেস্ট লাইব্রেরি (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> উপাদানটি রাখুন

অ্যাপ অ্যাকশন টেস্ট লাইব্রেরি নির্ভরতা যোগ করুন

  1. settings.gradle এ প্রোজেক্ট রিপোজিটরির তালিকায় Google সংগ্রহস্থল যোগ করুন:

        allprojects {
            repositories
    {
               

                google
    ()
           
    }
       
    }
  2. অ্যাপ মডিউল build.gradle ফাইলে, AATL নির্ভরতা যোগ করুন:

        androidTestImplementation 'com.google.assistant.appactions:testing:1.0.0'

    আপনার ডাউনলোড করা লাইব্রেরির সংস্করণ নম্বর ব্যবহার করা নিশ্চিত করুন।

ইন্টিগ্রেশন পরীক্ষা তৈরি করুন

  1. 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…")))
       
  2. প্যারামিটার ম্যাপিংয়ের নাম এবং মূল বৈশিষ্ট্যগুলি BII-এর পরামিতিগুলির সাথে মেলে৷ উদাহরণ স্বরূপ, exercisePlan.forExercise.name GET_EXERCISE_PLAN এর প্যারামিটারের ডকুমেন্টেশনের সাথে মেলে।

  3. অ্যান্ড্রয়েড কনটেক্সট প্যারামিটার দিয়ে এপিআই ইনস্ট্যান্স ইনস্ট্যান্টিয়েট করুন ( 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));
         
    }
       
     
  4. এপিআই-এর fulfill পদ্ধতি চালান এবং AppActionsFulfillmentResult অবজেক্ট পান।

দাবী সঞ্চালন

অ্যাপ অ্যাকশন টেস্ট লাইব্রেরি জাহির করার প্রস্তাবিত উপায় হল:

  1. AppActionsFulfillmentResult এর পরিপূর্ণতার ধরন জাহির করুন। অপ্রত্যাশিত BII অনুরোধের ক্ষেত্রে অ্যাপটি কীভাবে আচরণ করে তা পরীক্ষা করার জন্য এটি FulfillmentType.INTENT , বা FulfillmentType.UNFULFILLED হতে হবে।
  2. পূর্ণতার 2টি স্বাদ রয়েছে: INTENT এবং DEEPLINK পূর্ণতা।
    • সাধারণত, বিকাশকারী লাইব্রেরি ট্রিগার করার মাধ্যমে যেটি পূরণ করছে তা shortcuts.xml এ অভিপ্রায় ট্যাগ দেখে INTENT এবং DEEPLINK পূরণের মধ্যে পার্থক্য করতে পারে।
    • যদি অভিপ্রায় ট্যাগের অধীনে একটি url-টেমপ্লেট ট্যাগ থাকে, তাহলে এটি নির্দেশ করে যে DEEPLINK এই অভিপ্রায় পূরণ করে।
    • যদি ফলাফলের অভিপ্রায়ের getData() পদ্ধতিটি একটি নন-নাল অবজেক্ট প্রদান করে, তাহলে এটি DEEPLINK পূর্ণতাও নির্দেশ করে। একইভাবে, যদি getData null ফেরত দেয় তবে এর অর্থ হল এটি একটি INTENT পূর্ণতা।
  3. INTENT ক্ষেত্রে, AppActionsIntentFulfillmentResultAppActionsFulfillmentResult টাইপকাস্ট করুন, getIntent পদ্ধতিতে কল করে Android ইন্টেন্ট আনুন এবং নিম্নলিখিতগুলির মধ্যে একটি করুন:
    • অ্যান্ড্রয়েড ইন্টেন্টের স্বতন্ত্র ক্ষেত্রগুলি জাহির করুন।
    • intent.getData.getHost পদ্ধতির মাধ্যমে অ্যাক্সেস করা একটি অভিপ্রায়ের uri দাবি করুন।
  4. DEEPLINK ক্ষেত্রে, AppActionsIntentFulfillmentResultAppActionsFulfillmentResult টাইপকাস্ট করুন (উপরের INTENT দৃশ্যের মতো), getIntent পদ্ধতিতে কল করে Android ইন্টেন্ট আনুন এবং ডিপলিংক url ( intent.getData.getHost এর মাধ্যমে অ্যাক্সেস করা হয়েছে) নিশ্চিত করুন।
  5. 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> উপাদানটি রাখুন

অ্যাপ অ্যাকশন টেস্ট লাইব্রেরি নির্ভরতা যোগ করুন

  1. settings.gradle এ প্রোজেক্ট রিপোজিটরির তালিকায় Google সংগ্রহস্থল যোগ করুন:

        allprojects {
            repositories
    {
               

                google
    ()
           
    }
       
    }
  2. অ্যাপ মডিউল build.gradle ফাইলে, AATL নির্ভরতা যোগ করুন:

        androidTestImplementation 'com.google.assistant.appactions:testing:1.0.0'

    আপনার ডাউনলোড করা লাইব্রেরির সংস্করণ নম্বর ব্যবহার করা নিশ্চিত করুন।

ইন্টিগ্রেশন পরীক্ষা তৈরি করুন

  1. 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…")))
       
  2. প্যারামিটার ম্যাপিংয়ের নাম এবং মূল বৈশিষ্ট্যগুলি BII-এর পরামিতিগুলির সাথে মেলে৷ উদাহরণ স্বরূপ, exercisePlan.forExercise.name GET_EXERCISE_PLAN এর প্যারামিটারের ডকুমেন্টেশনের সাথে মেলে।

  3. অ্যান্ড্রয়েড কনটেক্সট প্যারামিটার দিয়ে এপিআই ইনস্ট্যান্স ইনস্ট্যান্টিয়েট করুন ( 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));
         
    }
       
     
  4. এপিআই-এর fulfill পদ্ধতি চালান এবং AppActionsFulfillmentResult অবজেক্ট পান।

দাবী সঞ্চালন

অ্যাপ অ্যাকশন টেস্ট লাইব্রেরি জাহির করার প্রস্তাবিত উপায় হল:

  1. AppActionsFulfillmentResult এর পরিপূর্ণতার ধরন জাহির করুন। অপ্রত্যাশিত BII অনুরোধের ক্ষেত্রে অ্যাপটি কীভাবে আচরণ করে তা পরীক্ষা করার জন্য এটি FulfillmentType.INTENT , বা FulfillmentType.UNFULFILLED হতে হবে।
  2. পূর্ণতার 2টি স্বাদ রয়েছে: INTENT এবং DEEPLINK পূর্ণতা।
    • সাধারণত, বিকাশকারী লাইব্রেরি ট্রিগার করার মাধ্যমে যেটি পূরণ করছে তা shortcuts.xml এ অভিপ্রায় ট্যাগ দেখে INTENT এবং DEEPLINK পূরণের মধ্যে পার্থক্য করতে পারে।
    • যদি অভিপ্রায় ট্যাগের অধীনে একটি url-টেমপ্লেট ট্যাগ থাকে, তাহলে এটি নির্দেশ করে যে DEEPLINK এই অভিপ্রায় পূরণ করে।
    • যদি ফলাফলের অভিপ্রায়ের getData() পদ্ধতিটি একটি নন-নাল অবজেক্ট প্রদান করে, তাহলে এটি DEEPLINK পূর্ণতাও নির্দেশ করে। একইভাবে, যদি getData null ফেরত দেয় তবে এর অর্থ হল এটি একটি INTENT পূর্ণতা।
  3. INTENT ক্ষেত্রে, AppActionsIntentFulfillmentResultAppActionsFulfillmentResult টাইপকাস্ট করুন, getIntent পদ্ধতিতে কল করে Android ইন্টেন্ট আনুন এবং নিম্নলিখিতগুলির মধ্যে একটি করুন:
    • অ্যান্ড্রয়েড ইন্টেন্টের স্বতন্ত্র ক্ষেত্রগুলি জাহির করুন।
    • intent.getData.getHost পদ্ধতির মাধ্যমে অ্যাক্সেস করা একটি অভিপ্রায়ের uri দাবি করুন।
  4. DEEPLINK ক্ষেত্রে, AppActionsIntentFulfillmentResultAppActionsFulfillmentResult টাইপকাস্ট করুন (উপরের INTENT দৃশ্যের মতো), getIntent পদ্ধতিতে কল করে Android ইন্টেন্ট আনুন এবং ডিপলিংক url ( intent.getData.getHost এর মাধ্যমে অ্যাক্সেস করা হয়েছে) নিশ্চিত করুন।
  5. 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> উপাদানটি রাখুন

অ্যাপ অ্যাকশন টেস্ট লাইব্রেরি নির্ভরতা যোগ করুন

  1. settings.gradle এ প্রোজেক্ট রিপোজিটরির তালিকায় Google সংগ্রহস্থল যোগ করুন:

        allprojects {
            repositories
    {
               

                google
    ()
           
    }
       
    }
  2. অ্যাপ মডিউল build.gradle ফাইলে, AATL নির্ভরতা যোগ করুন:

        androidTestImplementation 'com.google.assistant.appactions:testing:1.0.0'

    আপনার ডাউনলোড করা লাইব্রেরির সংস্করণ নম্বর ব্যবহার করা নিশ্চিত করুন।

ইন্টিগ্রেশন পরীক্ষা তৈরি করুন

  1. 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…")))
       
  2. প্যারামিটার ম্যাপিংয়ের নাম এবং মূল বৈশিষ্ট্যগুলি BII-এর পরামিতিগুলির সাথে মেলে৷ উদাহরণ স্বরূপ, exercisePlan.forExercise.name GET_EXERCISE_PLAN এর প্যারামিটারের ডকুমেন্টেশনের সাথে মেলে।

  3. অ্যান্ড্রয়েড কনটেক্সট প্যারামিটার দিয়ে এপিআই ইনস্ট্যান্স ইনস্ট্যান্টিয়েট করুন ( 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));
         
    }
       
     
  4. এপিআই-এর fulfill পদ্ধতি চালান এবং AppActionsFulfillmentResult অবজেক্ট পান।

দাবী সঞ্চালন

অ্যাপ অ্যাকশন টেস্ট লাইব্রেরি জাহির করার প্রস্তাবিত উপায় হল:

  1. AppActionsFulfillmentResult এর পরিপূর্ণতার ধরন জাহির করুন। অপ্রত্যাশিত BII অনুরোধের ক্ষেত্রে অ্যাপটি কীভাবে আচরণ করে তা পরীক্ষা করার জন্য এটি FulfillmentType.INTENT , বা FulfillmentType.UNFULFILLED হতে হবে।
  2. পূর্ণতার 2টি স্বাদ রয়েছে: INTENT এবং DEEPLINK পূর্ণতা।
    • সাধারণত, বিকাশকারী লাইব্রেরি ট্রিগার করার মাধ্যমে যেটি পূরণ করছে তা shortcuts.xml এ অভিপ্রায় ট্যাগ দেখে INTENT এবং DEEPLINK পূরণের মধ্যে পার্থক্য করতে পারে।
    • যদি অভিপ্রায় ট্যাগের অধীনে একটি url-টেমপ্লেট ট্যাগ থাকে, তাহলে এটি নির্দেশ করে যে DEEPLINK এই অভিপ্রায় পূরণ করে।
    • যদি ফলাফলের অভিপ্রায়ের getData() পদ্ধতিটি একটি নন-নাল অবজেক্ট প্রদান করে, তাহলে এটি DEEPLINK পূর্ণতাও নির্দেশ করে। একইভাবে, যদি getData null ফেরত দেয় তবে এর অর্থ হল এটি একটি INTENT পূর্ণতা।
  3. INTENT ক্ষেত্রে, AppActionsIntentFulfillmentResultAppActionsFulfillmentResult টাইপকাস্ট করুন, getIntent পদ্ধতিতে কল করে Android ইন্টেন্ট আনুন এবং নিম্নলিখিতগুলির মধ্যে একটি করুন:
    • অ্যান্ড্রয়েড ইন্টেন্টের স্বতন্ত্র ক্ষেত্রগুলি জাহির করুন।
    • intent.getData.getHost পদ্ধতির মাধ্যমে অ্যাক্সেস করা একটি অভিপ্রায়ের uri দাবি করুন।
  4. DEEPLINK ক্ষেত্রে, AppActionsIntentFulfillmentResultAppActionsFulfillmentResult টাইপকাস্ট করুন (উপরের INTENT দৃশ্যের মতো), getIntent পদ্ধতিতে কল করে Android ইন্টেন্ট আনুন এবং ডিপলিংক url ( intent.getData.getHost এর মাধ্যমে অ্যাক্সেস করা হয়েছে) নিশ্চিত করুন।
  5. 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> উপাদানটি রাখুন

অ্যাপ অ্যাকশন টেস্ট লাইব্রেরি নির্ভরতা যোগ করুন

  1. settings.gradle এ প্রোজেক্ট রিপোজিটরির তালিকায় Google সংগ্রহস্থল যোগ করুন:

        allprojects {
            repositories
    {
               

                google
    ()
           
    }
       
    }
  2. অ্যাপ মডিউল build.gradle ফাইলে, AATL নির্ভরতা যোগ করুন:

        androidTestImplementation 'com.google.assistant.appactions:testing:1.0.0'

    আপনার ডাউনলোড করা লাইব্রেরির সংস্করণ নম্বর ব্যবহার করা নিশ্চিত করুন।

ইন্টিগ্রেশন পরীক্ষা তৈরি করুন

  1. 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…")))
       
  2. প্যারামিটার ম্যাপিংয়ের নাম এবং মূল বৈশিষ্ট্যগুলি BII-এর পরামিতিগুলির সাথে মেলে৷ উদাহরণ স্বরূপ, exercisePlan.forExercise.name GET_EXERCISE_PLAN এর প্যারামিটারের ডকুমেন্টেশনের সাথে মেলে।

  3. অ্যান্ড্রয়েড কনটেক্সট প্যারামিটার দিয়ে এপিআই ইনস্ট্যান্স ইনস্ট্যান্টিয়েট করুন ( 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));
         
    }
       
     
  4. এপিআই-এর fulfill পদ্ধতি চালান এবং AppActionsFulfillmentResult অবজেক্ট পান।

দাবী সঞ্চালন

অ্যাপ অ্যাকশন টেস্ট লাইব্রেরি জাহির করার প্রস্তাবিত উপায় হল:

  1. AppActionsFulfillmentResult এর পরিপূর্ণতার ধরন জাহির করুন। অপ্রত্যাশিত BII অনুরোধের ক্ষেত্রে অ্যাপটি কীভাবে আচরণ করে তা পরীক্ষা করার জন্য এটি FulfillmentType.INTENT , বা FulfillmentType.UNFULFILLED হতে হবে।
  2. পূর্ণতার 2টি স্বাদ রয়েছে: INTENT এবং DEEPLINK পূর্ণতা।
    • সাধারণত, বিকাশকারী লাইব্রেরি ট্রিগার করার মাধ্যমে যেটি পূরণ করছে তা shortcuts.xml এ অভিপ্রায় ট্যাগ দেখে INTENT এবং DEEPLINK পূরণের মধ্যে পার্থক্য করতে পারে।
    • যদি অভিপ্রায় ট্যাগের অধীনে একটি url-টেমপ্লেট ট্যাগ থাকে, তাহলে এটি নির্দেশ করে যে DEEPLINK এই অভিপ্রায় পূরণ করে।
    • যদি ফলাফলের অভিপ্রায়ের getData() পদ্ধতিটি একটি নন-নাল অবজেক্ট প্রদান করে, তাহলে এটি DEEPLINK পূর্ণতাও নির্দেশ করে। একইভাবে, যদি getData null ফেরত দেয় তবে এর অর্থ হল এটি একটি INTENT পূর্ণতা।
  3. INTENT ক্ষেত্রে, AppActionsIntentFulfillmentResultAppActionsFulfillmentResult টাইপকাস্ট করুন, getIntent পদ্ধতিতে কল করে Android ইন্টেন্ট আনুন এবং নিম্নলিখিতগুলির মধ্যে একটি করুন:
    • অ্যান্ড্রয়েড ইন্টেন্টের স্বতন্ত্র ক্ষেত্রগুলি জাহির করুন।
    • intent.getData.getHost পদ্ধতির মাধ্যমে অ্যাক্সেস করা একটি অভিপ্রায়ের uri দাবি করুন।
  4. DEEPLINK ক্ষেত্রে, AppActionsIntentFulfillmentResultAppActionsFulfillmentResult টাইপকাস্ট করুন (উপরের INTENT দৃশ্যের মতো), getIntent পদ্ধতিতে কল করে Android ইন্টেন্ট আনুন এবং ডিপলিংক url ( intent.getData.getHost এর মাধ্যমে অ্যাক্সেস করা হয়েছে) নিশ্চিত করুন।
  5. 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) এবং নতুন সংস্করণের সাথে সামঞ্জস্যপূর্ণ।