Catch up on highlights from Firebase at Google I/O 2023. Learn more

Bắt đầu với thử nghiệm Vòng lặp trò chơi

Có thể khó tự động hóa thử nghiệm trò chơi khi các ứng dụng trò chơi được xây dựng trên các khung giao diện người dùng khác nhau. Các thử nghiệm Vòng lặp trò chơi cho phép bạn tích hợp các thử nghiệm gốc của mình với Test Lab và dễ dàng chạy chúng trên các thiết bị bạn chọn. Thử nghiệm Vòng lặp trò chơi chạy thử nghiệm của bạn thông qua ứng dụng trò chơi trong khi mô phỏng hành động của một người chơi thực. Hướng dẫn này chỉ cho bạn cách chạy thử nghiệm Vòng lặp trò chơi, sau đó xem và quản lý kết quả thử nghiệm của bạn trong bảng điều khiển Firebase.

Tùy thuộc vào công cụ trò chơi của bạn, bạn có thể triển khai thử nghiệm với một hoặc nhiều vòng lặp . Vòng lặp là quá trình chạy toàn bộ hoặc một phần thử nghiệm trên ứng dụng trò chơi của bạn. Vòng lặp trò chơi có thể được sử dụng để:

  • Chạy một cấp độ trong trò chơi của bạn giống như cách người dùng cuối sẽ chơi cấp độ đó. Bạn có thể viết kịch bản đầu vào của người dùng, để người dùng ở chế độ chờ hoặc thay thế người dùng bằng AI nếu điều đó hợp lý trong trò chơi của bạn (ví dụ: giả sử bạn có ứng dụng trò chơi ô tô đua và đã triển khai AI. Bạn có thể dễ dàng đặt trình điều khiển AI phụ trách đầu vào của người dùng).
  • Chạy trò chơi của bạn ở cài đặt chất lượng cao nhất để xem thiết bị có hỗ trợ không.
  • Chạy thử nghiệm kỹ thuật (biên dịch nhiều trình đổ bóng, thực thi chúng, kiểm tra xem đầu ra có như mong đợi không, v.v.).

Bạn có thể chạy thử nghiệm Vòng lặp trò chơi trên một thiết bị thử nghiệm, một nhóm thiết bị thử nghiệm hoặc trên Test Lab. Tuy nhiên, chúng tôi khuyên bạn không nên chạy thử nghiệm Vòng lặp trò chơi trên thiết bị ảo vì chúng có tốc độ khung hình đồ họa thấp hơn so với thiết bị vật lý.

Trước khi bắt đầu

Để triển khai thử nghiệm, trước tiên bạn phải định cấu hình ứng dụng của mình cho thử nghiệm Vòng lặp trò chơi.

  1. Trong bảng kê khai ứng dụng của bạn, hãy thêm bộ lọc ý định mới vào hoạt động của bạn :

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

    Điều này cho phép Test Lab khởi chạy trò chơi của bạn bằng cách kích hoạt trò chơi đó với một mục đích cụ thể.

  2. Trong mã của bạn (chúng tôi khuyên bạn nên sử dụng bên trong khai báo phương thức onCreate ), hãy thêm vào như sau:

    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
    }

    Điều này cho phép hoạt động của bạn kiểm tra ý định khởi chạy nó. Bạn cũng có thể thêm mã này sau nếu muốn (ví dụ: sau khi tải công cụ trò chơi của bạn lần đầu).

  3. Khuyến nghị: Khi kết thúc bài kiểm tra, hãy thêm:

    Kotlin+KTX

    yourActivity.finish()

    Java

    yourActivity.finish();

    Thao tác này sẽ đóng ứng dụng của bạn khi quá trình kiểm tra Vòng lặp trò chơi hoàn tất. Thử nghiệm dựa vào khung giao diện người dùng của ứng dụng để bắt đầu vòng lặp tiếp theo và việc đóng ứng dụng của bạn sẽ cho biết rằng thử nghiệm đã kết thúc.

Tạo và chạy thử nghiệm Vòng lặp trò chơi

Sau khi định cấu hình ứng dụng của mình cho các thử nghiệm Vòng lặp trò chơi, bạn có thể tạo ngay một thử nghiệm và chạy thử nghiệm đó trong ứng dụng trò chơi của mình. Bạn có thể chọn chạy thử nghiệm trong Phòng thí nghiệm thử nghiệm bằng bảng điều khiển Firebase hoặc giao diện dòng lệnh gcloud (CLI) hoặc trên thiết bị cục bộ bằng Trình quản lý vòng lặp thử nghiệm .

