গেম লুপ পরীক্ষা দিয়ে শুরু করুন

গেমিং অ্যাপগুলো বিভিন্ন UI ফ্রেমওয়ার্কের উপর তৈরি হলে গেম টেস্টিং স্বয়ংক্রিয় করা কঠিন হতে পারে। গেম লুপ টেস্ট আপনাকে আপনার নেটিভ টেস্টগুলোকে Test Lab সাথে একীভূত করতে এবং আপনার নির্বাচিত ডিভাইসগুলোতে সহজেই সেগুলো চালাতে সাহায্য করে। একটি গেম লুপ টেস্ট আপনার গেমিং অ্যাপের মাধ্যমে পরীক্ষাটি চালায় এবং একই সাথে একজন আসল খেলোয়াড়ের কার্যকলাপ অনুকরণ করে। এই নির্দেশিকাটি আপনাকে দেখাবে কীভাবে একটি গেম লুপ টেস্ট চালাতে হয় এবং তারপর Firebase কনসোলে আপনার পরীক্ষার ফলাফল দেখতে ও পরিচালনা করতে হয়।

আপনার গেম ইঞ্জিনের উপর নির্ভর করে, আপনি একটি বা একাধিক লুপ ব্যবহার করে টেস্টগুলো বাস্তবায়ন করতে পারেন। একটি লুপ হলো আপনার গেমিং অ্যাপে টেস্টের একটি সম্পূর্ণ বা আংশিক চালনা। গেম লুপগুলো নিম্নলিখিত কাজে ব্যবহার করা যেতে পারে:

  • আপনার গেমের একটি লেভেল ঠিক সেভাবেই চালান, যেভাবে একজন সাধারণ ব্যবহারকারী খেলবে। আপনি ব্যবহারকারীর ইনপুট স্ক্রিপ্ট করতে পারেন, ব্যবহারকারীকে নিষ্ক্রিয় রাখতে পারেন, অথবা আপনার গেমে যুক্তিযুক্ত হলে ব্যবহারকারীর পরিবর্তে একটি এআই (AI) ব্যবহার করতে পারেন (যেমন, ধরুন আপনার একটি রেস কার গেমিং অ্যাপ আছে এবং তাতে আগে থেকেই একটি এআই যুক্ত করা আছে। সেক্ষেত্রে আপনি সহজেই ব্যবহারকারীর ইনপুটের দায়িত্বে একজন এআই ড্রাইভারকে রাখতে পারেন)।
  • আপনার গেমটি সর্বোচ্চ কোয়ালিটি সেটিংসে চালিয়ে দেখুন ডিভাইসগুলো তা সাপোর্ট করে কিনা।
  • একটি প্রযুক্তিগত পরীক্ষা চালান (একাধিক শেডার কম্পাইল করুন, সেগুলো চালান, আউটপুট প্রত্যাশিত কিনা তা পরীক্ষা করুন, ইত্যাদি)।

আপনি একটি গেম লুপ টেস্ট একটিমাত্র টেস্ট ডিভাইসে, একাধিক টেস্ট ডিভাইসে, অথবা Test Lab চালাতে পারেন। তবে, আমরা ভার্চুয়াল ডিভাইসে গেম লুপ টেস্ট চালানোর পরামর্শ দিই না, কারণ সেগুলোর গ্রাফিক্স ফ্রেম রেট ফিজিক্যাল ডিভাইসের তুলনায় কম থাকে।

শুরু করার আগে

একটি টেস্ট বাস্তবায়ন করতে হলে, আপনাকে প্রথমে গেম লুপ টেস্টের জন্য আপনার অ্যাপটি কনফিগার করতে হবে।

  1. আপনার অ্যাপ ম্যানিফেস্টে, আপনার অ্যাক্টিভিটিতে একটি নতুন ইন্টেন্ট ফিল্টার যোগ করুন:

    <activity android:name=".MyActivity">
       <intent-filter>
           <action android:name="com.google.intent.action.TEST_LOOP"/>
           <category android:name="android.intent.category.DEFAULT"/>
           <data android:mimeType="application/javascript"/>
       </intent-filter>
       <intent-filter>
          ... (other intent filters here)
       </intent-filter>
    </activity>

    এর মাধ্যমে Test Lab একটি নির্দিষ্ট ইন্টেন্ট দ্বারা ট্রিগার করে আপনার গেমটি চালু করতে পারে।

  2. আপনার কোডে (আমরা onCreate মেথড ডিক্লারেশনের ভিতরে যোগ করার পরামর্শ দিই) নিম্নলিখিতটি যোগ করুন:

    Kotlin

    val launchIntent = intent
    if (launchIntent.action == "com.google.intent.action.TEST_LOOP") {
        val scenario = launchIntent.getIntExtra("scenario", 0)
        // Code to handle your game loop here
    }

    Java

    Intent launchIntent = getIntent();
    if(launchIntent.getAction().equals("com.google.intent.action.TEST_LOOP")) {
        int scenario = launchIntent.getIntExtra("scenario", 0);
        // Code to handle your game loop here
    }

    এর ফলে আপনার অ্যাক্টিভিটি যে ইন্টেন্টটি চালু করে, তা যাচাই করতে পারে। আপনি চাইলে এই কোডটি পরেও যোগ করতে পারেন (যেমন, আপনার গেম ইঞ্জিন প্রাথমিকভাবে লোড করার পরে)।

  3. সুপারিশকৃত: পরীক্ষার শেষে যোগ করুন:

    Kotlin

    yourActivity.finish()

    Java

    yourActivity.finish();

    গেম লুপ টেস্টটি সম্পূর্ণ হলে এটি আপনার অ্যাপটি বন্ধ করে দেয়। পরবর্তী লুপ শুরু করার জন্য এই টেস্টটি আপনার অ্যাপের UI ফ্রেমওয়ার্কের উপর নির্ভর করে, এবং অ্যাপটি বন্ধ করে দিলে ফ্রেমওয়ার্কটি জানিয়ে দেয় যে টেস্টটি শেষ হয়েছে।

একটি গেম লুপ পরীক্ষা তৈরি করুন এবং চালান

গেম লুপ টেস্টের জন্য আপনার অ্যাপ কনফিগার করার পর, আপনি সাথে সাথেই একটি টেস্ট তৈরি করে আপনার গেমিং অ্যাপে তা চালাতে পারবেন। আপনি Firebase কনসোল বা জিক্লাউড কমান্ড লাইন ইন্টারফেস (CLI) ব্যবহার করে Test Lab , অথবা টেস্ট লুপ ম্যানেজার ব্যবহার করে স্থানীয় ডিভাইসে টেস্টটি চালাতে পারেন।

স্থানীয় ডিভাইসে চালান

Test Lab -এর টেস্ট লুপ ম্যানেজার একটি ওপেন সোর্স অ্যাপ, যা আপনাকে গেম লুপ টেস্ট ইন্টিগ্রেট করতে এবং আপনার লোকাল ডিভাইসে সেগুলো চালাতে সাহায্য করে। এটি আপনার কোয়ালিটি অ্যাসিওরেন্স টিমকেও তাদের ডিভাইসে একই গেম লুপগুলো চালানোর সুযোগ দেয়।

টেস্ট লুপ ম্যানেজার ব্যবহার করে স্থানীয় ডিভাইসে একটি পরীক্ষা চালানোর জন্য:

  1. ফোন বা ট্যাবলেটে টেস্ট লুপ ম্যানেজার ডাউনলোড করুন এবং এটি ইনস্টল করতে নিম্নলিখিত কমান্ডটি চালান:
    adb install testloopmanager.apk
  2. আপনার ফোন বা ট্যাবলেটে Test Loop Apps অ্যাপটি খুলুন। অ্যাপটি আপনার ডিভাইসের সেইসব অ্যাপের একটি তালিকা দেখাবে যেগুলো গেম লুপের মাধ্যমে চালানো যায়। আপনি যদি এখানে আপনার গেমিং অ্যাপটি দেখতে না পান, তাহলে নিশ্চিত করুন যে আপনার ইন্টেন্ট ফিল্টারটি 'Before you begin' অংশের প্রথম ধাপে বর্ণিত ফিল্টারের সাথে মিলে যায়।
  3. আপনার গেমিং অ্যাপটি নির্বাচন করুন, তারপর আপনি যতগুলো লুপ চালাতে চান, সেই সংখ্যাটি নির্বাচন করুন। দ্রষ্টব্য: এই ধাপে, আপনি শুধু একটি লুপের পরিবর্তে কয়েকটি লুপের একটি উপসেট চালানোর বিকল্প বেছে নিতে পারেন। একই সাথে একাধিক লুপ চালানোর বিষয়ে আরও তথ্যের জন্য, ঐচ্ছিক বৈশিষ্ট্যসমূহ (Optional features ) দেখুন।
  4. 'Run test'-এ ক্লিক করুন। আপনার টেস্টটি সাথে সাথে চলতে শুরু করবে।

Test Lab চালান

আপনি Firebase কনসোল অথবা জিক্লাউড সিএলআই ব্যবহার করে Test Lab একটি গেম লুপ টেস্ট চালাতে পারেন। শুরু করার আগে, যদি আগে থেকে করা না থাকে, তাহলে Firebase কনসোলটি খুলুন এবং একটি প্রজেক্ট তৈরি করুন।

