Check out what’s new from Firebase@ Google I/O 2021, and join our alpha program for early access to the new Remote Config personalization feature. Learn more

Zacznij od testów pętli gry Lo

Automatyzacja testowania gier może być trudna, gdy aplikacje do gier są zbudowane na różnych platformach interfejsu użytkownika. Testy Game Loop umożliwiają integrację testów natywnych z Test Lab i łatwe uruchamianie ich na wybranych przez Ciebie urządzeniach. Test pętli gry przeprowadza test w aplikacji do gier, symulując działania prawdziwego gracza. Z tego przewodnika dowiesz się, jak uruchomić test pętli gry, a następnie wyświetlić wyniki testu i zarządzać nimi w konsoli Firebase.

W zależności od silnika gry możesz zaimplementować testy z jedną lub wieloma pętlami . Pętla to pełne lub częściowe wykonanie testu w aplikacji do gier. Pętle gry mogą służyć do:

  • Uruchom poziom swojej gry w taki sam sposób, w jaki grałby w nią użytkownik końcowy. Możesz albo oskryptować dane wprowadzone przez użytkownika, pozwolić mu być bezczynnym, albo zastąpić użytkownika sztuczną inteligencją, jeśli ma to sens w twojej grze (np. załóżmy, że masz aplikację do gier wyścigowych i masz już zaimplementowaną sztuczną inteligencję). łatwo umieścić sterownik AI odpowiedzialny za dane wejściowe użytkownika).
  • Uruchom grę w ustawieniach najwyższej jakości, aby sprawdzić, czy urządzenia ją obsługują.
  • Uruchom test techniczny (skompiluj wiele shaderów, wykonaj je, sprawdź, czy dane wyjściowe są zgodne z oczekiwaniami itp.).

Test pętli gry można uruchomić na pojedynczym urządzeniu testowym, zestawie urządzeń testowych lub w laboratorium testowym. Nie zalecamy jednak uruchamiania testów Game Loop na urządzeniach wirtualnych, ponieważ mają one mniejszą liczbę klatek na sekundę niż urządzenia fizyczne.

Zanim zaczniesz

Aby zaimplementować test, musisz najpierw skonfigurować swoją aplikację do testów pętli gry.

  1. W manifeście aplikacji dodaj nowy filtr intencji do swojej aktywności :

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

    Dzięki temu Test Lab może uruchomić grę, uruchamiając ją w określonym celu.

  2. W swoim kodzie (zalecamy w deklaracji metody onCreate ) dodaj:

    Jawa

    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
    }

    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
    }

    Dzięki temu Twoja aktywność może sprawdzić intencję, która ją uruchamia. Możesz również dodać ten kod później, jeśli wolisz (np. po początkowym załadowaniu silnika gry).

  3. Zalecane: Na koniec testu dodaj:

    Jawa

    yourActivity.finish();

    Kotlin+KTX

    yourActivity.finish()

    Spowoduje to zamknięcie aplikacji po zakończeniu testu pętli gry. Test opiera się na strukturze interfejsu użytkownika aplikacji, aby rozpocząć następną pętlę, a zamknięcie aplikacji informuje o zakończeniu testu.

Utwórz i uruchom test pętli gry

Po skonfigurowaniu aplikacji do testów Game Loop możesz natychmiast utworzyć test i uruchomić go w aplikacji do gier. Możesz uruchomić test w laboratorium testowym za pomocą konsoli Firebase, interfejsu wiersza poleceń (CLI) gcloud lub na urządzeniu lokalnym za pomocą Menedżera pętli testowych .

Uruchom na urządzeniu lokalnym

Test Loop Manager firmy Test Lab to aplikacja typu open source, która pomaga integrować testy pętli gry i uruchamiać je na urządzeniach lokalnych. Umożliwia także zespołowi kontroli jakości uruchamianie tych samych pętli gry na swoich urządzeniach.

Aby uruchomić test na urządzeniu lokalnym za pomocą Menedżera pętli testowych:

  1. Pobierz Test Loop Manager na telefon lub tablet i zainstaluj go, uruchamiając:
    adb install testloopmanager.apk
  2. Na urządzeniu otwórz aplikację Test Loop Apps na telefonie lub tablecie. Aplikacja wyświetla listę aplikacji na urządzeniu, które można uruchamiać z pętlami gier. Jeśli nie widzisz tutaj swojej aplikacji do gier, upewnij się, że filtr intencji odpowiada filtrowi opisanemu w pierwszym kroku sekcji Zanim zaczniesz .
  3. Wybierz swoją aplikację do gier, a następnie wybierz liczbę pętli, które chcesz uruchomić. Uwaga: W tym kroku możesz wybrać uruchomienie podzbioru pętli zamiast tylko jednej pętli. Aby uzyskać więcej informacji na temat uruchamiania wielu pętli naraz, zobacz Funkcje opcjonalne.
  4. Kliknij Uruchom test . Twój test zaczyna działać natychmiast.

