Game Loop testlerine başlayın

Oyun uygulamaları farklı kullanıcı arayüzü çerçeveleri üzerine kurulduğunda oyun testini otomatikleştirmek zor olabilir. Game Loop testleri, yerel testlerinizi Test Lab ile entegre etmenize ve bunları seçtiğiniz cihazlarda kolayca çalıştırmanıza olanak tanır. Game Loop testi, gerçek bir oyuncunun eylemlerini simüle ederken testinizi oyun uygulamanız aracılığıyla çalıştırır. Bu kılavuz, Firebase konsolunda Game Loop testini nasıl çalıştıracağınızı ve ardından test sonuçlarınızı nasıl görüntüleyip yöneteceğinizi gösterir.

Oyun motorunuza bağlı olarak testleri tek veya çoklu döngülerle uygulayabilirsiniz. Döngü, testinizin oyun uygulamanızda tam veya kısmi olarak tekrarlanmasıdır. Oyun döngüleri şu amaçlarla kullanılabilir:

  • Oyununuzun bir seviyesini son kullanıcının oynayacağı şekilde çalıştırın. Kullanıcının girdisini komut dosyasıyla yazabilir, kullanıcının boşta kalmasına izin verebilir veya oyununuzda anlamlıysa kullanıcıyı bir yapay zeka ile değiştirebilirsiniz (örneğin, bir yarış arabası oyun uygulamanız olduğunu ve zaten bir yapay zekanın uygulandığını varsayalım. kolayca kullanıcının girişinden sorumlu bir AI sürücüsünü görevlendirebilir).
  • Cihazların destekleyip desteklemediğini görmek için oyununuzu en yüksek kalite ayarında çalıştırın.
  • Teknik bir test çalıştırın (birden fazla gölgelendiriciyi derleyin, çalıştırın, çıktının beklendiği gibi olup olmadığını kontrol edin, vb.).

Game Loop testini tek bir test cihazında, bir dizi test cihazında veya Test Lab'da çalıştırabilirsiniz. Ancak Game Loop testlerinin fiziksel cihazlara göre daha düşük grafik kare hızlarına sahip olması nedeniyle sanal cihazlarda çalıştırılmasını önermiyoruz.

Sen başlamadan önce

Bir testi uygulamak için öncelikle uygulamanızı Game Loop testleri için yapılandırmanız gerekir.

  1. Uygulama bildiriminizde etkinliğinize yeni bir amaç filtresi ekleyin:

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

    Bu, Test Lab'in oyununuzu belirli bir amaç ile tetikleyerek başlatmasına olanak tanır.

  2. Kodunuzda ( onCreate yöntem bildiriminin içine girmenizi öneririz) aşağıdakileri ekleyin:

    Kotlin+KTX

    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
    }

    Bu, etkinliğinizin onu başlatan amacı kontrol etmesine olanak tanır. İsterseniz bu kodu daha sonra da ekleyebilirsiniz (örneğin, oyun motorunuzu ilk kez yükledikten sonra).

  3. Önerilen: Testin sonuna şunları ekleyin:

    Kotlin+KTX

    yourActivity.finish()

    Java

    yourActivity.finish();

    Bu, Game Loop testi tamamlandığında uygulamanızı kapatır. Test, bir sonraki döngüyü başlatmak için uygulamanızın kullanıcı arayüzü çerçevesine dayanır ve uygulamanızı kapatmak, testin bittiğini bildirir.

Oyun Döngüsü testi oluşturma ve çalıştırma

Uygulamanızı Game Loop testleri için yapılandırdıktan sonra hemen bir test oluşturabilir ve bunu oyun uygulamanızda çalıştırabilirsiniz. Firebase konsolunu veya gcloud komut satırı arayüzünü (CLI) kullanarak Test Lab'da ya da Test Döngü Yöneticisini kullanarak yerel bir cihazda test çalıştırmayı seçebilirsiniz.

Yerel bir cihazda çalıştırın

Test Lab'ın Test Loop Manager'ı, Game Loop testlerini entegre etmenize ve bunları yerel cihazlarınızda çalıştırmanıza yardımcı olan açık kaynaklı bir uygulamadır. Ayrıca Kalite Güvence ekibinizin cihazlarında aynı oyun döngülerini çalıştırmasına olanak tanır.

Test Döngü Yöneticisini kullanarak yerel bir cihazda test çalıştırmak için:

  1. Test Döngü Yöneticisini bir telefona veya tablete indirin ve şunu çalıştırarak yükleyin:
    adb install testloopmanager.apk
  2. Cihazınızda, telefonunuzda veya tabletinizde Test Loop Uygulamaları uygulamasını açın. Uygulama, cihazınızda oyun döngüleriyle çalıştırılabilecek uygulamaların bir listesini görüntüler. Oyun uygulamanızı burada görmüyorsanız amaç filtrenizin, Başlamadan önce bölümünün ilk adımında açıklananla eşleştiğinden emin olun.
  3. Oyun uygulamanızı seçin, ardından çalıştırmak istediğiniz döngü sayısını seçin. Not: Bu adımda tek bir döngü yerine döngülerin bir alt kümesini çalıştırmayı seçebilirsiniz. Birden fazla döngüyü aynı anda çalıştırma hakkında daha fazla bilgi için bkz. İsteğe bağlı özellikler .
  4. Testi çalıştır öğesine tıklayın. Testiniz hemen çalışmaya başlar.