Firebase কনসোল ব্যবহার করুন

  1. Firebase কনসোলে, বাম প্যানেল থেকে Test Lab ক্লিক করুন।
  2. আপনার প্রথম পরীক্ষাটি চালান-এ ক্লিক করুন (অথবা যদি আপনার প্রজেক্টে আগে কোনো পরীক্ষা চালানো হয়ে থাকে, তাহলে একটি পরীক্ষা চালান )।
  3. পরীক্ষার ধরণ হিসেবে গেম লুপ নির্বাচন করুন, এবং তারপর কন্টিনিউ-তে ক্লিক করুন।
  4. ব্রাউজ-এ ক্লিক করুন, এবং তারপর আপনার অ্যাপের .apk ফাইলটি ব্রাউজ করে খুঁজে বের করুন। দ্রষ্টব্য: এই ধাপে, আপনি শুধু একটি লুপ চালানোর পরিবর্তে কয়েকটি লুপ একসাথে চালানোর বিকল্প বেছে নিতে পারেন। একসাথে একাধিক লুপ চালানো সম্পর্কে আরও তথ্যের জন্য, ঐচ্ছিক বৈশিষ্ট্যসমূহ (Optional features ) দেখুন।
  5. চালিয়ে যান-এ ক্লিক করুন।
  6. আপনার অ্যাপ পরীক্ষা করার জন্য ব্যবহারযোগ্য ফিজিক্যাল ডিভাইসগুলো নির্বাচন করুন।
  7. টেস্ট শুরু করতে ক্লিক করুন।

Firebase কনসোল দিয়ে কাজ শুরু করার বিষয়ে আরও তথ্যের জন্য, “Start testing with the Firebase console” দেখুন।

gcloud কমান্ড-লাইন (CLI) ব্যবহার করুন

  1. যদি এখনও না করে থাকেন, তাহলে Google Cloud SDK ডাউনলোড এবং ইনস্টল করুন।

  2. আপনার গুগল অ্যাকাউন্ট ব্যবহার করে gcloud CLI-তে সাইন ইন করুন:

    gcloud auth login

  3. gcloud-এ আপনার Firebase প্রজেক্টটি সেট করুন, যেখানে PROJECT_ID হলো আপনার Firebase প্রজেক্টের আইডি:

    gcloud config set project PROJECT_ID
    
  4. আপনার প্রথম পরীক্ষাটি চালান:

    gcloud firebase test android run \
     --type=game-loop --app=<var>path-to-apk</var> \
     --device model=herolte,version=23
    

gcloud CLI দিয়ে কাজ শুরু করার বিষয়ে আরও তথ্যের জন্য, “gcloud কমান্ড লাইন থেকে টেস্টিং শুরু করুন” দেখুন।

ঐচ্ছিক বৈশিষ্ট্য

Test Lab বেশ কিছু ঐচ্ছিক বৈশিষ্ট্য প্রদান করে, যা আপনাকে আপনার পরীক্ষাগুলোকে আরও কাস্টমাইজ করার সুযোগ দেয়; এর মধ্যে রয়েছে আউটপুট ডেটা লেখার ক্ষমতা, একাধিক গেম লুপের জন্য সমর্থন এবং সম্পর্কিত লুপগুলোর জন্য লেবেল ব্যবহারের সুবিধা।

আউটপুট ডেটা লিখুন

আপনার গেম লুপ টেস্ট launchIntent.getData() মেথডে নির্দিষ্ট করা একটি ফাইলে আউটপুট লিখতে পারে। টেস্টটি চালানোর পর, আপনি Firebase কনসোলের Test Lab সেকশন থেকে এই আউটপুট ডেটা অ্যাক্সেস করতে পারবেন ( গেম লুপ টেস্ট আউটপুট ফাইলের উদাহরণ দেখুন)।

Test Lab একটি ফাইল শেয়ার করা" অংশে বর্ণিত অ্যাপগুলোর মধ্যে ফাইল শেয়ার করার সর্বোত্তম পদ্ধতি অনুসরণ করে। আপনার অ্যাক্টিভিটির onCreate() মেথডে, যেখানে আপনার ইন্টেন্টটি অবস্থিত, আপনি নিম্নলিখিত কোডটি চালিয়ে আপনার ডেটা আউটপুট ফাইলটি পরীক্ষা করতে পারেন:

Kotlin

val launchIntent = intent
val logFile = launchIntent.data
logFile?.let {
    Log.i(TAG, "Log file ${it.encodedPath}")
    // ...
}

Java

Intent launchIntent = getIntent();
Uri logFile = launchIntent.getData();
if (logFile != null) {
    Log.i(TAG, "Log file " + logFile.getEncodedPath());
    // ...
}

আপনি যদি আপনার গেম অ্যাপের C++ অংশ থেকে ফাইলটিতে লিখতে চান, তাহলে ফাইল পাথের পরিবর্তে ফাইল ডেসক্রিপ্টরটি পাস করতে পারেন:

Kotlin

val launchIntent = intent
val logFile = launchIntent.data
var fd = -1
logFile?.let {
    Log.i(TAG, "Log file ${it.encodedPath}")
    fd = try {
        contentResolver
            .openAssetFileDescriptor(logFile, "w")!!
            .parcelFileDescriptor
            .fd
    } catch (e: FileNotFoundException) {
        e.printStackTrace()
        -1
    } catch (e: NullPointerException) {
        e.printStackTrace()
        -1
    }
}

// C++ code invoked here.
// native_function(fd);

Java

Intent launchIntent = getIntent();
Uri logFile = launchIntent.getData();
int fd = -1;
if (logFile != null) {
    Log.i(TAG, "Log file " + logFile.getEncodedPath());
    try {
        fd = getContentResolver()
                .openAssetFileDescriptor(logFile, "w")
                .getParcelFileDescriptor()
                .getFd();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
        fd = -1;
    } catch (NullPointerException e) {
        e.printStackTrace();
        fd = -1;
    }
}

// C++ code invoked here.
// native_function(fd);

সি++

#include <unistd.h>
JNIEXPORT void JNICALL
Java_my_package_name_MyActivity_native_function(JNIEnv *env, jclass type, jint log_file_descriptor) {
// The file descriptor needs to be duplicated.
int my_file_descriptor = dup(log_file_descriptor);
}

আউটপুট ফাইলের উদাহরণ

আপনি Firebase কনসোলের Test Lab বিভাগে গেম লুপ পরীক্ষার ফলাফল প্রদর্শন করতে আউটপুট ডেটা ফাইল (নীচের উদাহরণের মতো বিন্যাস করা) ব্যবহার করতে পারেন। /.../ হিসাবে দেখানো স্থানগুলিতে আপনার প্রয়োজনীয় যেকোনো কাস্টম ফিল্ড থাকতে পারে, যতক্ষণ না সেগুলি এই ফাইলে ব্যবহৃত অন্যান্য ফিল্ডের নামের সাথে সাংঘর্ষিক হয়:

{
  "name": "test name",
  "start_timestamp": 0, // Timestamp of the test start (in us).
                           Can be absolute or relative
  "driver_info": "...",
  "frame_stats": [
    {
      "timestamp": 1200000, // Timestamp at which this section was written
                               It contains value regarding the period
                               start_timestamp(0) -> this timestamp (1200000 us)
      "avg_frame_time": 15320, // Average time to render a frame in ns
      "nb_swap": 52, // Number of frame rendered
      "threads": [
        {
          "name": "physics",
          "Avg_time": 8030 // Average time spent in this thread per frame in us
        },
        {
          "name": "AI",
          "Avg_time": 2030 // Average time spent in this thread per frame in us
        }
      ],
      /.../ // Any custom field you want (vertices display on the screen, nb units …)
    },
    {
      // Next frame data here, same format as above
    }
  ],
  "loading_stats": [
    {
      "name": "assets_level_1",
      "total_time": 7850, // in us
      /.../
    },
    {
      "name": "victory_screen",
      "total_time": 554, // in us
      /.../
    }

  ],
  /.../, // You can add custom fields here
}

একাধিক গেম লুপ

আপনার অ্যাপে একাধিক গেম লুপ চালানো সুবিধাজনক হতে পারে। একটি লুপ হলো আপনার গেম অ্যাপের শুরু থেকে শেষ পর্যন্ত সম্পূর্ণ প্রক্রিয়াটি সম্পন্ন করা। উদাহরণস্বরূপ, যদি আপনার গেমে একাধিক লেভেল থাকে, তবে সবগুলো লেভেলের মধ্য দিয়ে যাওয়ার জন্য একটিমাত্র লুপ ব্যবহার না করে, আপনি প্রতিটি লেভেল চালু করার জন্য আলাদা গেম লুপ ব্যবহার করতে চাইতে পারেন। এভাবে, যদি আপনার অ্যাপটি ৩২ নম্বর লেভেলে ক্র্যাশ করে, তবে আপনি সরাসরি সেই গেম লুপটি চালু করে ক্র্যাশটি পুনরায় ঘটাতে এবং বাগ ফিক্স পরীক্ষা করতে পারবেন।

