गेम लूप के टेस्ट शुरू करें

अलग-अलग यूज़र इंटरफ़ेस (यूआई) फ़्रेमवर्क पर बनाए गए गेमिंग ऐप्लिकेशन की टेस्टिंग को अपने-आप होने के लिए सेट अप करना मुश्किल हो सकता है. गेम लूप टेस्ट की मदद से, अपने नेटिव टेस्ट को Test Lab के साथ इंटिग्रेट किया जा सकता है. साथ ही, उन्हें चुने गए डिवाइसों पर आसानी से चलाया जा सकता है. गेम लूप टेस्ट, आपके गेमिंग ऐप्लिकेशन पर टेस्ट चलाता है. साथ ही, यह असली खिलाड़ी की कार्रवाइयों को सिम्युलेट करता है. इस गाइड में, गेम लूप टेस्ट चलाने का तरीका बताया गया है. साथ ही, Firebase कंसोल में टेस्ट के नतीजे देखने और उन्हें मैनेज करने का तरीका बताया गया है.

गेम इंजन के आधार पर, एक या एक से ज़्यादा लूप के साथ टेस्ट लागू किए जा सकते हैं. लूप, आपके गेमिंग ऐप्लिकेशन पर किए जाने वाले टेस्ट का पूरा या कुछ हिस्सा होता है. गेम लूप का इस्तेमाल इन कामों के लिए किया जा सकता है:

  • अपने गेम के किसी लेवल को उसी तरह चलाएं जिस तरह कोई उपयोगकर्ता उसे खेलता है. आपके पास उपयोगकर्ता के इनपुट को स्क्रिप्ट करने, उपयोगकर्ता को निष्क्रिय रहने देने या उपयोगकर्ता को एआई से बदलने का विकल्प होता है.हालांकि, ऐसा सिर्फ़ तब करें, जब यह आपके गेम के लिए सही हो. उदाहरण के लिए, मान लें कि आपके पास रेस कार गेमिंग ऐप्लिकेशन है और आपने पहले से ही एआई को लागू किया है. आपके पास, उपयोगकर्ता के इनपुट को मैनेज करने के लिए, एआई ड्राइवर को आसानी से असाइन करने का विकल्प होता है.
  • अपने गेम को सबसे अच्छी क्वालिटी की सेटिंग पर चलाकर देखें कि डिवाइसों पर यह काम करता है या नहीं.
  • टेक्निकल टेस्ट चलाएं. जैसे, कई शेडर कंपाइल करना, उन्हें एक्ज़ीक्यूट करना, और यह देखना कि आउटपुट उम्मीद के मुताबिक है या नहीं.

गेम लूप टेस्ट को किसी एक टेस्ट डिवाइस, टेस्ट डिवाइसों के सेट या Test Lab पर चलाया जा सकता है. हालांकि, हम वर्चुअल डिवाइसों पर गेम लूप टेस्ट चलाने का सुझाव नहीं देते, क्योंकि इनमें फ़िज़िकल डिवाइसों की तुलना में ग्राफ़िक्स फ़्रेम रेट कम होते हैं.

शुरू करने से पहले

टेस्ट लागू करने के लिए, आपको सबसे पहले अपने ऐप्लिकेशन को गेम लूप टेस्ट के लिए कॉन्फ़िगर करना होगा.

  1. अपने ऐप्लिकेशन के मेनिफ़ेस्ट में, अपनी activity में एक नया इंटेंट फ़िल्टर जोड़ें:

    <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();

    गेम लूप टेस्ट पूरा होने पर, इससे आपका ऐप्लिकेशन बंद हो जाता है. टेस्ट, अगले लूप को शुरू करने के लिए आपके ऐप्लिकेशन के यूज़र इंटरफ़ेस (यूआई) फ़्रेमवर्क पर निर्भर करता है. ऐप्लिकेशन बंद करने से, उसे यह पता चलता है कि टेस्ट पूरा हो गया है.

गेम लूप टेस्ट बनाना और उसे चलाना

