Oyun Döngüsü testlerini kullanmaya başlayın

Oyun uygulamaları farklı kullanıcı arayüzü çerçeveleri üzerine oluşturulduğunda oyun testlerini otomatikleştirmek zor olabilir. Oyun döngüsü testleri, yerel testlerinizi Test Lab ile entegre etmenize ve seçtiğiniz cihazlarda kolayca çalıştırmanıza olanak tanır. Oyun döngüsü testi, gerçek bir oyuncunun eylemlerini simüle ederek testinizi oyun uygulamanız üzerinden çalıştırır. Bu kılavuzda, Oyun Döngüsü testini nasıl çalıştıracağınız, ardından test sonuçlarınızı Firebase konsolunda nasıl görüntüleyip yöneteceğiniz açıklanmaktadır.

Oyun döngüsü testi nedir?

Oyun uygulamaları Unity, Unreal veya OpenGL/Vulkan C++ kodu gibi farklı kullanıcı arayüzü çerçeveleri ve motorlarında oluşturulduğundan standart otomasyon araçları kullanıcı arayüzü öğelerini inceleyemez veya bunlarla etkileşim kuramaz. Oyun döngüsü testi, oyununuzu belirli bir senaryo numarası içeren bir intent ile başlatarak yerel motor testlerinizi Test Lab ile entegre etmenize olanak tanır. Bu senaryo numarası, uygulamanızın doğrudan oyun motorunuzda önceden yazılmış mantığı, yapay zeka simülasyonlarını veya performans kontrollerini çalıştırmasını ister.

Başlatıldıktan sonra Test Lab, oyununuzun kullanıcı arayüzüyle başka bir etkileşimde bulunmaz. Bunun yerine Test Lab, test taşıma ve ortamı olarak görev yapar: Belirli bir senaryoyu başlatır, kilitlenmeleri ve zaman aşımlarını izler ve uygulamanız döngüyü çalıştırmayı tamamladığında özel sonuç günlüklerini toplar.

Oyun döngülerinin enstrümantasyon testlerinden farkı

  • Enstrümantasyon testleri (ör. Espresso veya UI Automator), kullanıcı arayüzü etkileşimlerini yönlendirmek, düğmeleri tıklamak ve uygulamanızın dışından Android görünüm hiyerarşisi genelinde uygulama durumunu doğrulamak için harici çerçeveleri kullanır.
  • Oyun döngüsü testleri, test mantığını uygulamanıza devreder. Uygulamanız, harici kullanıcı arayüzü etkileşimi olmadan kendi dahili test döngüsünü veya simülasyonunu çalıştırırken Test Lab, senaryonuzu tetikler ve test çıkışını toplar.

Örnekler

Oyununuzun çeşitli fiziksel cihazlarda saniyede en az 60 kare hızını koruduğunu doğrulamak istediğinizi varsayalım. Görsel açıdan en karmaşık seviyenizi yüklemek ve yapay zeka oyuncusunun veya otomatik komut dosyasının iki dakika boyunca oynamasını sağlamak için oyun kodunuzda 1 senaryosunu uygulayabilirsiniz.

Test Lab, 1 senaryosunu tetiklediğinde oyununuz yapay zeka ile oynama sürecini başlatır, kare oluşturma sürelerini ve bellek kullanımını izler, bu metrikleri özel bir çıkış günlüğü dosyasına (logFile) aktarır ve tamamlandığında finish() işlevini çağırır. Test Lab, günlük dosyasını yakalar ve Cloud Storage ile Firebase konsolunda kullanımınıza sunar.

Kullanım alanları