আপনার অ্যাপকে একই সাথে একাধিক লুপ চালানোর সুবিধা দিতে:

  • আপনি যদি টেস্ট লুপ ম্যানেজার ব্যবহার করে কোনো টেস্ট চালান:

    1. আপনার অ্যাপের ম্যানিফেস্টে, <application> এলিমেন্টের ভিতরে নিম্নলিখিত লাইনটি যোগ করুন:

      <meta-data
        android:name="com.google.test.loops"
        android:value="5" />

      এই লঞ্চ ইন্টেন্টটিতে টার্গেট লুপটি একটি ইন্টিজার প্যারামিটার হিসেবে থাকে। android:value ফিল্ডে, আপনি ১ থেকে ১০২৪ পর্যন্ত একটি ইন্টিজার উল্লেখ করতে পারেন (একটি একক টেস্টের জন্য অনুমোদিত লুপের সর্বোচ্চ সংখ্যা)। মনে রাখবেন যে লুপগুলোর ইন্ডেক্স ১ থেকে শুরু হয়, ০ থেকে নয়।

    2. টেস্ট লুপ ম্যানেজার অ্যাপে একটি সিলেকশন স্ক্রিন দেখা যায়, যেখান থেকে আপনি কোন লুপগুলো চালাতে চান তা নির্বাচন করতে পারেন। আপনি একাধিক লুপ নির্বাচন করলে, পূর্ববর্তী লুপটি সম্পূর্ণ হওয়ার পর প্রতিটি লুপ ক্রমানুসারে চালু হয়।

  • আপনি যদি Firebase কনসোল দিয়ে কোনো পরীক্ষা চালান, তাহলে Scenarios ফিল্ডে লুপ নম্বরের একটি তালিকা বা পরিসর লিখুন।

  • আপনি যদি gcloud CLI দিয়ে কোনো টেস্ট চালান, তাহলে --scenario-numbers ফ্ল্যাগটি ব্যবহার করে লুপ নম্বরগুলোর একটি তালিকা নির্দিষ্ট করুন। উদাহরণস্বরূপ, --scenario-numbers=1,3,5 ফ্ল্যাগটি ১, ৩ এবং ৫ নম্বর লুপগুলো চালাবে।

  • আপনি যদি C++ কোড লেখেন এবং আপনার লুপের আচরণ পরিবর্তন করতে চান, তাহলে আপনার নেটিভ C++ কোডে নিম্নলিখিত এক্সট্রাটি পাস করুন:

    Kotlin

    val launchIntent = intent
    val scenario = launchIntent.getIntExtra("scenario", 0)

    Java

    Intent launchIntent = getIntent();
    int scenario = launchIntent.getIntExtra("scenario", 0);

    এখন আপনি প্রাপ্ত int মানের উপর ভিত্তি করে আপনার লুপের আচরণ পরিবর্তন করতে পারবেন।

গেম লুপ লেবেল করুন

যখন আপনি আপনার গেম লুপগুলিকে এক বা একাধিক সিনারিও লেবেল দিয়ে চিহ্নিত করেন, তখন আপনি এবং আপনার QA টিম সহজেই সম্পর্কিত গেম লুপগুলির একটি সেট (যেমন, "সমস্ত কম্প্যাটিবিলিটি গেম লুপ") চালু করতে এবং সেগুলিকে একটি একক ম্যাট্রিক্সে পরীক্ষা করতে পারেন। আপনি আপনার নিজস্ব লেবেল তৈরি করতে পারেন অথবা Test Lab দ্বারা প্রদত্ত পূর্বনির্ধারিত লেবেলগুলি ব্যবহার করতে পারেন।

  • com.google.test.loops.player_experience : গেমটি খেলার সময় একজন প্রকৃত ব্যবহারকারীর অভিজ্ঞতা পুনরায় তৈরি করতে ব্যবহৃত ফর লুপ। এই লুপগুলির মাধ্যমে পরীক্ষার উদ্দেশ্য হলো এমন সমস্যাগুলি খুঁজে বের করা যা একজন প্রকৃত ব্যবহারকারী গেমটি খেলার সময় সম্মুখীন হতে পারেন।
  • com.google.test.loops.gpu_compatibility : জিপিইউ (GPU) সম্পর্কিত সমস্যা পরীক্ষা করার জন্য ব্যবহৃত ফর লুপ। এই লুপগুলির মাধ্যমে পরীক্ষার উদ্দেশ্য হলো এমন জিপিইউ কোড চালানো যা প্রোডাকশনে সঠিকভাবে নাও চলতে পারে, এবং এর মাধ্যমে হার্ডওয়্যার ও ড্রাইভারের সমস্যাগুলো উদ্ঘাটন করা।
  • com.google.test.loops.compatibility : ইনপুট/আউটপুট (I/O) এবং ওপেনএসএসএল (OpenSSL) সংক্রান্ত সমস্যাসহ বিভিন্ন ধরনের সামঞ্জস্যতার সমস্যা পরীক্ষা করার জন্য ব্যবহৃত ফর লুপ।
  • com.google.test.loops.performance : ডিভাইসের পারফরম্যান্স পরীক্ষা করার জন্য ব্যবহৃত ফর লুপ। উদাহরণস্বরূপ, একটি নতুন ডিভাইস কেমন আচরণ করে তা দেখার জন্য কোনো গেম সবচেয়ে জটিল গ্রাফিক্স সেটিংসে চালানো হতে পারে।

আপনার অ্যাপকে একই লেবেল সহ লুপ চালানোর অনুমতি দিতে:

  • আপনি যদি টেস্ট লুপ ম্যানেজার ব্যবহার করে কোনো টেস্ট চালান:

    1. আপনার অ্যাপের ম্যানিফেস্টে নিম্নলিখিত মেটা-ডেটা লাইনটি যোগ করুন এবং LABEL_NAME জায়গায় আপনার পছন্দের একটি লেবেল বসান:

      <meta-data
       android:name="com.google.test.loops.LABEL_NAME"
       android:value="1,3-5" />

      android:value ফিল্ডে, আপনি ১ থেকে ১০২৪ পর্যন্ত (একটি একক পরীক্ষার জন্য অনুমোদিত লুপের সর্বোচ্চ সংখ্যা) একটি পরিসীমা বা পূর্ণসংখ্যার সেট নির্দিষ্ট করতে পারেন, যা আপনি যে লুপগুলোকে লেবেল করতে চান সেগুলোকে নির্দেশ করে। মনে রাখবেন যে লুপগুলোর ইন্ডেক্সিং ১ থেকে শুরু হয়, ০ থেকে নয়। উদাহরণস্বরূপ, android:value="1,3-5" লুপ ১, ৩, ৪ এবং ৫-এ LABEL_NAME প্রয়োগ করে।

    2. টেস্ট লুপ ম্যানেজার অ্যাপে, লেবেল ফিল্ডে এক বা একাধিক লেবেল লিখুন।

  • আপনি যদি Firebase কনসোল দিয়ে কোনো পরীক্ষা চালান, তাহলে Labels ফিল্ডে এক বা একাধিক লেবেল লিখুন।

  • আপনি যদি gcloud CLI ব্যবহার করে কোনো পরীক্ষা চালান, তাহলে --scenario-labels ফ্ল্যাগটি ব্যবহার করে এক বা একাধিক সিনারিও লেবেল নির্দিষ্ট করুন (যেমন, --scenario-labels=performance,gpu )।

অ্যাপ লাইসেন্সিং সমর্থন

Test Lab সেইসব অ্যাপ সমর্থন করে যেগুলো গুগল প্লে-এর অ্যাপ লাইসেন্সিং পরিষেবা ব্যবহার করে। Test Lab দিয়ে আপনার অ্যাপ পরীক্ষা করার সময় সফলভাবে লাইসেন্সিং যাচাই করতে, আপনাকে অবশ্যই প্লে স্টোরের প্রোডাকশন চ্যানেলে আপনার অ্যাপটি প্রকাশ করতে হবে। Test Lab ব্যবহার করে আলফা বা বিটা চ্যানেলে আপনার অ্যাপ পরীক্ষা করতে, Test Lab আপনার অ্যাপ আপলোড করার আগে লাইসেন্সিং যাচাইটি সরিয়ে দিন।

পরিচিত সমস্যা

Test Lab গেম লুপ টেস্টগুলোতে নিম্নলিখিত জ্ঞাত সমস্যাগুলো রয়েছে:

  • কিছু ক্র্যাশ ব্যাকট্রেস সমর্থন করে না। উদাহরণস্বরূপ, কিছু রিলিজ বিল্ড prctl(PR_SET_DUMPABLE, 0) ব্যবহার করে debuggerd প্রসেসের আউটপুট দমন করতে পারে। আরও জানতে, debuggerd দেখুন।
  • ফাইল পারমিশন সংক্রান্ত ত্রুটির কারণে এপিআই লেভেল ১৯ বর্তমানে সমর্থিত নয়।
,

গেমিং অ্যাপগুলো বিভিন্ন UI ফ্রেমওয়ার্কের উপর তৈরি হলে গেম টেস্টিং স্বয়ংক্রিয় করা কঠিন হতে পারে। গেম লুপ টেস্ট আপনাকে আপনার নেটিভ টেস্টগুলোকে Test Lab সাথে একীভূত করতে এবং আপনার নির্বাচিত ডিভাইসগুলোতে সহজেই সেগুলো চালাতে সাহায্য করে। একটি গেম লুপ টেস্ট আপনার গেমিং অ্যাপের মাধ্যমে পরীক্ষাটি চালায় এবং একই সাথে একজন আসল খেলোয়াড়ের কার্যকলাপ অনুকরণ করে। এই নির্দেশিকাটি আপনাকে দেখাবে কীভাবে একটি গেম লুপ টেস্ট চালাতে হয় এবং তারপর Firebase কনসোলে আপনার পরীক্ষার ফলাফল দেখতে ও পরিচালনা করতে হয়।

আপনার গেম ইঞ্জিনের উপর নির্ভর করে, আপনি একটি বা একাধিক লুপ ব্যবহার করে টেস্টগুলো বাস্তবায়ন করতে পারেন। একটি লুপ হলো আপনার গেমিং অ্যাপে টেস্টের একটি সম্পূর্ণ বা আংশিক চালনা। গেম লুপগুলো নিম্নলিখিত কাজে ব্যবহার করা যেতে পারে:

  • আপনার গেমের একটি লেভেল ঠিক সেভাবেই চালান, যেভাবে একজন সাধারণ ব্যবহারকারী খেলবে। আপনি ব্যবহারকারীর ইনপুট স্ক্রিপ্ট করতে পারেন, ব্যবহারকারীকে নিষ্ক্রিয় রাখতে পারেন, অথবা আপনার গেমে যুক্তিযুক্ত হলে ব্যবহারকারীর পরিবর্তে একটি এআই (AI) ব্যবহার করতে পারেন (যেমন, ধরুন আপনার একটি রেস কার গেমিং অ্যাপ আছে এবং তাতে আগে থেকেই একটি এআই যুক্ত করা আছে। সেক্ষেত্রে আপনি সহজেই ব্যবহারকারীর ইনপুটের দায়িত্বে একজন এআই ড্রাইভারকে রাখতে পারেন)।
  • আপনার গেমটি সর্বোচ্চ কোয়ালিটি সেটিংসে চালিয়ে দেখুন ডিভাইসগুলো তা সাপোর্ট করে কিনা।
  • একটি প্রযুক্তিগত পরীক্ষা চালান (একাধিক শেডার কম্পাইল করুন, সেগুলো চালান, আউটপুট প্রত্যাশিত কিনা তা পরীক্ষা করুন, ইত্যাদি)।

