Làm quen với kiểm thử Vòng lặp trò chơi

Có thể khó tự động hoá việc kiểm thử 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 bài kiểm thử Vòng lặp trò chơi cho phép bạn tích hợp các bài kiểm thử gốc với Test Lab và dễ dàng chạy các bài kiểm thử đó trên các thiết bị mà bạn chọn. Bài kiểm thử Vòng lặp trò chơi chạy bài kiểm thử thông qua ứng dụng trò chơi của bạn trong khi mô phỏng các hành động của một người chơi thực. Hướng dẫn này sẽ chỉ cho bạn cách chạy bài kiểm thử Vòng lặp trò chơi, sau đó xem và quản lý kết quả kiểm thử trong bảng điều khiển Firebase.

Tuỳ thuộc vào công cụ phát triển trò chơi, bạn có thể triển khai các bài kiểm thử có một hoặc nhiều vòng lặp. Vòng lặp là một lượt chạy đầy đủ hoặc một phần của bài kiểm thử trên ứng dụng trò chơi. Bạn có thể sử dụng vòng lặp trò chơi để:

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

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

Trước khi bắt đầu

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

  1. Trong tệp kê khai ứng dụng, hãy thêm một 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 đó bằng một ý định cụ thể.

  2. Trong mã của bạn (bạn nên đặt bên trong khai báo phương thức onCreate), hãy thêm nội dung sau:

    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
    }

    Điều này cho phép hoạt động của bạn kiểm tra ý định khởi chạy hoạt động đó. 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 ban đầu).

  3. Đề xuất: Ở cuối bài kiểm thử, hãy thêm:

    Kotlin

    yourActivity.finish()

    Java

    yourActivity.finish();

    Lệnh này sẽ đóng ứng dụng của bạn khi bài kiểm thử Vòng lặp trò chơi hoàn tất. Bài kiểm thử 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 sẽ cho biết rằng bài kiểm thử đã hoàn tất.

Tạo và chạy bài kiểm thử Vòng lặp trò chơi

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

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

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

Cách chạy bài kiểm thử 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 Trình quản lý vòng lặp thử nghiệm xuống điện thoại hoặc máy tính bảng và cài đặt bằng cách chạy:
    adb install testloopmanager.apk
  2. Trên thiết bị, hãy mở ứng dụng Test Loop Apps (Ứng dụng vòng lặp kiểm thử) trên điện thoại hoặc máy tính bảng. Ứng dụng này hiển thị danh sách các ứng dụng trên thiết bị có thể chạy bằng 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 bộ lọc ý định của bạn khớp với bộ lọc ý định được mô tả trong bước đầu tiên của phần Trước khi bắt đầu.
  3. Chọn ứng dụng trò chơi, sau đó chọn số vòng lặp mà 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 phần Các tính năng không bắt buộc.
  4. Nhấp vào Run test (Chạy bài kiểm thử). Bài kiểm thử sẽ bắt đầu chạy ngay lập tức.

Chạy trong Test Lab

Bạn có thể chạy bài kiểm thử Vòng lặp trò chơi trong Test Lab bằng Firebase bảng điều khiển hoặc CLI gcloud. Trước khi bắt đầu, nếu 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, hãy nhấp vào Test Lab ở bảng điều khiển bên trái.
  2. Nhấp vào Run Your First Test (Chạy bài kiểm thử đầu tiên) (hoặc Run a Test (Chạy bài kiểm thử) nếu dự án của bạn đã chạy bài kiểm thử trước đó).
  3. Chọn Game Loop (Vòng lặp trò chơi) làm loại bài kiểm thử, sau đó nhấp vào Continue (Tiếp tục).
  4. Nhấp vào Browse (Duyệt tìm), sau đó duyệt tìm đến tệp .apk của ứng dụng. 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 không bắt buộc.
  5. Nhấp vào Continue (Tiếp tục).
  6. Chọn các thiết bị thực để dùng kiểm thử ứng dụng.
  7. Nhấp vào Start Tests (Bắt đầu kiểm thử).

Để biết thêm thông tin về cách bắt đầu sử dụng bảng điều khiển Firebase, hãy xem bài viết Bắt đầu kiểm thử bằng bảng điều khiển Firebase.

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

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

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

    gcloud auth login

  3. Đặt dự án Firebase trong gcloud, trong đó PROJECT_ID là mã dự án Firebase:

    gcloud config set project PROJECT_ID
    
  4. Chạy bài kiểm thử đầu tiê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 sử dụng CLI gcloud, hãy xem Bắt đầu kiểm thử từ dòng lệnh gcloud.

Các tính năng không bắt buộc