गेम लूप की जांच के लिए ऐप्लिकेशन को कॉन्फ़िगर करने के बाद, तुरंत एक जांच बनाई जा सकती है और उसे अपने गेमिंग ऐप्लिकेशन में चलाया जा सकता है. Test Lab में जांच चलाने के लिए, Firebase कंसोल या gcloud कमांड लाइन इंटरफ़ेस (सीएलआई) का इस्तेमाल किया जा सकता है. इसके अलावा, टेस्ट लूप मैनेजर का इस्तेमाल करके, स्थानीय डिवाइस पर भी जांच चलाई जा सकती है.

लोकल डिवाइस पर चलाना

Test Lab's Test Loop Manager एक ओपन सोर्स ऐप्लिकेशन है. यह गेम लूप टेस्ट को इंटिग्रेट करने और उन्हें अपने लोकल डिवाइसों पर चलाने में आपकी मदद करता है. इससे आपकी क्वालिटी अश्योरेंस टीम को भी अपने डिवाइसों पर एक ही गेम लूप चलाने की अनुमति मिलती है.

टेस्ट लूप मैनेजर का इस्तेमाल करके, किसी लोकल डिवाइस पर टेस्ट चलाने के लिए:

  1. फ़ोन या टैबलेट पर Test Loop Manager डाउनलोड करें और इसे इंस्टॉल करने के लिए, यह कमांड चलाएं:
    adb install testloopmanager.apk
  2. अपने फ़ोन या टैबलेट पर, Test Loop Apps ऐप्लिकेशन खोलें. ऐप्लिकेशन, आपके डिवाइस पर मौजूद उन ऐप्लिकेशन की सूची दिखाता है जिन्हें गेम लूप के साथ चलाया जा सकता है. अगर आपको यहां अपना गेमिंग ऐप्लिकेशन नहीं दिखता है, तो पक्का करें कि आपका इंटेंट फ़िल्टर, शुरू करने से पहले सेक्शन में बताए गए पहले चरण से मेल खाता हो.
  3. अपना गेमिंग ऐप्लिकेशन चुनें. इसके बाद, लूप की वह संख्या चुनें जिसे आपको चलाना है. ध्यान दें: इस चरण में, सिर्फ़ एक लूप चलाने के बजाय, लूप के किसी सबसेट को चलाने का विकल्प चुना जा सकता है. एक साथ कई लूप चलाने के बारे में ज़्यादा जानने के लिए, ज़रूरी नहीं हैं, लेकिन काम की हैं लेख पढ़ें.
  4. टेस्ट चलाएं पर क्लिक करें. आपकी जांच तुरंत शुरू हो जाएगी.

Test Lab में चल रही है

Test Lab में गेम लूप टेस्ट चलाने के लिए, Firebase कंसोल या gcloud सीएलआई का इस्तेमाल किया जा सकता है. शुरू करने से पहले, अगर आपने अब तक Firebase कंसोल नहीं खोला है, तो उसे खोलें और एक प्रोजेक्ट बनाएं.

Firebase कंसोल का इस्तेमाल करना

  1. Firebase कंसोल में, बाएं पैनल में मौजूद Test Lab पर क्लिक करें.
  2. पहला टेस्ट चलाएं पर क्लिक करें. अगर आपके प्रोजेक्ट में पहले से कोई टेस्ट चल रहा है, तो टेस्ट चलाएं पर क्लिक करें.
  3. टेस्ट टाइप के तौर पर गेम लूप चुनें. इसके बाद, जारी रखें पर क्लिक करें.
  4. ब्राउज़ करें पर क्लिक करें. इसके बाद, अपने ऐप्लिकेशन की .apk फ़ाइल ब्राउज़ करें. ध्यान दें: इस चरण में, सिर्फ़ एक लूप चलाने के बजाय, लूप के किसी सबसेट को चलाने का विकल्प चुना जा सकता है. एक साथ कई लूप चलाने के बारे में ज़्यादा जानने के लिए, वैकल्पिक सुविधाएं देखें.
  5. जारी रखें पर क्लिक करें.
  6. अपने ऐप्लिकेशन की जांच करने के लिए, फ़िज़िकल डिवाइस चुनें.
  7. टेस्ट शुरू करें पर क्लिक करें.