আপনি একটি গেম লুপ টেস্ট একটিমাত্র টেস্ট ডিভাইসে, একাধিক টেস্ট ডিভাইসে, অথবা Test Lab চালাতে পারেন। তবে, আমরা ভার্চুয়াল ডিভাইসে গেম লুপ টেস্ট চালানোর পরামর্শ দিই না, কারণ সেগুলোর গ্রাফিক্স ফ্রেম রেট ফিজিক্যাল ডিভাইসের তুলনায় কম থাকে।

শুরু করার আগে

একটি টেস্ট বাস্তবায়ন করতে হলে, আপনাকে প্রথমে গেম লুপ টেস্টের জন্য আপনার অ্যাপটি কনফিগার করতে হবে।

  1. আপনার অ্যাপ ম্যানিফেস্টে, আপনার অ্যাক্টিভিটিতে একটি নতুন ইন্টেন্ট ফিল্টার যোগ করুন:

    <activity android:name=".MyActivity">
       <intent-filter>
           <action android:name="com.google.intent.action.TEST_LOOP"/>
           <category android:name="android.intent.category.DEFAULT"/>
           <data android:mimeType="application/javascript"/>
       </intent-filter>
       <intent-filter>
          ... (other intent filters here)
       </intent-filter>
    </activity>

    এর মাধ্যমে Test Lab একটি নির্দিষ্ট ইন্টেন্ট দ্বারা ট্রিগার করে আপনার গেমটি চালু করতে পারে।

  2. আপনার কোডে (আমরা onCreate মেথড ডিক্লারেশনের ভিতরে যোগ করার পরামর্শ দিই) নিম্নলিখিতটি যোগ করুন:

    Kotlin

    val launchIntent = intent
    if (launchIntent.action == "com.google.intent.action.TEST_LOOP") {
        val scenario = launchIntent.getIntExtra("scenario", 0)
        // Code to handle your game loop here
    }

    Java

    Intent launchIntent = getIntent();
    if(launchIntent.getAction().equals("com.google.intent.action.TEST_LOOP")) {
        int scenario = launchIntent.getIntExtra("scenario", 0);
        // Code to handle your game loop here
    }

    এর ফলে আপনার অ্যাক্টিভিটি যে ইন্টেন্টটি চালু করে, তা যাচাই করতে পারে। আপনি চাইলে এই কোডটি পরেও যোগ করতে পারেন (যেমন, আপনার গেম ইঞ্জিন প্রাথমিকভাবে লোড করার পরে)।

  3. সুপারিশকৃত: পরীক্ষার শেষে যোগ করুন:

    Kotlin

    yourActivity.finish()

    Java

    yourActivity.finish();

    গেম লুপ টেস্টটি সম্পূর্ণ হলে এটি আপনার অ্যাপটি বন্ধ করে দেয়। পরবর্তী লুপ শুরু করার জন্য এই টেস্টটি আপনার অ্যাপের UI ফ্রেমওয়ার্কের উপর নির্ভর করে, এবং অ্যাপটি বন্ধ করে দিলে ফ্রেমওয়ার্কটি জানিয়ে দেয় যে টেস্টটি শেষ হয়েছে।

একটি গেম লুপ পরীক্ষা তৈরি করুন এবং চালান

গেম লুপ টেস্টের জন্য আপনার অ্যাপ কনফিগার করার পর, আপনি সাথে সাথেই একটি টেস্ট তৈরি করে আপনার গেমিং অ্যাপে তা চালাতে পারবেন। আপনি Firebase কনসোল বা জিক্লাউড কমান্ড লাইন ইন্টারফেস (CLI) ব্যবহার করে Test Lab , অথবা টেস্ট লুপ ম্যানেজার ব্যবহার করে স্থানীয় ডিভাইসে টেস্টটি চালাতে পারেন।

স্থানীয় ডিভাইসে চালান

Test Lab -এর টেস্ট লুপ ম্যানেজার একটি ওপেন সোর্স অ্যাপ, যা আপনাকে গেম লুপ টেস্ট ইন্টিগ্রেট করতে এবং আপনার লোকাল ডিভাইসে সেগুলো চালাতে সাহায্য করে। এটি আপনার কোয়ালিটি অ্যাসিওরেন্স টিমকেও তাদের ডিভাইসে একই গেম লুপগুলো চালানোর সুযোগ দেয়।

টেস্ট লুপ ম্যানেজার ব্যবহার করে স্থানীয় ডিভাইসে একটি পরীক্ষা চালানোর জন্য:

  1. ফোন বা ট্যাবলেটে টেস্ট লুপ ম্যানেজার ডাউনলোড করুন এবং এটি ইনস্টল করতে নিম্নলিখিত কমান্ডটি চালান:
    adb install testloopmanager.apk
  2. আপনার ফোন বা ট্যাবলেটে Test Loop Apps অ্যাপটি খুলুন। অ্যাপটি আপনার ডিভাইসের সেইসব অ্যাপের একটি তালিকা দেখাবে যেগুলো গেম লুপের মাধ্যমে চালানো যায়। আপনি যদি এখানে আপনার গেমিং অ্যাপটি দেখতে না পান, তাহলে নিশ্চিত করুন যে আপনার ইন্টেন্ট ফিল্টারটি 'Before you begin' অংশের প্রথম ধাপে বর্ণিত ফিল্টারের সাথে মিলে যায়।
  3. আপনার গেমিং অ্যাপটি নির্বাচন করুন, তারপর আপনি যতগুলো লুপ চালাতে চান, সেই সংখ্যাটি নির্বাচন করুন। দ্রষ্টব্য: এই ধাপে, আপনি শুধু একটি লুপের পরিবর্তে কয়েকটি লুপের একটি উপসেট চালানোর বিকল্প বেছে নিতে পারেন। একই সাথে একাধিক লুপ চালানোর বিষয়ে আরও তথ্যের জন্য, ঐচ্ছিক বৈশিষ্ট্যসমূহ (Optional features ) দেখুন।
  4. 'Run test'-এ ক্লিক করুন। আপনার টেস্টটি সাথে সাথে চলতে শুরু করবে।

Test Lab চালান

আপনি Firebase কনসোল অথবা জিক্লাউড সিএলআই ব্যবহার করে Test Lab একটি গেম লুপ টেস্ট চালাতে পারেন। শুরু করার আগে, যদি আগে থেকে করা না থাকে, তাহলে Firebase কনসোলটি খুলুন এবং একটি প্রজেক্ট তৈরি করুন।

Firebase কনসোল ব্যবহার করুন

  1. Firebase কনসোলে, বাম প্যানেল থেকে Test Lab ক্লিক করুন।
  2. আপনার প্রথম পরীক্ষাটি চালান-এ ক্লিক করুন (অথবা যদি আপনার প্রজেক্টে আগে কোনো পরীক্ষা চালানো হয়ে থাকে, তাহলে একটি পরীক্ষা চালান )।
  3. পরীক্ষার ধরণ হিসেবে গেম লুপ নির্বাচন করুন, এবং তারপর কন্টিনিউ-তে ক্লিক করুন।
  4. ব্রাউজ-এ ক্লিক করুন, এবং তারপর আপনার অ্যাপের .apk ফাইলটি ব্রাউজ করে খুঁজে বের করুন। দ্রষ্টব্য: এই ধাপে, আপনি শুধু একটি লুপ চালানোর পরিবর্তে কয়েকটি লুপ একসাথে চালানোর বিকল্প বেছে নিতে পারেন। একসাথে একাধিক লুপ চালানো সম্পর্কে আরও তথ্যের জন্য, ঐচ্ছিক বৈশিষ্ট্যসমূহ (Optional features ) দেখুন।
  5. চালিয়ে যান-এ ক্লিক করুন।
  6. আপনার অ্যাপ পরীক্ষা করার জন্য ব্যবহারযোগ্য ফিজিক্যাল ডিভাইসগুলো নির্বাচন করুন।
  7. টেস্ট শুরু করতে ক্লিক করুন।

Firebase কনসোল দিয়ে কাজ শুরু করার বিষয়ে আরও তথ্যের জন্য, “Start testing with the Firebase console” দেখুন।

gcloud কমান্ড-লাইন (CLI) ব্যবহার করুন

  1. যদি এখনও না করে থাকেন, তাহলে Google Cloud SDK ডাউনলোড এবং ইনস্টল করুন।

  2. আপনার গুগল অ্যাকাউন্ট ব্যবহার করে gcloud CLI-তে সাইন ইন করুন:

    gcloud auth login

  3. gcloud-এ আপনার Firebase প্রজেক্টটি সেট করুন, যেখানে PROJECT_ID হলো আপনার Firebase প্রজেক্টের আইডি:

    gcloud config set project PROJECT_ID
    
  4. আপনার প্রথম পরীক্ষাটি চালান:

    gcloud firebase test android run \
     --type=game-loop --app=<var>path-to-apk</var> \
     --device model=herolte,version=23
    

gcloud CLI দিয়ে কাজ শুরু করার বিষয়ে আরও তথ্যের জন্য, “gcloud কমান্ড লাইন থেকে টেস্টিং শুরু করুন” দেখুন।

