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 nền tảng khác nhau Khung giao diện người dùng. Tính năng 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 của mình với Phòng thử nghiệm và dễ dàng chạy các thiết bị đó trên các thiết bị bạn chọn. Bài kiểm thử Vòng lặp trò chơi sẽ chạy thử nghiệm thông qua ứng dụng trò chơi của bạn trong khi mô phỏng hành động của một người chơi thực. Chiến dịch này hướng dẫn này cho bạn biết cách chạy kiểm thử Vòng lặp trò chơi, sau đó xem và quản lý kiểm thử kết quả trong bảng điều khiển của Firebase.

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

  • Chạy một cấp độ của trò chơi giống như cách người dùng cuối chơi. Bạn có thể viết tập lệnh cho hoạt động đầ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 AI (trí tuệ nhân tạo) nếu hoạt động đó phù hợp trong trò chơi của bạn (ví dụ: giả sử bạn có một chiếc xe đua trò chơi và đã triển khai AI. Bạn có thể dễ dàng tạo một AI tài xế phụ trách hoạt động đầu vào của người dùng).
  • Chạy trò chơi của bạn ở chế độ cài đặt chất lượng cao nhất để xem thiết bị có hỗ trợ tính năng này hay không.
  • Chạy kiểm thử kỹ thuật (biên dịch nhiều chương trình đổ bóng, thực thi chúng, kiểm tra xem đầu ra như mong đợi, v.v.).

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

Trước khi bắt đầu

Để triển khai kiểm thử, trước tiên, bạn phải định cấu hình ứng dụng của mình để 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:

    <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 Phòng thử nghiệm ra mắt trò chơi của bạn bằng cách kích hoạt trò chơi bằng một ý định.

  2. Trong mã của bạn (bạn nên bên trong phần khai báo phương thức onCreate), hãy thêm 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
    }

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

  3. Nên làm: Khi kết thúc kiểm tra, hãy thêm:

    Kotlin+KTX

    yourActivity.finish()

    Java

    yourActivity.finish();

    Thao tác này sẽ đóng ứng dụng khi quá trình kiểm tra Vòng lặp trò chơi hoàn tất. Thử nghiệm dựa trên 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 thử nghiệm đã kết thúc.

Tạo và chạy 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 thử nghiệm và chạy thử nghiệm đó trong ứng dụng trò chơi của bạn. Bạn có thể chọn chạy thử nghiệm trong Phòng thử nghiệm bằng bảng điều khiển của Firebase hoặc gcloud giao diện dòng lệnh (CLI) hoặc trên thiết bị cục bộ sử dụng Vòng lặp kiểm thử Người quản lý.

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

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

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

  1. Tải Test Loop Manager (Trình quản lý vòng lặp kiểm thử) xuống trên đ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 (Kiểm thử ứng dụng vòng lặp) trên điện thoại hoặc máy tính bảng. Ứng dụng hiển thị danh sách các ứng dụng trên thiết bị của bạn mà 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 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ỉ chạy một vòng lặp. Để biết thêm thông tin về chạy nhiều vòng lặp cùng lúc, hãy xem bài viết Các tính năng không bắt buộc.
  4. Nhấp vào Run test (Chạy kiểm thử). Chương trình kiểm thử của bạn sẽ bắt đầu chạy ngay lập tức.

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

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

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

  1. Trong bảng điều khiển của Firebase, hãy nhấp vào Phòng thử nghiệm trên 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 của bạn) (hoặc Run a Test (Chạy kiểm thử) nếu dự án của bạn có chạy thử nghiệm trước đó).
  3. Chọn loại thử nghiệm là Vòng lặp trò chơi, sau đó nhấp vào Tiếp tục.
  4. Nhấp vào Browse (Duyệt qua) rồi duyệt tới 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ỉ chạy một vòng lặp. Để biết thêm thông tin về 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 Tiếp tục.
  6. Chọn thiết bị thực tế sẽ sử dụng để kiểm thử ứng dụng của bạn.
  7. Nhấp vào 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 của Firebase, hãy xem Bắt đầu thử nghiệm bằng bảng điều khiển của Firebase.

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

  1. Tải xuống và cài đặt Google Cloud SDK nếu bạn chưa thực hiện việc này

  2. Đăng nhập vào Giao diện dòng lệnh (CLI) của gcloud bằng Tài khoản Google của bạn:

    gcloud auth login

  3. Thiết lập dự án Firebase của bạn trong gcloud, trong đó PROJECT_ID là mã dự án Firebase của bạn:

    gcloud config set project PROJECT_ID
    
  4. Chạy chương trình 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 gcloud CLI, 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