Test Laboratuvarında Çalıştır

Firebase konsolunu veya gcloud CLI'yi kullanarak Test Lab'da Game Loop testi çalıştırabilirsiniz. Başlamadan önce, henüz yapmadıysanız Firebase konsolunu açın ve bir proje oluşturun.

Firebase konsolunu kullanma

  1. Firebase konsolunda sol panelden Test Laboratuvarı'na tıklayın.
  2. İlk Testinizi Çalıştır'a (veya projeniz daha önce bir test yürüttüyse Test Çalıştır'a ) tıklayın.
  3. Test türü olarak Game Loop'u seçin ve ardından Devam'a tıklayın.
  4. Gözat'a tıklayın ve ardından uygulamanızın .apk dosyasına göz atın. Not: Bu adımda tek bir döngü yerine döngülerin bir alt kümesini çalıştırmayı seçebilirsiniz. Birden fazla döngüyü aynı anda çalıştırma hakkında daha fazla bilgi için bkz. İsteğe bağlı özellikler .
  5. Devam'ı tıklayın.
  6. Uygulamanızı test etmek için kullanılacak fiziksel cihazları seçin.
  7. Testleri Başlat'a tıklayın.

Firebase konsolunu kullanmaya başlama hakkında daha fazla bilgi için bkz. Firebase konsoluyla test etmeye başlama.

gcloud komut satırını (CLI) kullanın

  1. Henüz yapmadıysanız Google Cloud SDK'yı indirip yükleyin

  2. Google Hesabınızı kullanarak gcloud KSA'sında oturum açın:

    gcloud auth login

  3. Firebase projenizi gcloud'da ayarlayın; burada PROJECT_ID , Firebase projenizin kimliğidir:

    gcloud config set project PROJECT_ID
    
  4. İlk testinizi çalıştırın:

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

gcloud CLI'yi kullanmaya başlama hakkında daha fazla bilgi için bkz. Testi gcloud komut satırından başlatma.

Opsiyonel özellikler

Test Lab, çıktı verilerini yazma yeteneği, birden fazla oyun döngüsü desteği ve ilgili döngüler için etiketler dahil olmak üzere, testlerinizi daha da özelleştirmenize olanak tanıyan çeşitli isteğe bağlı özellikler sunar.

Çıkış verilerini yaz

Game Loop testiniz, launchIntent.getData() yönteminde belirtilen bir dosyaya çıktı yazabilir. Bir testi çalıştırdıktan sonra bu çıktı verilerine Firebase konsolunun Test Laboratuvarı bölümünden erişebilirsiniz (bkz . Game Loop test çıktı dosyası örneği ).

Test Lab, Dosya Paylaşma bölümünde açıklanan uygulamalar arasında dosya paylaşımına ilişkin en iyi uygulamaları takip eder. Amacınızın bulunduğu etkinliğinizin onCreate() yönteminde, aşağıdaki kodu çalıştırarak veri çıktı dosyanızı kontrol edebilirsiniz:

Kotlin+KTX

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());
    // ...
}

Dosyaya oyun uygulamanızın C++ tarafından yazmak istiyorsanız dosya yolu yerine dosya tanımlayıcısını iletebilirsiniz:

Kotlin+KTX

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

Çıkış dosyası örneği

Firebase konsolunun Test Laboratuvarı bölümünde oyun döngüsü testi sonuçlarını görüntülemek için çıktı veri dosyalarını (aşağıdaki örnekte olduğu gibi biçimlendirilmiş) kullanabilirsiniz. /.../ olarak gösterilen alanlar, bu dosyada kullanılan diğer alanların adlarıyla çakışmadığı sürece ihtiyaç duyduğunuz tüm özel alanları içerebilir:

{
  "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
}

Çoklu oyun döngüleri

Uygulamanızda birden fazla oyun döngüsü çalıştırmayı faydalı bulabilirsiniz. Döngü, oyun uygulamanızın başından sonuna kadar eksiksiz bir şekilde yürütülmesidir. Örneğin, oyununuzda birden fazla seviye varsa, tüm seviyelerde yinelenen bir döngü yerine, her seviyeyi başlatacak bir oyun döngüsü olmasını isteyebilirsiniz. Bu şekilde, uygulamanız 32. seviyede kilitlenirse, çökmeyi yeniden oluşturmak ve hata düzeltmelerini test etmek için doğrudan oyun döngüsünü başlatabilirsiniz.