Test Lab cung cấp một số tính năng không bắt buộc cho phép bạn tuỳ chỉnh thêm các bài kiểm thử , 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

Bài kiểm thử Vòng lặp trò chơi có thể ghi dữ liệu đầu ra vào một tệp được chỉ định trong phương thức launchIntent.getData(). Sau khi chạy bài kiểm thử, bạn có thể truy cập vào dữ liệu đầu ra này trong phần Test Lab của bảng điều khiển Firebase (xem ví dụ về tệp đầu ra của bài kiểm thử 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 bài viết Chia sẻ tệp. Trong phương thức onCreate() của hoạt động, nơi đặt ý định, bạn có thể kiểm tra tệp đầu ra dữ liệu bằng cách chạy mã sau:

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

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

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

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 thử vòng lặp trò chơi trong phần Test Lab 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 tuỳ chỉnh nào mà bạn cần, miễn là các trườ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 việc chạy nhiều vòng lặp trò chơi trong ứng dụng là hữu ích. Vòng lặp là một lượt chạy hoàn chỉnh của ứng dụng trò chơi từ đầu đến cuối. Ví dụ: nếu có nhiều cấp độ trong trò chơi, 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 lại tất cả các cấp độ. Bằng cách đó, nếu ứng dụng 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 thử các bản sửa lỗi.

Cách cho phép ứng dụng chạy nhiều vòng lặp cùng một lúc:

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

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

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

      Ý định khởi chạy này chứa vòng lặp mục tiêu 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 bài kiểm thử). Xin 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 thử nghiệm, một màn hình lựa chọn sẽ 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 bài kiểm thử bằng bảng điều khiển Firebase, hãy nhập danh sách hoặc a phạm vi số vòng lặp trong trường Scenarios.

  • Nếu bạn đang chạy bài kiểm thử bằng CLI gcloud, 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 lặp 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 truyền phần bổ sung sau vào mã C++ gốc:

    Kotlin

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

    Java

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

    Giờ đây, 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ả.

Gắn nhãn vòng lặp trò chơi

Khi bạn gắn nhãn vòng lặp trò chơi bằng một hoặc nhiều nhãn tình huống, bạn và nhóm Đảm bảo chất lượng có thể dễ dàng khởi chạy một tập hợp các vòng lặp trò chơi liên quan (ví dụ: "tất cả các vòng lặp trò chơi tương thích") và kiểm thử các vòng lặp đó trong một ma trận. Bạn có thể tạo nhãn của riêng mình hoặc sử dụng các nhãn được 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 dùng để tái tạo trải nghiệm của người dùng thực khi chơi trò chơi. Mục tiêu của việc kiểm thử bằng 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 dùng để kiểm thử các vấn đề liên quan đến GPU. Mục tiêu của việc kiểm thử bằng 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 vấn đề với phần cứng và trình điều khiển.
  • com.google.test.loops.compatibility: Dành cho các vòng lặp dùng để kiểm thử nhiều vấn đề về khả năng tương thích, bao gồm cả vấn đề về I/O và vấn đề về OpenSSL.
  • com.google.test.loops.performance: Dành cho các vòng lặp dùng để kiểm thử hiệu suất của thiết bị. Ví dụ: một trò chơi có thể chạy ở chế độ cài đặt đồ hoạ phức tạp nhất để xem thiết bị mới hoạt động như thế nào.

Cách cho phép ứng dụng chạy các vòng lặp có cùng nhãn:

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

    1. Trong tệp kê khai của ứng dụng, hãy thêm dòng siêu dữ liệu sau và thay thế LABEL_NAME bằng nhãn mà 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 bài kiểm thử) đại diện cho các vòng lặp mà bạn muốn gắn nhãn. Xin 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 trong trường Labels (Nhãn).

  • Nếu bạn đang chạy bài kiểm thử bằng bảng điều khiển Firebase, hãy nhập một hoặc nhiều nhãn trong trường Labels.

  • Nếu bạn đang chạy bài kiểm thử bằng CLI gcloud, hãy chỉ định một hoặc nhiều nhãn tình huống bằng cách sử dụng --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 kiểm thử ứng dụng bằng Test Lab, bạn phải phát hành ứng dụng của mình lên kênh sản xuất trong Cửa hàng Play. Để kiểm thử ứng dụng trong kênh alpha hoặc beta bằng Test Lab, hãy xoá quy trình kiểm tra giấy phép trước khi tải ứng dụng lên Test Lab.

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

Các bài kiểm thử 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ăn xếp. Ví dụ: một số bản phát hành có thể ngăn chặn kết quả đầ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 quyền đối với tệp.