Oyun motorunuza bağlı olarak tek veya birden fazla döngü içeren testler uygulayabilirsiniz. Döngü, oyun uygulamanızda testinizin tam veya kısmi bir çalıştırmasıdır. Oyun döngüleri şunlar için kullanılabilir:

  • Oyununuzun bir seviyesini son kullanıcının oynayacağı şekilde oynayın. Kullanıcının girişini komut dosyasıyla yazabilir, kullanıcının boşta kalmasına izin verebilir veya oyununuzda mantıklıysa kullanıcıyı yapay zekayla değiştirebilirsiniz (örneğin, bir yarış arabası oyun uygulamanız varsa ve halihazırda bir yapay zeka uyguladıysanız kullanıcının girişinden sorumlu bir yapay zeka sürücüsü koyabilirsiniz).
  • Cihazların destekleyip desteklemediğini görmek için oyununuzu en yüksek kalite ayarında çalıştırın.
  • Teknik test çalıştırma (birden fazla gölgelendiriciyi derleme, yürütme, çıkışın beklendiği gibi olup olmadığını kontrol etme vb.)

Oyun Döngüsü testini tek bir test cihazında, bir grup test cihazında veya Test Lab üzerinde çalıştırabilirsiniz. Ancak sanal cihazların grafik kare hızları fiziksel cihazlara göre daha düşük olduğundan Oyun Döngüsü testlerini sanal cihazlarda çalıştırmanızı önermiyoruz.

Başlamadan önce

Test uygulamak için öncelikle uygulamanızı Oyun Döngüsü testleri için yapılandırmanız gerekir.

  1. Uygulama manifest dosyanızda etkinliğinize yeni bir intent 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 sayede Test Lab, belirli bir intent ile tetikleyerek oyununuzu başlatabilir.

  2. Kodunuza (onCreate yöntem beyanının içine eklemenizi öneririz) aşağıdakileri ekleyin:

    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
    }

    Bu sayede etkinliğiniz, kendisini başlatan intent'i kontrol edebilir. İsterseniz bu kodu daha sonra da ekleyebilirsiniz (ör. oyun motorunuzu ilk kez yükledikten sonra).

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

    Kotlin

    yourActivity.finish()

    Java

    yourActivity.finish();

    Bu, Oyun Döngüsü 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çevesini kullanır ve uygulamanızı kapatmak, testin bittiğini bildirir.

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

Uygulamanızı Oyun Döngüsü testleri için yapılandırdıktan sonra hemen bir test oluşturup oyun uygulamanızda çalıştırabilirsiniz. Test Lab uygulamasında testi Firebase konsolunu veya gcloud komut satırı arayüzünü (CLI) kullanarak ya da Test Döngüsü Yöneticisi'ni kullanarak yerel bir cihazda çalıştırabilirsiniz.

Yerel bir cihazda çalıştırma

Test Lab'ın Test Döngüsü Yöneticisi, oyun döngüsü testlerini entegre etmenize ve yerel cihazlarınızda çalıştırmanıza yardımcı olan açık kaynaklı bir uygulamadır. Ayrıca kalite kontrol ekibinizin aynı oyun döngülerini kendi cihazlarında çalıştırmasına olanak tanır.

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

  1. Test Döngüsü Yöneticisi'ni bir telefon veya tablete indirip şu komutu çalıştırarak yükleyin:
    adb install testloopmanager.apk
  2. Cihazınızda, telefonunuzda veya tabletinizde Test Loop Apps uygulamasını açın. Uygulama, cihazınızda oyun döngüleriyle çalıştırılabilen uygulamaların listesini gösterir. Oyun uygulamanızı burada görmüyorsanız intent 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ı belirleyin. Not: Bu adımda, tek bir döngü yerine bir döngü alt kümesi çalıştırmayı seçebilirsiniz. Aynı anda birden fazla döngü çalıştırma hakkında daha fazla bilgi için İsteğe bağlı özellikler bölümüne bakın.
  4. Testi çalıştır'ı tıklayın. Testiniz hemen çalışmaya başlar.

Test Lab uygulamasında koşu