ঐচ্ছিক বৈশিষ্ট্য

Test Lab বেশ কিছু ঐচ্ছিক বৈশিষ্ট্য প্রদান করে, যা আপনাকে আপনার পরীক্ষাগুলোকে আরও কাস্টমাইজ করার সুযোগ দেয়; এর মধ্যে রয়েছে আউটপুট ডেটা লেখার ক্ষমতা, একাধিক গেম লুপের জন্য সমর্থন এবং সম্পর্কিত লুপগুলোর জন্য লেবেল ব্যবহারের সুবিধা।

আউটপুট ডেটা লিখুন

আপনার গেম লুপ টেস্ট launchIntent.getData() মেথডে নির্দিষ্ট করা একটি ফাইলে আউটপুট লিখতে পারে। টেস্টটি চালানোর পর, আপনি Firebase কনসোলের Test Lab সেকশন থেকে এই আউটপুট ডেটা অ্যাক্সেস করতে পারবেন ( গেম লুপ টেস্ট আউটপুট ফাইলের উদাহরণ দেখুন)।

Test Lab একটি ফাইল শেয়ার করা" অংশে বর্ণিত অ্যাপগুলোর মধ্যে ফাইল শেয়ার করার সর্বোত্তম পদ্ধতি অনুসরণ করে। আপনার অ্যাক্টিভিটির onCreate() মেথডে, যেখানে আপনার ইন্টেন্টটি অবস্থিত, আপনি নিম্নলিখিত কোডটি চালিয়ে আপনার ডেটা আউটপুট ফাইলটি পরীক্ষা করতে পারেন:

Kotlin

val launchIntent = intent
val logFile = launchIntent.data
logFile?.let {
    Log.i(TAG, "Log file ${it.encodedPath}")
    // ...
}

Java

Intent launchIntent = getIntent();
Uri logFile = launchIntent.getData();
if (logFile != null) {
    Log.i(TAG, "Log file " + logFile.getEncodedPath());
    // ...
}

আপনি যদি আপনার গেম অ্যাপের C++ অংশ থেকে ফাইলটিতে লিখতে চান, তাহলে ফাইল পাথের পরিবর্তে ফাইল ডেসক্রিপ্টরটি পাস করতে পারেন:

Kotlin

val launchIntent = intent
val logFile = launchIntent.data
var fd = -1
logFile?.let {
    Log.i(TAG, "Log file ${it.encodedPath}")
    fd = try {
        contentResolver
            .openAssetFileDescriptor(logFile, "w")!!
            .parcelFileDescriptor
            .fd
    } catch (e: FileNotFoundException) {
        e.printStackTrace()
        -1
    } catch (e: NullPointerException) {
        e.printStackTrace()
        -1
    }
}

// C++ code invoked here.
// native_function(fd);

Java

Intent launchIntent = getIntent();
Uri logFile = launchIntent.getData();
int fd = -1;
if (logFile != null) {
    Log.i(TAG, "Log file " + logFile.getEncodedPath());
    try {
        fd = getContentResolver()
                .openAssetFileDescriptor(logFile, "w")
                .getParcelFileDescriptor()
                .getFd();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
        fd = -1;
    } catch (NullPointerException e) {
        e.printStackTrace();
        fd = -1;
    }
}

// C++ code invoked here.
// native_function(fd);

সি++

#include <unistd.h>
JNIEXPORT void JNICALL
Java_my_package_name_MyActivity_native_function(JNIEnv *env, jclass type, jint log_file_descriptor) {
// The file descriptor needs to be duplicated.
int my_file_descriptor = dup(log_file_descriptor);
}

আউটপুট ফাইলের উদাহরণ

আপনি Firebase কনসোলের Test Lab বিভাগে গেম লুপ পরীক্ষার ফলাফল প্রদর্শন করতে আউটপুট ডেটা ফাইল (নীচের উদাহরণের মতো বিন্যাস করা) ব্যবহার করতে পারেন। /.../ হিসাবে দেখানো স্থানগুলিতে আপনার প্রয়োজনীয় যেকোনো কাস্টম ফিল্ড থাকতে পারে, যতক্ষণ না সেগুলি এই ফাইলে ব্যবহৃত অন্যান্য ফিল্ডের নামের সাথে সাংঘর্ষিক হয়:

{
  "name": "test name",
  "start_timestamp": 0, // Timestamp of the test start (in us).
                           Can be absolute or relative
  "driver_info": "...",
  "frame_stats": [
    {
      "timestamp": 1200000, // Timestamp at which this section was written
                               It contains value regarding the period
                               start_timestamp(0) -> this timestamp (1200000 us)
      "avg_frame_time": 15320, // Average time to render a frame in ns
      "nb_swap": 52, // Number of frame rendered
      "threads": [
        {
          "name": "physics",
          "Avg_time": 8030 // Average time spent in this thread per frame in us
        },
        {
          "name": "AI",
          "Avg_time": 2030 // Average time spent in this thread per frame in us
        }
      ],
      /.../ // Any custom field you want (vertices display on the screen, nb units …)
    },
    {
      // Next frame data here, same format as above
    }
  ],
  "loading_stats": [
    {
      "name": "assets_level_1",
      "total_time": 7850, // in us
      /.../
    },
    {
      "name": "victory_screen",
      "total_time": 554, // in us
      /.../
    }

  ],
  /.../, // You can add custom fields here
}

একাধিক গেম লুপ

আপনার অ্যাপে একাধিক গেম লুপ চালানো সুবিধাজনক হতে পারে। একটি লুপ হলো আপনার গেম অ্যাপের শুরু থেকে শেষ পর্যন্ত সম্পূর্ণ প্রক্রিয়াটি সম্পন্ন করা। উদাহরণস্বরূপ, যদি আপনার গেমে একাধিক লেভেল থাকে, তবে সবগুলো লেভেলের মধ্য দিয়ে যাওয়ার জন্য একটিমাত্র লুপ ব্যবহার না করে, আপনি প্রতিটি লেভেল চালু করার জন্য আলাদা গেম লুপ ব্যবহার করতে চাইতে পারেন। এভাবে, যদি আপনার অ্যাপটি ৩২ নম্বর লেভেলে ক্র্যাশ করে, তবে আপনি সরাসরি সেই গেম লুপটি চালু করে ক্র্যাশটি পুনরায় ঘটাতে এবং বাগ ফিক্স পরীক্ষা করতে পারবেন।

আপনার অ্যাপকে একই সাথে একাধিক লুপ চালানোর সুবিধা দিতে:

  • আপনি যদি টেস্ট লুপ ম্যানেজার ব্যবহার করে কোনো টেস্ট চালান:

    1. আপনার অ্যাপের ম্যানিফেস্টে, <application> এলিমেন্টের ভিতরে নিম্নলিখিত লাইনটি যোগ করুন:

      <meta-data
        android:name="com.google.test.loops"
        android:value="5" />

      এই লঞ্চ ইন্টেন্টটিতে টার্গেট লুপটি একটি ইন্টিজার প্যারামিটার হিসেবে থাকে। android:value ফিল্ডে, আপনি ১ থেকে ১০২৪ পর্যন্ত একটি ইন্টিজার উল্লেখ করতে পারেন (একটি একক টেস্টের জন্য অনুমোদিত লুপের সর্বোচ্চ সংখ্যা)। মনে রাখবেন যে লুপগুলোর ইন্ডেক্স ১ থেকে শুরু হয়, ০ থেকে নয়।

    2. টেস্ট লুপ ম্যানেজার অ্যাপে একটি সিলেকশন স্ক্রিন দেখা যায়, যেখান থেকে আপনি কোন লুপগুলো চালাতে চান তা নির্বাচন করতে পারেন। আপনি একাধিক লুপ নির্বাচন করলে, পূর্ববর্তী লুপটি সম্পূর্ণ হওয়ার পর প্রতিটি লুপ ক্রমানুসারে চালু হয়।

  • আপনি যদি Firebase কনসোল দিয়ে কোনো পরীক্ষা চালান, তাহলে Scenarios ফিল্ডে লুপ নম্বরের একটি তালিকা বা পরিসর লিখুন।

  • আপনি যদি gcloud CLI দিয়ে কোনো টেস্ট চালান, তাহলে --scenario-numbers ফ্ল্যাগটি ব্যবহার করে লুপ নম্বরগুলোর একটি তালিকা নির্দিষ্ট করুন। উদাহরণস্বরূপ, --scenario-numbers=1,3,5 ফ্ল্যাগটি ১, ৩ এবং ৫ নম্বর লুপগুলো চালাবে।

  • আপনি যদি C++ কোড লেখেন এবং আপনার লুপের আচরণ পরিবর্তন করতে চান, তাহলে আপনার নেটিভ C++ কোডে নিম্নলিখিত এক্সট্রাটি পাস করুন:

    Kotlin

    val launchIntent = intent
    val scenario = launchIntent.getIntExtra("scenario", 0)

    Java

    Intent launchIntent = getIntent();
    int scenario = launchIntent.getIntExtra("scenario", 0);

    এখন আপনি প্রাপ্ত int মানের উপর ভিত্তি করে আপনার লুপের আচরণ পরিবর্তন করতে পারবেন।

গেম লুপ লেবেল করুন