Uruchom w laboratorium testowym

Test pętli gry możesz uruchomić w laboratorium testowym przy użyciu konsoli Firebase lub interfejsu wiersza polecenia gcloud. Zanim zaczniesz, jeśli jeszcze tego nie zrobiłeś, otwórz konsolę Firebase i utwórz projekt.

Użyj konsoli Firebase

  1. W konsoli Firebase kliknij Test Lab w lewym panelu.
  2. Kliknij Uruchom swój pierwszy test (lub Uruchom test, jeśli Twój projekt już wcześniej uruchamiał test).
  3. Wybierz Pętla gry jako typ testu, a następnie kliknij Kontynuuj .
  4. Kliknij przycisk Przeglądaj , a następnie przejdź do .apk aplikacji. Uwaga: W tym kroku możesz wybrać uruchomienie podzbioru pętli zamiast tylko jednej pętli. Aby uzyskać więcej informacji na temat uruchamiania wielu pętli jednocześnie, zobacz Funkcje opcjonalne.
  5. Kliknij Kontynuuj .
  6. Wybierz urządzenia fizyczne, których chcesz używać do testowania aplikacji.
  7. Kliknij Rozpocznij testy .

Aby uzyskać więcej informacji na temat rozpoczynania pracy z konsolą Firebase, zobacz Rozpoczynanie testowania za pomocą konsoli Firebase.

Użyj wiersza poleceń (CLI) gcloud

  1. Pobierz i zainstaluj pakiet Google Cloud SDK, jeśli jeszcze tego nie zrobiłeś .

  2. Zaloguj się do interfejsu wiersza polecenia gcloud przy użyciu swojego konta Google:

    gcloud auth login

  3. Ustaw projekt Firebase w gcloud, gdzie PROJECT_ID to identyfikator projektu Firebase:

    gcloud config set project PROJECT_ID
    
  4. Uruchom swój pierwszy test:

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

Więcej informacji na temat rozpoczynania pracy z interfejsem wiersza poleceń gcloud znajdziesz w artykule Rozpoczynanie testowania z wiersza poleceń gcloud.

Funkcje opcjonalne

Test Lab oferuje kilka opcjonalnych funkcji, które umożliwiają dalsze dostosowywanie testów, w tym możliwość zapisywania danych wyjściowych, obsługę wielu pętli gry i etykiety powiązanych pętli.

Zapisz dane wyjściowe

Test pętli gry może zapisywać dane wyjściowe do pliku określonego w launchIntent.getData() . Po uruchomieniu testu możesz uzyskać dostęp do tych danych wyjściowych w sekcji Laboratorium w konsoli Firebase (zobacz przykład pliku wyjściowego testu pętli gry ).

Test Lab stosuje najlepsze praktyki udostępniania pliku między aplikacjami opisane w sekcji Udostępnianie pliku . W onCreate() Twojej aktywności, w której znajduje się Twoja intencja, możesz sprawdzić plik wyjściowy danych, uruchamiając następujący kod:

Jawa

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

Kotlin+KTX

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

Jeśli chcesz pisać do pliku ze strony C++ aplikacji do gry, możesz przekazać deskryptor pliku zamiast ścieżki do pliku:

Jawa

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

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

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

Przykład pliku wyjściowego

Możesz użyć plików danych wyjściowych (sformatowanych jak w poniższym przykładzie), aby wyświetlić wyniki testów pętli gry w sekcji Test Lab konsoli Firebase. Obszary pokazane jako /.../ mogą zawierać dowolne pola niestandardowe, których potrzebujesz, o ile nie kolidują z nazwami innych pól użytych w tym pliku:

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

Wiele pętli gry

Przydatne może być uruchamianie wielu pętli gry w aplikacji. Pętla to kompletny przegląd aplikacji gry od początku do końca. Na przykład, jeśli masz wiele poziomów w grze, możesz chcieć mieć jedną pętlę gry, aby uruchomić każdy poziom, zamiast jednej pętli, która przechodzi przez wszystkie. W ten sposób, jeśli Twoja aplikacja ulegnie awarii na poziomie 32, możesz bezpośrednio uruchomić tę pętlę gry, aby odtworzyć awarię i przetestować poprawki błędów.