Firebase konsolunu veya gcloud CLI'yı kullanarak Test Lab üzerinde bir Oyun Döngüsü 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 Lab simgesini tıklayın.
  2. İlk Testinizi Çalıştırın'ı (veya projeniz daha önce bir test çalıştırdıysa Test Çalıştır'ı) tıklayın.
  3. Test türü olarak oyun döngüsü'nu seçin ve Devam'ı tıklayın.
  4. Göz at'ı tıklayın ve uygulamanızın .apk dosyasına gidin. Not: Bu adımda, tek bir döngü yerine bir döngü alt kümesi çalıştırmayı seçebilirsiniz. Aynı anda birden fazla döngü çalıştırma hakkında daha fazla bilgi için İsteğe bağlı özellikler başlıklı makaleyi inceleyin.
  5. Devam'ı tıklayın.
  6. Uygulamanızı test etmek için kullanılacak fiziksel cihazları seçin.
  7. Testleri Başlat'ı tıklayın.

Firebase konsolunu kullanmaya başlama hakkında daha fazla bilgi için Firebase konsoluyla test etmeye başlama başlıklı makaleyi inceleyin.

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

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

  2. Google Hesabınızı kullanarak gcloud CLI'da oturum açın:

    gcloud auth login

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

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

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

gcloud CLI'yı kullanmaya başlama hakkında daha fazla bilgi için gcloud komut satırından test etmeye başlama başlıklı makaleyi inceleyin.

İsteğe bağlı özellikler

Test Lab, testlerinizi daha da özelleştirmenize olanak tanıyan çeşitli isteğe bağlı özellikler sunar. Bu özellikler arasında çıkış verileri yazma, birden fazla oyun döngüsü desteği ve ilgili döngüler için etiketler yer alır.

Çıkış verilerini yazma

Test Lab, oyununuzu başlattığında test cihazındaki yerel bir sonuç dosyasını işaret eden bir URL belirtir. Bu dosyaya launchIntent.getData() kullanılarak erişilebilir. Oyununuz, test çalıştırmanız sırasında test sonuçlarını, performans metriklerini ve günlükleri (logFile) doğrudan bu konuma yazabilir.

logFile dosyasına düz metin, CSV verileri, kare oluşturma süreleri veya özel teşhis raporları gibi herhangi bir içerik yazabilirsiniz. Yazdığınız içerik için herhangi bir kısıtlama veya biçimlendirme şartı yoktur. Testiniz bittiğinde dosyayı yakalar ve diğer test yapılarınızla birlikte Cloud Storage paketinize yükler.

Test Lab, Dosya Paylaşma bölümünde açıklanan, uygulamalar arasında dosya paylaşımıyla ilgili en iyi uygulamaları takip eder. Intent'inizin bulunduğu etkinliğinizin onCreate() yönteminde, aşağıdaki kodu çalıştırarak veri çıkış dosyanızı alabilir ve kontrol edebilirsiniz:

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

Oyun uygulamanızın C++ tarafındaki dosyaya yazmak istiyorsanız dosya yolu yerine dosya tanımlayıcıyı iletebilirsiniz:

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

Çıkış dosyası örneği