Firebase कंसोल का इस्तेमाल शुरू करने के बारे में ज़्यादा जानने के लिए, Firebase कंसोल का इस्तेमाल करके टेस्टिंग शुरू करना लेख पढ़ें.

gcloud कमांड-लाइन (सीएलआई) का इस्तेमाल करना

  1. अगर आपने पहले से ही Google Cloud SDK डाउनलोड और इंस्टॉल नहीं किया है, तो इसे डाउनलोड और इंस्टॉल करें

  2. अपने Google खाते का इस्तेमाल करके, 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 सीएलआई का इस्तेमाल शुरू करने के बारे में ज़्यादा जानने के लिए, 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);

C++

#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
}

एक से ज़्यादा गेम लूप

आपके ऐप्लिकेशन में एक से ज़्यादा गेम लूप चलाने का विकल्प होता है. लूप, आपके गेम ऐप्लिकेशन को शुरू से आखिर तक चलाने की प्रोसेस होती है. उदाहरण के लिए, अगर आपके गेम में कई लेवल हैं, तो हो सकता है कि आपको हर लेवल को लॉन्च करने के लिए एक गेम लूप चाहिए हो. इसके बजाय, आपको एक ऐसा लूप चाहिए जो उन सभी लेवल पर दोहराता हो. इस तरह, अगर आपका ऐप्लिकेशन 32वें लेवल पर क्रैश होता है, तो क्रैश को फिर से बनाने और बग ठीक करने की जांच करने के लिए, सीधे उस गेम लूप को लॉन्च किया जा सकता है.

अपने ऐप्लिकेशन में एक साथ कई लूप चलाने की सुविधा चालू करने के लिए:

  • अगर टेस्ट लूप मैनेजर की मदद से कोई टेस्ट चलाया जा रहा है, तो:

    1. अपने ऐप्लिकेशन के मेनिफ़ेस्ट में, <application> एलिमेंट के अंदर यह लाइन जोड़ें:

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

      इस लॉन्च इंटेंट में, टारगेट लूप को पूर्णांक पैरामीटर के तौर पर शामिल किया गया है. android:value फ़ील्ड में, 1 से 1024 तक कोई पूर्णांक डाला जा सकता है. यह एक टेस्ट के लिए लूप की ज़्यादा से ज़्यादा संख्या है. ध्यान दें कि लूप को इंडेक्स करते समय, गिनती 1 से शुरू होती है, न कि 0 से.

    2. Test Loop Manager ऐप्लिकेशन में, एक सिलेक्शन स्क्रीन दिखती है. इसकी मदद से, यह चुना जा सकता है कि आपको कौनसे लूप चलाने हैं. एक से ज़्यादा लूप चुनने पर, हर लूप पिछले लूप के पूरा होने के बाद क्रम से लॉन्च होता है.

  • अगर आपको Firebase कंसोल का इस्तेमाल करके टेस्ट चलाना है, तो सिनारियो फ़ील्ड में लूप नंबर की सूची या रेंज डालें.

  • अगर gcloud CLI की मदद से कोई टेस्ट चलाया जा रहा है, तो --scenario-numbers फ़्लैग का इस्तेमाल करके, लूप नंबर की सूची तय करें. उदाहरण के लिए, --scenario-numbers=1,3,5 लूप 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 वैल्यू के आधार पर, लूप के व्यवहार में बदलाव किया जा सकता है.

गेम लूप को लेबल करना