যখন আপনি আপনার গেম লুপগুলিকে এক বা একাধিক সিনারিও লেবেল দিয়ে চিহ্নিত করেন, তখন আপনি এবং আপনার QA টিম সহজেই সম্পর্কিত গেম লুপগুলির একটি সেট (যেমন, "সমস্ত কম্প্যাটিবিলিটি গেম লুপ") চালু করতে এবং সেগুলিকে একটি একক ম্যাট্রিক্সে পরীক্ষা করতে পারেন। আপনি আপনার নিজস্ব লেবেল তৈরি করতে পারেন অথবা Test Lab দ্বারা প্রদত্ত পূর্বনির্ধারিত লেবেলগুলি ব্যবহার করতে পারেন।

  • com.google.test.loops.player_experience : গেমটি খেলার সময় একজন প্রকৃত ব্যবহারকারীর অভিজ্ঞতা পুনরায় তৈরি করতে ব্যবহৃত ফর লুপ। এই লুপগুলির মাধ্যমে পরীক্ষার উদ্দেশ্য হলো এমন সমস্যাগুলি খুঁজে বের করা যা একজন প্রকৃত ব্যবহারকারী গেমটি খেলার সময় সম্মুখীন হতে পারেন।
  • com.google.test.loops.gpu_compatibility : জিপিইউ (GPU) সম্পর্কিত সমস্যা পরীক্ষা করার জন্য ব্যবহৃত ফর লুপ। এই লুপগুলির মাধ্যমে পরীক্ষার উদ্দেশ্য হলো এমন জিপিইউ কোড চালানো যা প্রোডাকশনে সঠিকভাবে নাও চলতে পারে, এবং এর মাধ্যমে হার্ডওয়্যার ও ড্রাইভারের সমস্যাগুলো উদ্ঘাটন করা।
  • com.google.test.loops.compatibility : ইনপুট/আউটপুট (I/O) এবং ওপেনএসএসএল (OpenSSL) সংক্রান্ত সমস্যাসহ বিভিন্ন ধরনের সামঞ্জস্যতার সমস্যা পরীক্ষা করার জন্য ব্যবহৃত ফর লুপ।
  • com.google.test.loops.performance : ডিভাইসের পারফরম্যান্স পরীক্ষা করার জন্য ব্যবহৃত ফর লুপ। উদাহরণস্বরূপ, একটি নতুন ডিভাইস কেমন আচরণ করে তা দেখার জন্য কোনো গেম সবচেয়ে জটিল গ্রাফিক্স সেটিংসে চালানো হতে পারে।

আপনার অ্যাপকে একই লেবেল সহ লুপ চালানোর অনুমতি দিতে:

  • আপনি যদি টেস্ট লুপ ম্যানেজার ব্যবহার করে কোনো টেস্ট চালান:

    1. আপনার অ্যাপের ম্যানিফেস্টে নিম্নলিখিত মেটা-ডেটা লাইনটি যোগ করুন এবং LABEL_NAME জায়গায় আপনার পছন্দের একটি লেবেল বসান:

      <meta-data
       android:name="com.google.test.loops.LABEL_NAME"
       android:value="1,3-5" />

      android:value ফিল্ডে, আপনি ১ থেকে ১০২৪ পর্যন্ত (একটি একক পরীক্ষার জন্য অনুমোদিত লুপের সর্বোচ্চ সংখ্যা) একটি পরিসীমা বা পূর্ণসংখ্যার সেট নির্দিষ্ট করতে পারেন, যা আপনি যে লুপগুলোকে লেবেল করতে চান সেগুলোকে নির্দেশ করে। মনে রাখবেন যে লুপগুলোর ইন্ডেক্সিং ১ থেকে শুরু হয়, ০ থেকে নয়। উদাহরণস্বরূপ, android:value="1,3-5" লুপ ১, ৩, ৪ এবং ৫-এ LABEL_NAME প্রয়োগ করে।

    2. টেস্ট লুপ ম্যানেজার অ্যাপে, লেবেল ফিল্ডে এক বা একাধিক লেবেল লিখুন।

  • আপনি যদি Firebase কনসোল দিয়ে কোনো পরীক্ষা চালান, তাহলে Labels ফিল্ডে এক বা একাধিক লেবেল লিখুন।

  • আপনি যদি gcloud CLI ব্যবহার করে কোনো পরীক্ষা চালান, তাহলে --scenario-labels ফ্ল্যাগটি ব্যবহার করে এক বা একাধিক সিনারিও লেবেল নির্দিষ্ট করুন (যেমন, --scenario-labels=performance,gpu )।

অ্যাপ লাইসেন্সিং সমর্থন

Test Lab সেইসব অ্যাপ সমর্থন করে যেগুলো গুগল প্লে-এর অ্যাপ লাইসেন্সিং পরিষেবা ব্যবহার করে। Test Lab দিয়ে আপনার অ্যাপ পরীক্ষা করার সময় সফলভাবে লাইসেন্সিং যাচাই করতে, আপনাকে অবশ্যই প্লে স্টোরের প্রোডাকশন চ্যানেলে আপনার অ্যাপটি প্রকাশ করতে হবে। Test Lab ব্যবহার করে আলফা বা বিটা চ্যানেলে আপনার অ্যাপ পরীক্ষা করতে, Test Lab আপনার অ্যাপ আপলোড করার আগে লাইসেন্সিং যাচাইটি সরিয়ে দিন।

পরিচিত সমস্যা

Test Lab গেম লুপ টেস্টগুলোতে নিম্নলিখিত জ্ঞাত সমস্যাগুলো রয়েছে:

  • কিছু ক্র্যাশ ব্যাকট্রেস সমর্থন করে না। উদাহরণস্বরূপ, কিছু রিলিজ বিল্ড prctl(PR_SET_DUMPABLE, 0) ব্যবহার করে debuggerd প্রসেসের আউটপুট দমন করতে পারে। আরও জানতে, debuggerd দেখুন।
  • ফাইল পারমিশন সংক্রান্ত ত্রুটির কারণে এপিআই লেভেল ১৯ বর্তমানে সমর্থিত নয়।
,

গেমিং অ্যাপগুলো বিভিন্ন UI ফ্রেমওয়ার্কের উপর তৈরি হলে গেম টেস্টিং স্বয়ংক্রিয় করা কঠিন হতে পারে। গেম লুপ টেস্ট আপনাকে আপনার নেটিভ টেস্টগুলোকে Test Lab সাথে একীভূত করতে এবং আপনার নির্বাচিত ডিভাইসগুলোতে সহজেই সেগুলো চালাতে সাহায্য করে। একটি গেম লুপ টেস্ট আপনার গেমিং অ্যাপের মাধ্যমে পরীক্ষাটি চালায় এবং একই সাথে একজন আসল খেলোয়াড়ের কার্যকলাপ অনুকরণ করে। এই নির্দেশিকাটি আপনাকে দেখাবে কীভাবে একটি গেম লুপ টেস্ট চালাতে হয় এবং তারপর Firebase কনসোলে আপনার পরীক্ষার ফলাফল দেখতে ও পরিচালনা করতে হয়।

আপনার গেম ইঞ্জিনের উপর নির্ভর করে, আপনি একটি বা একাধিক লুপ ব্যবহার করে টেস্টগুলো বাস্তবায়ন করতে পারেন। একটি লুপ হলো আপনার গেমিং অ্যাপে টেস্টের একটি সম্পূর্ণ বা আংশিক চালনা। গেম লুপগুলো নিম্নলিখিত কাজে ব্যবহার করা যেতে পারে:

  • আপনার গেমের একটি লেভেল ঠিক সেভাবেই চালান, যেভাবে একজন সাধারণ ব্যবহারকারী খেলবে। আপনি ব্যবহারকারীর ইনপুট স্ক্রিপ্ট করতে পারেন, ব্যবহারকারীকে নিষ্ক্রিয় রাখতে পারেন, অথবা আপনার গেমে যুক্তিযুক্ত হলে ব্যবহারকারীর পরিবর্তে একটি এআই (AI) ব্যবহার করতে পারেন (যেমন, ধরুন আপনার একটি রেস কার গেমিং অ্যাপ আছে এবং তাতে আগে থেকেই একটি এআই যুক্ত করা আছে। সেক্ষেত্রে আপনি সহজেই ব্যবহারকারীর ইনপুটের দায়িত্বে একজন এআই ড্রাইভারকে রাখতে পারেন)।
  • আপনার গেমটি সর্বোচ্চ কোয়ালিটি সেটিংসে চালিয়ে দেখুন ডিভাইসগুলো তা সাপোর্ট করে কিনা।
  • একটি প্রযুক্তিগত পরীক্ষা চালান (একাধিক শেডার কম্পাইল করুন, সেগুলো চালান, আউটপুট প্রত্যাশিত কিনা তা পরীক্ষা করুন, ইত্যাদি)।

আপনি একটি গেম লুপ টেস্ট একটিমাত্র টেস্ট ডিভাইসে, একাধিক টেস্ট ডিভাইসে, অথবা Test Lab চালাতে পারেন। তবে, আমরা ভার্চুয়াল ডিভাইসে গেম লুপ টেস্ট চালানোর পরামর্শ দিই না, কারণ সেগুলোর গ্রাফিক্স ফ্রেম রেট ফিজিক্যাল ডিভাইসের তুলনায় কম থাকে।

শুরু করার আগে