Test Lab, logFile için belirli bir biçim gerektirmese de çıkışınızı aşağıdaki şemayla eşleşen JSON olarak yapılandırmak, Firebase konsolunun (https://console.firebase.google.com/project/_/testlab) oyun döngüsü testinizle ilgili özet metrikleri ayrıştırıp görüntülemesine olanak tanır.

Bu örnekle ilgili önemli ayrıntılar:

  • Verileri kim sağlar: Tüm metrikleri hesaplayıp oyun kodunuzdan bu dosyaya yazmaktan siz (test geliştiricisi) sorumlusunuz. Test Lab, bu veri noktalarını sizin için otomatik olarak toplamaz veya oluşturmaz.
  • Özel alanlar ekleme: /.../ olarak işaretlenen alanlar, rastgele özel anahtar/değer çiftleri (ör. "rendered_vertices": 12000 veya "ai_error_count": 0) ekleyebileceğiniz yerleri gösterir. Uygulamanızdan dosya yazarken, alan adları name veya start_timestamp gibi şema alanlarıyla çakışmadığı sürece çıkışınıza geçerli herhangi bir JSON özelliği ekleyebilirsiniz.
  • Çıkış dosyasını nerede bulabilirsiniz? Testiniz tamamlandıktan sonra ham çıkış dosyanız, projenizin Cloud Storage (GCS) sonuç paketinde, test çalıştırması yapı dizininde depolanır ve indirilebilir. Ayrıştırılmış çıkışı Firebase konsolunun Test Lab sayfasında da görüntüleyebilir ve inceleyebilirsiniz.

Aşağıda, yapılandırılmış JSON çıkış dosyası örneği verilmiştir:

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

Birden fazla oyun döngüsü

Uygulamanızda birden fazla oyun döngüsü çalıştırmayı faydalı bulabilirsiniz. Döngü, oyun uygulamanızın baştan sona tam bir çalıştırmasıdır. Örneğin, oyununuzda birden fazla seviye varsa tüm seviyeleri tek bir döngüde tekrarlamak yerine her seviyeyi başlatmak için bir oyun döngüsü kullanabilirsiniz. Böylece, uygulamanız 32. seviyede kilitlenirse kilitlenmeyi yeniden oluşturmak ve hata düzeltmelerini test etmek için doğrudan ilgili 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öneticisi ile test yapıyorsanız:

    1. Uygulamanızın manifest dosyasındaki <application> öğesine aşağıdaki satırı ekleyin:

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

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

    2. Test Döngüsü Yöneticisi uygulamasında, çalıştırmak istediğiniz döngüleri seçmenize olanak tanıyan 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 test çalıştırıyorsanız Senaryolar alanına bir liste veya döngü numarası aralığı girin.

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

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

    Kotlin

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

    Java

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

    Artık döngünüzün davranışını, elde edilen int değerine göre değiştirebilirsiniz.

Oyun döngülerini etiketleme

Oyun döngülerinizi bir veya daha fazla senaryo etiketiyle etiketlediğinizde siz ve kalite güvencesi ekibiniz, bir dizi ilgili oyun döngüsünü (ör. "tüm uyumluluk oyun döngüleri") kolayca 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 oynayan gerçek bir kullanıcının deneyimini yeniden oluşturmak için kullanılan for döngüleri. Bu döngülerle test etmenin 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. Bu döngülerle test yapmanın amacı, üretimde düzgün çalışmayabilecek GPU kodunu çalıştırarak donanım ve sürücülerle ilgili sorunları ortaya çıkarmaktır.
  • com.google.test.loops.compatibility: Giriş/çıkış sorunları ve OpenSSL sorunları dahil olmak üzere çok çeşitli uyumluluk sorunlarını test etmek için kullanılan for döngüleri.
  • com.google.test.loops.performance: Cihazın performansını test etmek için kullanılan for döngüleri. Örneğin, yeni bir cihazın nasıl davrandığını görmek için bir oyun en karmaşık grafik ayarlarında çalıştırılabilir.

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

  • Test Döngüsü Yöneticisi ile test yapıyorsanız:

    1. Uygulamanızın manifest dosyasına aşağıdaki meta veri satırını ekleyin ve LABEL_NAME yerine istediğiniz bir etiketi yazın:

      <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 1 ile 1024 (tek bir test için izin verilen maksimum döngü sayısı) arasında bir aralık veya 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", 1, 3, 4 ve 5 numaralı döngülere LABEL_NAME uygular.

    2. Test Döngüsü Yöneticisi uygulamasında, Etiketler alanına bir veya daha fazla etiket girin.

  • Firebase konsoluyla test yapıyorsanız Etiketler alanına bir veya daha fazla etiket girin.

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

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ıyla 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 platformuna yüklemeden önce lisans kontrolünü kaldırın.

Bilinen sorunlar

Test Lab uygulamasındaki Oyun Döngüsü testlerinde aşağıdaki bilinen sorunlar vardır:

  • Bazı kilitlenmeler, geri izlemeleri desteklemez. Örneğin, bazı yayınlanan derlemeler prctl(PR_SET_DUMPABLE, 0) kullanarak debuggerd işleminin çıkışını gizleyebilir. Daha fazla bilgi için debuggerd başlıklı makaleyi inceleyin.
  • API düzeyi 19, dosya izni hataları nedeniyle şu anda desteklenmiyor.