Chạy trên thiết bị cục bộ

Trình quản lý vòng lặp thử nghiệm của Test Lab là một ứng dụng mã nguồn mở giúp bạn tích hợp các thử nghiệm Vòng lặp trò chơi và chạy chúng trên các thiết bị cục bộ của bạn. Nó cũng cho phép nhóm Đảm bảo chất lượng của bạn chạy các vòng lặp trò chơi tương tự trên thiết bị của họ.

Để chạy thử nghiệm trên thiết bị cục bộ bằng Trình quản lý vòng lặp thử nghiệm:

  1. Tải xuống Trình quản lý vòng lặp thử nghiệm trên điện thoại hoặc máy tính bảng và cài đặt nó bằng cách chạy:
    adb install testloopmanager.apk
  2. Trên thiết bị của bạn, hãy mở ứng dụng Ứng dụng vòng lặp thử nghiệm trên điện thoại hoặc máy tính bảng của bạn. Ứng dụng hiển thị danh sách các ứng dụng trên thiết bị của bạn có thể chạy với vòng lặp trò chơi. Nếu bạn không thấy ứng dụng trò chơi của mình ở đây, hãy đảm bảo rằng bộ lọc ý định của bạn khớp với bộ lọc được mô tả trong bước đầu tiên của phần Trước khi bạn bắt đầu .
  3. Chọn ứng dụng trò chơi của bạn, sau đó chọn số vòng lặp bạn muốn chạy. Lưu ý: Ở bước này, bạn có thể chọn chạy một tập hợp con các vòng lặp thay vì chỉ một vòng lặp. Để biết thêm thông tin về cách chạy nhiều vòng lặp cùng một lúc, hãy xem Các tính năng tùy chọn.
  4. Nhấp vào Chạy thử nghiệm . Thử nghiệm của bạn bắt đầu chạy ngay lập tức.

Chạy trong Phòng thí nghiệm thử nghiệm

Bạn có thể chạy thử nghiệm Vòng lặp trò chơi trong Phòng thí nghiệm thử nghiệm bằng cách sử dụng bảng điều khiển Firebase hoặc gcloud CLI. Trước khi bạn bắt đầu, nếu bạn chưa có, hãy mở bảng điều khiển Firebase và tạo một dự án.

Sử dụng bảng điều khiển Firebase

  1. Trong bảng điều khiển Firebase, nhấp vào Phòng thí nghiệm thử nghiệm từ bảng điều khiển bên trái.
  2. Nhấp vào Chạy thử nghiệm đầu tiên của bạn (hoặc Chạy thử nghiệm nếu dự án của bạn đã chạy thử nghiệm trước đó).
  3. Chọn Vòng lặp trò chơi làm loại kiểm tra, sau đó nhấp vào Tiếp tục .
  4. Nhấp vào Duyệt rồi duyệt đến tệp .apk của ứng dụng của bạn. Lưu ý: Ở bước này, bạn có thể chọn chạy một tập hợp con các vòng lặp thay vì chỉ một vòng lặp. Để biết thêm thông tin về cách chạy nhiều vòng lặp cùng một lúc, hãy xem Các tính năng tùy chọn.
  5. Nhấp vào Tiếp tục .
  6. Chọn các thiết bị vật lý sẽ sử dụng để kiểm tra ứng dụng của bạn.
  7. Nhấp vào Bắt đầu kiểm tra .

Để biết thêm thông tin về cách bắt đầu với bảng điều khiển Firebase, hãy xem Bắt đầu thử nghiệm với bảng điều khiển Firebase.

Sử dụng dòng lệnh gcloud (CLI)

  1. Nếu bạn chưa có, hãy tải xuống và cài đặt Google Cloud SDK.

  2. Đăng nhập vào gcloud CLI bằng tài khoản Google của bạn:

    gcloud auth login

  3. Đặt dự án Firebase của bạn trong gcloud, trong đó PROJECT_ID là ID của dự án Firebase của bạn:

    gcloud config set project PROJECT_ID
    
  4. Chạy thử nghiệm đầu tiên của bạn:

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

Để biết thêm thông tin về cách bắt đầu với gcloud CLI, hãy xem Bắt đầu thử nghiệm từ dòng lệnh gcloud.

Tính năng tùy chọn