Phòng thử nghiệm 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 kiểm thử, bao gồm cả khả năng ghi dữ liệu đầu ra, hỗ trợ nhiều trò chơi vòng lặp và nhãn cho vòng lặp liên quan.

Ghi dữ liệu đầu ra

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

Phòng thử nghiệm 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 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 bạn 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 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 chỉ số 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ụ dưới đây) để hiển thị trò chơi kết quả thử nghiệm vòng lặp trong phần Phòng thử nghiệm của bảng điều khiển của Firebase. Những khu vực xuất hiện 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à 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à một hoàn tất việc chạy ứ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, bạn nên có một vòng lặp trò chơi để hãy chạy từng cấp thay vì duy trì một vòng lặp lặp lại qua tất cả các cấp. Nhờ đó, nếu ứng dụng của bạn gặp sự cố ở cấp độ 32, thì bạn có thể khởi chạy trực tiếp trò chơi đó để tái hiện sự cố và kiểm thử 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 lúc:

  • Nếu bạn đang chạy 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. Ngang bằng 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 cho phép đối với một thử nghiệm). Ghi chú các vòng lặp đó được lập chỉ mục bắt đầu từ 1 chứ không phải 0.

    2. Trong ứng dụng Test Loop Manager (Trình quản lý vòng lặp thử nghiệm), 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 được khởi chạy theo trình tự sau vòng lặp trước đó hoàn tất.

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

  • Nếu bạn đang chạy thử nghiệm bằng 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 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 truyền hàm phần bổ sung sau đây 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);

    Giờ đây, bạn có thể thay đổi hành vi của vòng lặp dựa trên int thu được giá trị.

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

Khi 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à quy trình đả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 có liên quan (ví dụ: "tất cả khả năng tương thích vòng lặp trò chơi") và kiểm thử 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 hãy sử dụng các nhãn định sẵn do Phòng thử nghiệm cung cấp:

  • com.google.test.loops.player_experience: Vòng lặp For 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 thử nghiệm với các vòng lặp này là tìm những vấn đề mà một người dùng thực sẽ gặp phải chơi trò chơi.
  • com.google.test.loops.gpu_compatibility: Vòng lặp For 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ử với các vòng lặp này là thực thi GPU mã có thể không chạy đúng cách trong phiên bản chính thức, để làm lộ các vấn đề với phần cứng và trình điều khiển.
  • com.google.test.loops.compatibility: Vòng lặp For dùng để kiểm thử một nhiều vấn đề về khả năng tương thích, bao gồm cả các vấn đề về I/O và OpenSSL vấn đề.
  • com.google.test.loops.performance: Vòng lặp For 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 ở cấp độ phức tạp nhất cài đặt đồ hoạ để xem cách hoạt động của thiết bị mới.

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

  • Nếu bạn đang chạy 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 đây 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 dải ô hoặc một tập hợp số nguyên từ 1 đến 1024 (số vòng tối đa được phép cho một phép thử) mà thể hiện 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 khi bắt đầu từ 1 chứ không phải 0. Ví dụ: áp dụng android:value="1,3-5" LABEL_NAME đến vòng lặp 1, 3, 4 và 5.

    2. Trong ứng dụng Test Loop Manager (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 mục Nhãn .

  • Nếu bạn đang chạy thử nghiệm bằng bảng điều khiển của Firebase, hãy nhập ít nhất một nhãn trong trường Nhãn.

  • Nếu bạn đang chạy thử nghiệm bằng gcloud CLI, hãy chỉ định một mã hoặc nhiều nhãn tình huống khác 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

Phòng thử nghiệm hỗ trợ những ứng dụng sử dụng Cấp phép ứng dụng do Google Play cung cấp. Cách kiểm tra cấp phép thành công khi thử nghiệm ứng dụng của bạn bằng Phòng thử nghiệm, bạn phải xuất bản ứng dụng lên kênh phát hành chính thức 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 cách sử dụng Phòng thử nghiệm, xoá yêu cầu kiểm tra việc cấp phép trước khi tải ứng dụng lên Phòng thử nghiệm.

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

Quy trình kiểm thử Vòng lặp trò chơi trong Phòng thử nghiệm gặp 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 phát hành có thể loại bỏ đầ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 về quyền truy cập tệp.