अपने गेम लूप को एक या एक से ज़्यादा परिदृश्य वाले लेबल से लेबल करने पर, आपको और आपकी क्वालिटी अश्योरेंस (क्यूए) टीम को, मिलते-जुलते गेम लूप का सेट आसानी से लॉन्च करने में मदद मिलती है. उदाहरण के लिए, "सभी कंपैटिबिलिटी गेम लूप") और उन्हें एक ही मैट्रिक्स में टेस्ट करें. अपने लेबल बनाए जा सकते हैं या Test Lab की ओर से दिए गए पहले से तय लेबल इस्तेमाल किए जा सकते हैं:

  • com.google.test.loops.player_experience: इन लूप का इस्तेमाल, गेम खेलने के दौरान किसी असली उपयोगकर्ता के अनुभव को दोहराने के लिए किया जाता है. इन लूप के साथ टेस्टिंग करने का मकसद, उन समस्याओं का पता लगाना है जो किसी असली उपयोगकर्ता को गेम खेलते समय आ सकती हैं.
  • com.google.test.loops.gpu_compatibility: जीपीयू से जुड़ी समस्याओं की जांच करने के लिए इस्तेमाल किए गए लूप. इन लूप के साथ टेस्टिंग करने का मकसद, ऐसे जीपीयू कोड को एक्ज़ीक्यूट करना है जो प्रोडक्शन में ठीक से काम नहीं कर सकता. इससे हार्डवेयर और ड्राइवर से जुड़ी समस्याओं का पता चलता है.
  • 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 फ़ील्ड में, 1 से 1024 तक के पूर्णांकों की रेंज या सेट तय किया जा सकता है. यह एक टेस्ट के लिए लूप की ज़्यादा से ज़्यादा संख्या है. इससे उन लूप के बारे में पता चलता है जिन्हें आपको लेबल करना है. ध्यान दें कि लूप को इंडेक्स करते समय, गिनती 1 से शुरू होती है, न कि 0 से. उदाहरण के लिए, android:value="1,3-5", लूप 1, 3, 4, और 5 पर लागू होता है.LABEL_NAME

    2. Test Loop Manager ऐप्लिकेशन में, लेबल फ़ील्ड में एक या उससे ज़्यादा लेबल डालें.

  • अगर आपको Firebase कंसोल का इस्तेमाल करके टेस्ट चलाना है, तो लेबल फ़ील्ड में एक या इससे ज़्यादा लेबल डालें.

  • अगर gcloud CLI की मदद से कोई टेस्ट चलाया जा रहा है, तो --scenario-labels फ़्लैग का इस्तेमाल करके एक या उससे ज़्यादा परिदृश्य लेबल तय करें. उदाहरण के लिए, --scenario-labels=performance,gpu).

ऐप्लिकेशन लाइसेंसिंग सिस्टम से जुड़ी सहायता

Test Lab उन ऐप्लिकेशन के साथ काम करता है जो Google Play की ऐप्लिकेशन लाइसेंसिंग सेवा का इस्तेमाल करते हैं. Test Lab की मदद से अपने ऐप्लिकेशन की टेस्टिंग करते समय, लाइसेंस की जांच करने के लिए, आपको Play Store में अपने ऐप्लिकेशन को प्रोडक्शन चैनल पर पब्लिश करना होगा. Test Lab का इस्तेमाल करके, ऐप्लिकेशन को अल्फ़ा या बीटा चैनल में टेस्ट करने के लिए, Test Lab में ऐप्लिकेशन अपलोड करने से पहले लाइसेंस की जांच करने की सुविधा हटा दें.

ज्ञात समस्याएं

Test Lab में गेम लूप टेस्ट से जुड़ी ये समस्याएं हैं:

  • कुछ क्रैश के लिए, बैकट्रैस की सुविधा उपलब्ध नहीं होती. उदाहरण के लिए, कुछ रिलीज़ बिल्ड, debuggerd का इस्तेमाल करके debuggerd प्रोसेस के आउटपुट को छिपा सकते हैं.prctl(PR_SET_DUMPABLE, 0) ज़्यादा जानने के लिए, debuggerd पर जाएं.
  • फ़ाइल की अनुमति से जुड़ी गड़बड़ियों की वजह से, फ़िलहाल एपीआई लेवल 19 काम नहीं करता.