Test Lab cung cấp một số tính năng tùy chọn cho phép bạn tùy chỉnh thêm các thử nghiệm của mình, bao gồm khả năng ghi dữ liệu đầu ra, hỗ trợ nhiều vòng lặp trò chơi và nhãn cho các vòng lặp liên quan.

Ghi dữ liệu đầu ra

Thử nghiệm Vòng lặp trò chơi của bạn có thể ghi đầu ra vào một tệp được chỉ định trong phương thức launchIntent.getData() . Sau khi chạy thử nghiệm, bạn có thể truy cập dữ liệu đầu ra này trong phần Phòng thí nghiệm thử nghiệm của bảng điều khiển Firebase (xem ví dụ về tệp đầu ra thử nghiệm Vòng lặp trò chơi ).

Test Lab tuân theo các phương pháp hay nhất để chia sẻ tệp giữa các ứng dụng được mô tả trong phần Chia sẻ tệp . Trong phương thức onCreate() của hoạt động, nơi đặt ý định của bạn, bạn có thể kiểm tra tệp đầu ra dữ liệu của mình bằng cách chạy mã sau:

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

Nếu bạn muốn ghi vào tệp từ phía C++ của ứng dụng trò chơi của mình, bạn có thể chuyển vào bộ mô tả tệp thay vì đường dẫn tệp:

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

Ví dụ về tệp đầu ra

Bạn có thể sử dụng các tệp dữ liệu đầu ra (được định dạng như ví dụ bên dưới) để hiển thị kết quả kiểm tra vòng lặp trò chơi trong phần Phòng thí nghiệm kiểm tra của bảng điều khiển Firebase. Các khu vực được hiển thị dưới dạng /.../ có thể chứa bất kỳ trường tùy chỉnh nào mà bạn cần, miễn là chúng không xung đột với tên của các trường khác được sử dụng trong tệp này:

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

Nhiều vòng lặp trò chơi

Bạn có thể thấy hữu ích khi chạy nhiều vòng lặp trò chơi trong ứng dụng của mình. Vòng lặp là toàn bộ ứng dụng trò chơi của bạn từ đầu đến cuối. Ví dụ: nếu bạn có nhiều cấp độ trong trò chơi của mình, bạn có thể muốn có một vòng lặp trò chơi để khởi chạy từng cấp độ thay vì có một vòng lặp lặp qua tất cả các cấp độ đó. Bằng cách đó, nếu ứng dụng của bạn gặp sự cố ở cấp 32, bạn có thể trực tiếp khởi chạy vòng lặp trò chơi đó để tái tạo sự cố và kiểm tra các bản sửa lỗi.

Để cho phép ứng dụng của bạn chạy nhiều vòng lặp cùng một lúc:

  • Nếu bạn đang chạy thử nghiệm với Trình quản lý vòng lặp thử nghiệm:

    1. Thêm dòng sau vào bảng kê khai ứng dụng của bạn, bên trong phần tử <application> :

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

      Mục đích khởi chạy này chứa vòng lặp đích dưới dạng tham số số nguyên. Trong trường android:value , bạn có thể chỉ định một số nguyên từ 1 đến 1024 (số vòng lặp tối đa được phép cho một lần kiểm tra). Lưu ý rằng các vòng lặp được lập chỉ mục bắt đầu từ 1, không phải 0.

    2. Trong ứng dụng Trình quản lý vòng lặp kiểm tra, một màn hình lựa chọn xuất hiện cho phép bạn chọn (các) vòng lặp mà bạn muốn chạy. Nếu bạn chọn nhiều vòng lặp, mỗi vòng lặp sẽ được khởi chạy theo trình tự sau khi vòng lặp trước đó hoàn tất.

  • Nếu bạn đang chạy thử nghiệm với bảng điều khiển Firebase, hãy nhập danh sách hoặc một dải số vòng lặp vào trường Kịch bản .

  • Nếu bạn đang chạy thử nghiệm với gcloud CLI, hãy chỉ định danh sách số vòng lặp bằng cách sử dụng cờ --scenario-numbers . Ví dụ: --scenario-numbers=1,3,5 chạy các vòng 1, 3 và 5.

  • Nếu bạn đang viết C++ và muốn thay đổi hành vi của vòng lặp, hãy chuyển phần bổ sung sau vào mã C++ gốc của bạn:

    Kotlin+KTX

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

    Java

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

    Bây giờ bạn có thể thay đổi hành vi của vòng lặp dựa trên giá trị int kết quả.