Uygulamanızın aynı anda birden fazla döngü çalıştırmasını sağlamak için:

  • Test Döngüsü Yöneticisiyle bir test çalıştırıyorsanız:

    1. Uygulamanızın manifest dosyasına <application> öğesinin içine şu satırı ekleyin:

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

      Bu başlatma amacı, hedef döngüyü bir tamsayı parametresi olarak içerir. android:value alanında 1'den 1024'e kadar bir tamsayı (tek bir test için izin verilen maksimum döngü sayısı) belirtebilirsiniz. Döngülerin 0'dan değil 1'den başlayarak indekslendiğini unutmayın.

    2. Test Döngüsü Yöneticisi uygulamasında, hangi döngüyü/döngüleri çalıştırmak istediğinizi seçmenizi sağlayan bir seçim ekranı görünür. Birden fazla döngü seçerseniz her döngü, önceki döngü tamamlandıktan sonra sırayla başlatılır.

  • Firebase konsoluyla bir test çalıştırıyorsanız Senaryolar alanına bir liste veya döngü numarası aralığı girin.

  • gcloud CLI ile bir test çalıştırıyorsanız --scenario-numbers işaretini kullanarak döngü numaralarının bir listesini belirtin. Örneğin --scenario-numbers=1,3,5 1, 3 ve 5 numaralı döngüleri çalıştırır.

  • C++ yazıyorsanız ve döngünüzün davranışını değiştirmek istiyorsanız, aşağıdaki ekstraları yerel C++ kodunuza iletin:

    Kotlin+KTX

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

    Java

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

    Artık ortaya çıkan int değerine göre döngünün davranışını değiştirebilirsiniz.

Oyun döngülerini etiketleyin

Oyun döngülerinizi bir veya daha fazla senaryo etiketiyle etiketlediğinizde, siz ve QA ekibiniz kolayca bir dizi ilgili oyun döngüsü (örneğin, "tüm uyumluluk oyun döngüleri") başlatabilir ve bunları tek bir matriste test edebilirsiniz. Kendi etiketlerinizi oluşturabilir veya Test Lab tarafından sunulan önceden tanımlanmış etiketleri kullanabilirsiniz:

  • com.google.test.loops.player_experience : Oyunu oynarken gerçek bir kullanıcı deneyimini yeniden oluşturmak için kullanılan döngüler için. Bu döngülerle test yapmanın amacı, gerçek bir kullanıcının oyunu oynarken karşılaşacağı sorunları bulmaktır.
  • com.google.test.loops.gpu_compatibility : GPU ile ilgili sorunları test etmek için kullanılan döngüler için. Bu döngülerle test yapmanın amacı, üretimde düzgün şekilde çalışmayabilecek GPU kodunu yürütmek, donanım ve sürücülerle ilgili sorunları ortaya çıkarmaktır.
  • com.google.test.loops.compatibility : G/Ç sorunları ve OpenSSL sorunları dahil olmak üzere çok çeşitli uyumluluk sorunlarını test etmek için kullanılan döngüler için.
  • com.google.test.loops.performance : Cihazın performansını test etmek için kullanılan döngüler için. Örneğin, yeni bir cihazın nasıl davrandığını görmek için bir oyun en karmaşık grafik ayarlarında çalışabilir.

Uygulamanızın aynı etiketle döngüler çalıştırmasını sağlamak için:

  • Test Döngüsü Yöneticisiyle bir test çalıştırıyorsanız:

    1. Uygulamanızın manifest dosyasına aşağıdaki meta veri satırını ekleyin ve LABEL_NAME etiketini istediğiniz bir etiketle değiştirin:

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

      android:value alanında, etiketlemek istediğiniz döngüleri temsil eden bir aralık veya 1 ila 1024 (tek bir test için izin verilen maksimum döngü sayısı) arasında bir tam sayı kümesi belirtebilirsiniz. Döngülerin 0'dan değil 1'den başlayarak dizine eklendiğini unutmayın. Örneğin, android:value="1,3-5" LABEL_NAME 1, 3, 4 ve 5 numaralı döngülere uygular.

    2. Test Loop Manager uygulamasında Etiketler alanına bir veya daha fazla etiket girin.

  • Firebase konsoluyla bir test çalıştırıyorsanız Etiketler alanına bir veya daha fazla etiket girin.

  • gcloud CLI ile bir test çalıştırıyorsanız --scenario-labels işaretini (ör. --scenario-labels=performance,gpu ) kullanarak bir veya daha fazla senaryo etiketi belirtin.

Uygulama lisanslama desteği

Test Lab, Google Play tarafından sunulan Uygulama Lisanslama hizmetini kullanan uygulamaları destekler. Uygulamanızı Test Lab ile test ederken lisanslamayı başarılı bir şekilde kontrol etmek için uygulamanızı Play Store'daki üretim kanalında yayınlamanız gerekir. Uygulamanızı Test Lab'ı kullanarak alfa veya beta kanalında test etmek için uygulamanızı Test Lab'a yüklemeden önce lisans kontrolünü kaldırın.

Bilinen Sorunlar

Test Laboratuvarı'ndaki Oyun Döngüsü testlerinde aşağıdaki bilinen sorunlar mevcuttur:

  • Bazı çökmeler geri izlemeyi desteklemez. Örneğin, bazı sürüm yapıları prctl(PR_SET_DUMPABLE, 0) kullanılarak debuggerd işleminin çıktısını bastırabilir. Daha fazla bilgi edinmek için debuggerd bakın.
  • API Düzeyi 19, dosya izin hataları nedeniyle şu anda desteklenmiyor.