Aby umożliwić aplikacji uruchamianie wielu pętli jednocześnie:

  • Jeśli przeprowadzasz test za pomocą Test Loop Manager:

    1. Dodaj następujący wiersz do manifestu aplikacji, wewnątrz elementu <application> :

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

      Ten zamiar uruchomienia zawiera pętlę docelową jako parametr całkowity. W polu android:value możesz określić liczbę całkowitą od 1 do 1024 (maksymalna liczba pętli dozwolona dla pojedynczego testu). Zauważ, że pętle są indeksowane od 1, a nie od 0.

    2. W aplikacji Test Loop Manager pojawia się ekran wyboru, który pozwala wybrać, które pętle chcesz uruchomić. Jeśli wybierzesz wiele pętli, każda pętla zostanie uruchomiona po kolei po zakończeniu poprzedniej pętli.

  • Jeśli przeprowadzasz test w konsoli Firebase, wprowadź listę lub zakres numerów pętli w polu Scenariusze .

  • Jeśli przeprowadzasz test za pomocą interfejsu wiersza polecenia gcloud, określ listę numerów pętli za pomocą flagi --scenario-numbers . Na przykład --scenario-numbers=1,3,5 uruchamia pętle 1, 3 i 5.

  • Jeśli piszesz w C++ i chcesz zmienić zachowanie swojej pętli, przekaż następujący dodatek do swojego natywnego kodu C++:

    Jawa

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

    Kotlin+KTX

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

    Możesz teraz zmienić zachowanie swojej pętli na podstawie wynikowej wartości int .

Oznacz pętle gry

Gdy oznaczysz pętle gry jedną lub większą liczbą etykiet scenariuszy, Ty i Twój zespół ds. kontroli jakości możecie łatwo uruchomić zestaw powiązanych pętli gry (np. „wszystkie pętle gry zgodności”) i przetestować je w jednej macierzy. Możesz tworzyć własne etykiety lub korzystać z predefiniowanych etykiet oferowanych przez Test Lab:

  • com.google.test.loops.player_experience : dla pętli używanych do odtworzenia wrażenia rzeczywistego użytkownika podczas grania w grę. Celem testowania z tymi pętlami jest znalezienie problemów, z którymi zmierzy się prawdziwy użytkownik podczas grania w grę.
  • com.google.test.loops.gpu_compatibility : dla pętli używanych do testowania problemów związanych z GPU. Celem testowania za pomocą tych pętli jest wykonanie kodu GPU, który może nie działać poprawnie w środowisku produkcyjnym, aby ujawnić problemy ze sprzętem i sterownikami.
  • com.google.test.loops.compatibility : dla pętli używanych do testowania szerokiego zakresu problemów ze zgodnością, w tym problemów we/wy i OpenSSL.
  • com.google.test.loops.performance : dla pętli używanych do testowania wydajności urządzenia. Na przykład gra może działać przy najbardziej złożonych ustawieniach graficznych, aby zobaczyć, jak zachowuje się nowe urządzenie.

Aby umożliwić aplikacji uruchamianie pętli z tą samą etykietą:

  • Jeśli przeprowadzasz test za pomocą Test Loop Manager:

    1. W pliku manifestu aplikacji dodaj następujący wiersz metadanych i zastąp LABEL_NAME wybraną etykietą:

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

      W polu android:value możesz określić zakres lub zestaw liczb całkowitych od 1 do 1024 (maksymalna liczba pętli dozwolona dla pojedynczego testu), które reprezentują pętle, które chcesz oznaczyć etykietą. Pamiętaj, że pętle są indeksowane od 1, a nie od 0. Na przykład android:value="1,3-5" stosuje LABEL_NAME do pętli 1, 3, 4 i 5.

    2. W aplikacji Test Loop Manager wprowadź co najmniej jedną etykietę w polu Etykiety .

  • Jeśli przeprowadzasz test w konsoli Firebase, wpisz co najmniej jedną etykietę w polu Etykiety .

  • Jeśli przeprowadzasz test za pomocą interfejsu wiersza polecenia gcloud, określ co najmniej jedną etykietę scenariusza za pomocą flagi --scenario-labels (np. --scenario-labels=performance,gpu ).

Wsparcie licencjonowania aplikacji

Test Lab obsługuje aplikacje korzystające z usługi licencjonowania aplikacji oferowanej przez Google Play. Aby pomyślnie sprawdzić licencjonowanie podczas testowania aplikacji w Test Lab, musisz opublikować swoją aplikację w kanale produkcyjnym w Sklepie Play. Aby przetestować swoją aplikację w kanale alfa lub beta za pomocą laboratorium testowego, usuń sprawdzanie licencji przed przesłaniem aplikacji do laboratorium testowego.

Znane problemy

Testy pętli gry w laboratorium testowym mają następujące znane problemy:

  • Niektóre awarie nie obsługują śledzenia wstecznego. Na przykład niektóre kompilacje wydania mogą pomijać dane wyjściowe procesu debuggerd za pomocą prctl(PR_SET_DUMPABLE, 0) . Aby dowiedzieć się więcej, zobacz debuggerd .
  • Poziom 19 interfejsu API nie jest obecnie obsługiwany z powodu błędów uprawnień do plików.