Dán nhãn vòng lặp trò chơi

Khi bạn gắn nhãn các vòng lặp trò chơi của mình bằng một hoặc nhiều nhãn kịch bản, bạn và nhóm QA của bạn có thể dễ dàng khởi chạy một tập hợp các vòng lặp trò chơi có liên quan (ví dụ: "tất cả các vòng lặp trò chơi tương thích") và kiểm tra chúng trong một ma trận duy nhất. Bạn có thể tạo nhãn của riêng mình hoặc sử dụng nhãn xác định trước do Test Lab cung cấp:

  • com.google.test.loops.player_experience : Dành cho các vòng lặp được sử dụng để tái tạo trải nghiệm thực của người dùng khi chơi trò chơi. Mục tiêu của thử nghiệm với các vòng lặp này là tìm ra các vấn đề mà người dùng thực sẽ gặp phải khi chơi trò chơi.
  • com.google.test.loops.gpu_compatibility : Dành cho các vòng lặp được sử dụng để kiểm tra các sự cố liên quan đến GPU. Mục tiêu của thử nghiệm với các vòng lặp này là để thực thi mã GPU có thể không chạy đúng cách trong quá trình sản xuất, để phát hiện các sự cố với phần cứng và trình điều khiển.
  • com.google.test.loops.compatibility : Vòng lặp dành cho các vòng lặp được sử dụng để kiểm tra nhiều vấn đề về khả năng tương thích, bao gồm các vấn đề về I/O và các vấn đề về OpenSSL.
  • com.google.test.loops.performance : Dành cho các vòng lặp dùng để kiểm tra hiệu suất của thiết bị. Ví dụ: một trò chơi có thể chạy ở cài đặt đồ họa phức tạp nhất để xem thiết bị mới hoạt động như thế nào.

Để cho phép ứng dụng của bạn chạy các vòng lặp có cùng nhãn:

  • Nếu bạn đang chạy thử nghiệm với Trình quản lý vòng lặp thử nghiệm:

    1. Trong tệp kê khai ứng dụng của bạn, hãy thêm dòng siêu dữ liệu sau và thay thế LABEL_NAME bằng nhãn bạn chọn:

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

      Trong trường android:value , bạn có thể chỉ định một phạm vi hoặc một tập hợp các số nguyên từ 1 đến 1024 (số vòng lặp tối đa được phép cho một lần kiểm tra) đại diện cho các vòng lặp mà bạn muốn gắn nhãn. Lưu ý rằng các vòng lặp được lập chỉ mục bắt đầu từ 1, không phải 0. Ví dụ: android:value="1,3-5" áp dụng LABEL_NAME cho các vòng lặp 1, 3, 4 và 5.

    2. Trong ứng dụng Trình quản lý vòng lặp thử nghiệm, hãy nhập một hoặc nhiều nhãn vào trường Nhãn .

  • Nếu bạn đang chạy thử nghiệm với bảng điều khiển Firebase, hãy nhập một hoặc nhiều nhãn vào trường Nhãn .

  • Nếu bạn đang chạy thử nghiệm với gcloud CLI, hãy chỉ định một hoặc nhiều nhãn kịch bản bằng cách sử dụng cờ --scenario-labels (ví dụ: --scenario-labels=performance,gpu ).

Hỗ trợ cấp phép ứng dụng

Test Lab hỗ trợ các ứng dụng sử dụng dịch vụ Cấp phép ứng dụng do Google Play cung cấp. Để kiểm tra thành công việc cấp phép khi thử nghiệm ứng dụng của bạn với Test Lab, bạn phải xuất bản ứng dụng của mình lên kênh sản xuất trong Cửa hàng Play. Để thử nghiệm ứng dụng của bạn trong kênh alpha hoặc beta bằng Test Lab, hãy xóa kiểm tra cấp phép trước khi tải ứng dụng của bạn lên Test Lab.

Các vấn đề đã biết

Các thử nghiệm Vòng lặp trò chơi trong Test Lab có các vấn đề đã biết sau đây:

  • Một số sự cố không hỗ trợ dấu vết ngược. Ví dụ: một số bản dựng phát hành có thể chặn đầu ra của quy trình debuggerd bằng cách sử dụng prctl(PR_SET_DUMPABLE, 0) . Để tìm hiểu thêm, hãy xem debuggerd .
  • API cấp 19 hiện không được hỗ trợ do lỗi cấp phép tệp.