একটি টেস্ট বাস্তবায়ন করতে হলে, আপনাকে প্রথমে গেম লুপ টেস্টের জন্য আপনার অ্যাপটি কনফিগার করতে হবে।

  1. আপনার অ্যাপ ম্যানিফেস্টে, আপনার অ্যাক্টিভিটিতে একটি নতুন ইন্টেন্ট ফিল্টার যোগ করুন:

    <activity android:name=".MyActivity">
       <intent-filter>
           <action android:name="com.google.intent.action.TEST_LOOP"/>
           <category android:name="android.intent.category.DEFAULT"/>
           <data android:mimeType="application/javascript"/>
       </intent-filter>
       <intent-filter>
          ... (other intent filters here)
       </intent-filter>
    </activity>

    এর মাধ্যমে Test Lab একটি নির্দিষ্ট ইন্টেন্ট দ্বারা ট্রিগার করে আপনার গেমটি চালু করতে পারে।

  2. আপনার কোডে (আমরা onCreate মেথড ডিক্লারেশনের ভিতরে যোগ করার পরামর্শ দিই) নিম্নলিখিতটি যোগ করুন:

    Kotlin

    val launchIntent = intent
    if (launchIntent.action == "com.google.intent.action.TEST_LOOP") {
        val scenario = launchIntent.getIntExtra("scenario", 0)
        // Code to handle your game loop here
    }

    Java

    Intent launchIntent = getIntent();
    if(launchIntent.getAction().equals("com.google.intent.action.TEST_LOOP")) {
        int scenario = launchIntent.getIntExtra("scenario", 0);
        // Code to handle your game loop here
    }

    এর ফলে আপনার অ্যাক্টিভিটি যে ইন্টেন্টটি চালু করে, তা যাচাই করতে পারে। আপনি চাইলে এই কোডটি পরেও যোগ করতে পারেন (যেমন, আপনার গেম ইঞ্জিন প্রাথমিকভাবে লোড করার পরে)।

  3. সুপারিশকৃত: পরীক্ষার শেষে যোগ করুন:

    Kotlin

    yourActivity.finish()

    Java

    yourActivity.finish();

    গেম লুপ টেস্টটি সম্পূর্ণ হলে এটি আপনার অ্যাপটি বন্ধ করে দেয়। পরবর্তী লুপ শুরু করার জন্য এই টেস্টটি আপনার অ্যাপের UI ফ্রেমওয়ার্কের উপর নির্ভর করে, এবং অ্যাপটি বন্ধ করে দিলে ফ্রেমওয়ার্কটি জানিয়ে দেয় যে টেস্টটি শেষ হয়েছে।

একটি গেম লুপ পরীক্ষা তৈরি করুন এবং চালান

গেম লুপ টেস্টের জন্য আপনার অ্যাপ কনফিগার করার পর, আপনি সাথে সাথেই একটি টেস্ট তৈরি করে আপনার গেমিং অ্যাপে তা চালাতে পারবেন। আপনি Firebase কনসোল বা জিক্লাউড কমান্ড লাইন ইন্টারফেস (CLI) ব্যবহার করে Test Lab , অথবা টেস্ট লুপ ম্যানেজার ব্যবহার করে স্থানীয় ডিভাইসে টেস্টটি চালাতে পারেন।

স্থানীয় ডিভাইসে চালান

Test Lab -এর টেস্ট লুপ ম্যানেজার একটি ওপেন সোর্স অ্যাপ, যা আপনাকে গেম লুপ টেস্ট ইন্টিগ্রেট করতে এবং আপনার লোকাল ডিভাইসে সেগুলো চালাতে সাহায্য করে। এটি আপনার কোয়ালিটি অ্যাসিওরেন্স টিমকেও তাদের ডিভাইসে একই গেম লুপগুলো চালানোর সুযোগ দেয়।

টেস্ট লুপ ম্যানেজার ব্যবহার করে স্থানীয় ডিভাইসে একটি পরীক্ষা চালানোর জন্য:

  1. ফোন বা ট্যাবলেটে টেস্ট লুপ ম্যানেজার ডাউনলোড করুন এবং এটি ইনস্টল করতে নিম্নলিখিত কমান্ডটি চালান:
    adb install testloopmanager.apk
  2. আপনার ফোন বা ট্যাবলেটে Test Loop Apps অ্যাপটি খুলুন। অ্যাপটি আপনার ডিভাইসের সেইসব অ্যাপের একটি তালিকা দেখাবে যেগুলো গেম লুপের মাধ্যমে চালানো যায়। আপনি যদি এখানে আপনার গেমিং অ্যাপটি দেখতে না পান, তাহলে নিশ্চিত করুন যে আপনার ইন্টেন্ট ফিল্টারটি 'Before you begin' অংশের প্রথম ধাপে বর্ণিত ফিল্টারের সাথে মিলে যায়।
  3. আপনার গেমিং অ্যাপটি নির্বাচন করুন, তারপর আপনি যতগুলো লুপ চালাতে চান, সেই সংখ্যাটি নির্বাচন করুন। দ্রষ্টব্য: এই ধাপে, আপনি শুধু একটি লুপের পরিবর্তে কয়েকটি লুপের একটি উপসেট চালানোর বিকল্প বেছে নিতে পারেন। একই সাথে একাধিক লুপ চালানোর বিষয়ে আরও তথ্যের জন্য, ঐচ্ছিক বৈশিষ্ট্যসমূহ (Optional features ) দেখুন।
  4. 'Run test'-এ ক্লিক করুন। আপনার টেস্টটি সাথে সাথে চলতে শুরু করবে।

Test Lab চালান

আপনি Firebase কনসোল অথবা জিক্লাউড সিএলআই ব্যবহার করে Test Lab একটি গেম লুপ টেস্ট চালাতে পারেন। শুরু করার আগে, যদি আগে থেকে করা না থাকে, তাহলে Firebase কনসোলটি খুলুন এবং একটি প্রজেক্ট তৈরি করুন।

Firebase কনসোল ব্যবহার করুন

  1. Firebase কনসোলে, বাম প্যানেল থেকে Test Lab ক্লিক করুন।
  2. আপনার প্রথম পরীক্ষাটি চালান-এ ক্লিক করুন (অথবা যদি আপনার প্রজেক্টে আগে কোনো পরীক্ষা চালানো হয়ে থাকে, তাহলে একটি পরীক্ষা চালান )।
  3. পরীক্ষার ধরণ হিসেবে গেম লুপ নির্বাচন করুন, এবং তারপর কন্টিনিউ-তে ক্লিক করুন।
  4. ব্রাউজ-এ ক্লিক করুন, এবং তারপর আপনার অ্যাপের .apk ফাইলটি ব্রাউজ করে খুঁজে বের করুন। দ্রষ্টব্য: এই ধাপে, আপনি শুধু একটি লুপ চালানোর পরিবর্তে কয়েকটি লুপ একসাথে চালানোর বিকল্প বেছে নিতে পারেন। একসাথে একাধিক লুপ চালানো সম্পর্কে আরও তথ্যের জন্য, ঐচ্ছিক বৈশিষ্ট্যসমূহ (Optional features ) দেখুন।
  5. চালিয়ে যান-এ ক্লিক করুন।
  6. আপনার অ্যাপ পরীক্ষা করার জন্য ব্যবহারযোগ্য ফিজিক্যাল ডিভাইসগুলো নির্বাচন করুন।
  7. টেস্ট শুরু করতে ক্লিক করুন।

Firebase কনসোল দিয়ে কাজ শুরু করার বিষয়ে আরও তথ্যের জন্য, “Start testing with the Firebase console” দেখুন।

gcloud কমান্ড-লাইন (CLI) ব্যবহার করুন

  1. যদি এখনও না করে থাকেন, তাহলে Google Cloud SDK ডাউনলোড এবং ইনস্টল করুন।

  2. আপনার গুগল অ্যাকাউন্ট ব্যবহার করে gcloud CLI-তে সাইন ইন করুন:

    gcloud auth login

  3. gcloud-এ আপনার Firebase প্রজেক্টটি সেট করুন, যেখানে PROJECT_ID হলো আপনার Firebase প্রজেক্টের আইডি:

    gcloud config set project PROJECT_ID
    
  4. আপনার প্রথম পরীক্ষাটি চালান:

    gcloud firebase test android run \
     --type=game-loop --app=<var>path-to-apk</var> \
     --device model=herolte,version=23
    

gcloud CLI দিয়ে কাজ শুরু করার বিষয়ে আরও তথ্যের জন্য, “gcloud কমান্ড লাইন থেকে টেস্টিং শুরু করুন” দেখুন।

ঐচ্ছিক বৈশিষ্ট্য

Test Lab বেশ কিছু ঐচ্ছিক বৈশিষ্ট্য প্রদান করে, যা আপনাকে আপনার পরীক্ষাগুলোকে আরও কাস্টমাইজ করার সুযোগ দেয়; এর মধ্যে রয়েছে আউটপুট ডেটা লেখার ক্ষমতা, একাধিক গেম লুপের জন্য সমর্থন এবং সম্পর্কিত লুপগুলোর জন্য লেবেল ব্যবহারের সুবিধা।

আউটপুট ডেটা লিখুন

আপনার গেম লুপ টেস্ট launchIntent.getData() মেথডে নির্দিষ্ট করা একটি ফাইলে আউটপুট লিখতে পারে। টেস্টটি চালানোর পর, আপনি Firebase কনসোলের Test Lab সেকশন থেকে এই আউটপুট ডেটা অ্যাক্সেস করতে পারবেন ( গেম লুপ টেস্ট আউটপুট ফাইলের উদাহরণ দেখুন)।

Test Lab একটি ফাইল শেয়ার করা" অংশে বর্ণিত অ্যাপগুলোর মধ্যে ফাইল শেয়ার করার সর্বোত্তম পদ্ধতি অনুসরণ করে। আপনার অ্যাক্টিভিটির onCreate() মেথডে, যেখানে আপনার ইন্টেন্টটি অবস্থিত, আপনি নিম্নলিখিত কোডটি চালিয়ে আপনার ডেটা আউটপুট ফাইলটি পরীক্ষা করতে পারেন:

Kotlin

val launchIntent = intent
val logFile = launchIntent.data
logFile?.let {
    Log.i(TAG, "Log file ${it.encodedPath}")
    // ...
}

Java

Intent launchIntent = getIntent();
Uri logFile = launchIntent.getData();
if (logFile != null) {
    Log.i(TAG, "Log file " + logFile.getEncodedPath());
    // ...
}

আপনি যদি আপনার গেম অ্যাপের C++ অংশ থেকে ফাইলটিতে লিখতে চান, তাহলে ফাইল পাথের পরিবর্তে ফাইল ডেসক্রিপ্টরটি পাস করতে পারেন:

Kotlin

val launchIntent = intent
val logFile = launchIntent.data
var fd = -1
logFile?.let {
    Log.i(TAG, "Log file ${it.encodedPath}")
    fd = try {
        contentResolver
            .openAssetFileDescriptor(logFile, "w")!!
            .parcelFileDescriptor
            .fd
    } catch (e: FileNotFoundException) {
        e.printStackTrace()
        -1
    } catch (e: NullPointerException) {
        e.printStackTrace()
        -1
    }
}

// C++ code invoked here.
// native_function(fd);

Java

Intent launchIntent = getIntent();
Uri logFile = launchIntent.getData();
int fd = -1;
if (logFile != null) {
    Log.i(TAG, "Log file " + logFile.getEncodedPath());
    try {
        fd = getContentResolver()
                .openAssetFileDescriptor(logFile, "w")
                .getParcelFileDescriptor()
                .getFd();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
        fd = -1;
    } catch (NullPointerException e) {
        e.printStackTrace();
        fd = -1;
    }
}

// C++ code invoked here.
// native_function(fd);

সি++

#include <unistd.h>
JNIEXPORT void JNICALL
Java_my_package_name_MyActivity_native_function(JNIEnv *env, jclass type, jint log_file_descriptor) {
// The file descriptor needs to be duplicated.
int my_file_descriptor = dup(log_file_descriptor);
}

আউটপুট ফাইলের উদাহরণ

আপনি Firebase কনসোলের Test Lab বিভাগে গেম লুপ পরীক্ষার ফলাফল প্রদর্শন করতে আউটপুট ডেটা ফাইল (নীচের উদাহরণের মতো বিন্যাস করা) ব্যবহার করতে পারেন। /.../ হিসাবে দেখানো স্থানগুলিতে আপনার প্রয়োজনীয় যেকোনো কাস্টম ফিল্ড থাকতে পারে, যতক্ষণ না সেগুলি এই ফাইলে ব্যবহৃত অন্যান্য ফিল্ডের নামের সাথে সাংঘর্ষিক হয়:

{
  "name": "test name",
  "start_timestamp": 0, // Timestamp of the test start (in us).
                           Can be absolute or relative
  "driver_info": "...",
  "frame_stats": [
    {
      "timestamp": 1200000, // Timestamp at which this section was written
                               It contains value regarding the period
                               start_timestamp(0) -> this timestamp (1200000 us)
      "avg_frame_time": 15320, // Average time to render a frame in ns
      "nb_swap": 52, // Number of frame rendered
      "threads": [
        {
          "name": "physics",
          "Avg_time": 8030 // Average time spent in this thread per frame in us
        },
        {
          "name": "AI",
          "Avg_time": 2030 // Average time spent in this thread per frame in us
        }
      ],
      /.../ // Any custom field you want (vertices display on the screen, nb units …)
    },
    {
      // Next frame data here, same format as above
    }
  ],
  "loading_stats": [
    {
      "name": "assets_level_1",
      "total_time": 7850, // in us
      /.../
    },
    {
      "name": "victory_screen",
      "total_time": 554, // in us
      /.../
    }

  ],
  /.../, // You can add custom fields here
}

একাধিক গেম লুপ

আপনার অ্যাপে একাধিক গেম লুপ চালানো সুবিধাজনক হতে পারে। একটি লুপ হলো আপনার গেম অ্যাপের শুরু থেকে শেষ পর্যন্ত সম্পূর্ণ প্রক্রিয়াটি সম্পন্ন করা। উদাহরণস্বরূপ, যদি আপনার গেমে একাধিক লেভেল থাকে, তবে সবগুলো লেভেলের মধ্য দিয়ে যাওয়ার জন্য একটিমাত্র লুপ ব্যবহার না করে, আপনি প্রতিটি লেভেল চালু করার জন্য আলাদা গেম লুপ ব্যবহার করতে চাইতে পারেন। এভাবে, যদি আপনার অ্যাপটি ৩২ নম্বর লেভেলে ক্র্যাশ করে, তবে আপনি সরাসরি সেই গেম লুপটি চালু করে ক্র্যাশটি পুনরায় ঘটাতে এবং বাগ ফিক্স পরীক্ষা করতে পারবেন।

আপনার অ্যাপকে একই সাথে একাধিক লুপ চালানোর সুবিধা দিতে:

  • আপনি যদি টেস্ট লুপ ম্যানেজার ব্যবহার করে কোনো টেস্ট চালান:

    1. আপনার অ্যাপের ম্যানিফেস্টে, <application> এলিমেন্টের ভিতরে নিম্নলিখিত লাইনটি যোগ করুন:

      <meta-data
        android:name="com.google.test.loops"
        android:value="5" />

      এই লঞ্চ ইন্টেন্টটিতে টার্গেট লুপটি একটি ইন্টিজার প্যারামিটার হিসেবে থাকে। android:value ফিল্ডে, আপনি ১ থেকে ১০২৪ পর্যন্ত একটি ইন্টিজার উল্লেখ করতে পারেন (একটি একক টেস্টের জন্য অনুমোদিত লুপের সর্বোচ্চ সংখ্যা)। মনে রাখবেন যে লুপগুলোর ইন্ডেক্স ১ থেকে শুরু হয়, ০ থেকে নয়।

    2. টেস্ট লুপ ম্যানেজার অ্যাপে একটি সিলেকশন স্ক্রিন দেখা যায়, যেখান থেকে আপনি কোন লুপগুলো চালাতে চান তা নির্বাচন করতে পারেন। আপনি একাধিক লুপ নির্বাচন করলে, পূর্ববর্তী লুপটি সম্পূর্ণ হওয়ার পর প্রতিটি লুপ ক্রমানুসারে চালু হয়।

  • আপনি যদি Firebase কনসোল দিয়ে কোনো পরীক্ষা চালান, তাহলে Scenarios ফিল্ডে লুপ নম্বরের একটি তালিকা বা পরিসর লিখুন।

  • আপনি যদি gcloud CLI দিয়ে কোনো টেস্ট চালান, তাহলে --scenario-numbers ফ্ল্যাগটি ব্যবহার করে লুপ নম্বরগুলোর একটি তালিকা নির্দিষ্ট করুন। উদাহরণস্বরূপ, --scenario-numbers=1,3,5 ফ্ল্যাগটি ১, ৩ এবং ৫ নম্বর লুপগুলো চালাবে।

  • আপনি যদি C++ কোড লেখেন এবং আপনার লুপের আচরণ পরিবর্তন করতে চান, তাহলে আপনার নেটিভ C++ কোডে নিম্নলিখিত এক্সট্রাটি পাস করুন:

    Kotlin

    val launchIntent = intent
    val scenario = launchIntent.getIntExtra("scenario", 0)

    Java

    Intent launchIntent = getIntent();
    int scenario = launchIntent.getIntExtra("scenario", 0);

    এখন আপনি প্রাপ্ত int মানের উপর ভিত্তি করে আপনার লুপের আচরণ পরিবর্তন করতে পারবেন।

গেম লুপ লেবেল করুন

যখন আপনি আপনার গেম লুপগুলিকে এক বা একাধিক সিনারিও লেবেল দিয়ে চিহ্নিত করেন, তখন আপনি এবং আপনার QA টিম সহজেই সম্পর্কিত গেম লুপগুলির একটি সেট (যেমন, "সমস্ত কম্প্যাটিবিলিটি গেম লুপ") চালু করতে এবং সেগুলিকে একটি একক ম্যাট্রিক্সে পরীক্ষা করতে পারেন। আপনি আপনার নিজস্ব লেবেল তৈরি করতে পারেন অথবা Test Lab দ্বারা প্রদত্ত পূর্বনির্ধারিত লেবেলগুলি ব্যবহার করতে পারেন।

  • com.google.test.loops.player_experience : For loops used to reproduce a real user's experience when playing the game. The goal of testing with these loops is to find issues that a real user would face while playing the game.
  • com.google.test.loops.gpu_compatibility : For loops used to test GPU-related issues. The goal of testing with these loops is to execute GPU code that might not run properly run in production, to expose issues with hardware and drivers.
  • com.google.test.loops.compatibility : For loops used to test a broad range of compatibility issues, including I/O issues and OpenSSL issues.
  • com.google.test.loops.performance : For loops used to test the performance of the device. For example, a game might run at the most complex graphics settings to see how a new device behaves.

To enable your app to run loops with the same label:

  • If you're running a test with the Test Loop Manager:

    1. In your app's manifest, add the following meta-data line and replace LABEL_NAME with a label of your choice:

      <meta-data
       android:name="com.google.test.loops.LABEL_NAME"
       android:value="1,3-5" />

      In the android:value field, you can specify a range or a set of integers from 1 to 1024 (the maximum number of loops allowed for a single test) that represent the loops you want to label. Note that loops are indexed starting from 1, not 0. For example, android:value="1,3-5" applies LABEL_NAME to loops 1, 3, 4, and 5.

    2. In the Test Loop Manager app, enter one or more labels in the Labels field.

  • If you're running a test with the Firebase console, enter one or more labels in the Labels field.

  • If you're running a test with the gcloud CLI, specify one or more scenario labels by using the --scenario-labels flag (eg, --scenario-labels=performance,gpu ).

App licensing support

Test Lab supports apps that use the App Licensing service offered by Google Play. To successfully check licensing when testing your app with Test Lab , you must publish your app to the production channel in the Play store. To test your app in the alpha or beta channel using Test Lab , remove the licensing check before uploading your app to Test Lab .

Known issues

Game Loop tests in Test Lab have the following known issues:

  • Some crashes do not support backtraces. For example, some release builds may suppress the output of the debuggerd process using prctl(PR_SET_DUMPABLE, 0) . To learn more, see debuggerd .
  • API Level 19 is not currently supported due to file permission errors.