Catch up on everthing we announced at this year's Firebase Summit. Learn more

เริ่มต้นกับการทดสอบ Game Loop

การทดสอบเกมอัตโนมัติอาจเป็นเรื่องยากเมื่อแอปเกมสร้างขึ้นบนเฟรมเวิร์ก UI ที่แตกต่างกัน การทดสอบ Game Loop ช่วยให้คุณสามารถรวมการทดสอบดั้งเดิมของคุณเข้ากับ Test Lab และเรียกใช้การทดสอบบนอุปกรณ์ที่คุณเลือกได้อย่างง่ายดาย การทดสอบ Game Loop จะทำการทดสอบของคุณผ่านแอพเกมในขณะที่จำลองการกระทำของผู้เล่นจริง คู่มือนี้จะแสดงวิธีเรียกใช้การทดสอบ Game Loop จากนั้นดูและจัดการผลการทดสอบในคอนโซล Firebase

ทั้งนี้ขึ้นอยู่กับเครื่องยนต์เกมของคุณคุณสามารถใช้การทดสอบด้วยเดียวหรือ ลูปหลาย การวนซ้ำคือการทดสอบทั้งหมดหรือบางส่วนในแอปเกมของคุณ สามารถใช้ลูปเกมเพื่อ:

  • เรียกใช้ระดับของเกมของคุณในลักษณะเดียวกับที่ผู้ใช้จะเล่น คุณสามารถเขียนสคริปต์อินพุตของผู้ใช้ ปล่อยให้ผู้ใช้ไม่ได้ใช้งาน หรือแทนที่ผู้ใช้ด้วย AI ถ้ามันสมเหตุสมผลในเกมของคุณ (เช่น สมมติว่าคุณมีแอปเกมรถแข่งและได้ติดตั้ง AI ไว้แล้ว คุณสามารถ ให้ไดรเวอร์ AI รับผิดชอบการป้อนข้อมูลของผู้ใช้อย่างง่ายดาย)
  • เรียกใช้เกมของคุณด้วยการตั้งค่าคุณภาพสูงสุดเพื่อดูว่าอุปกรณ์รองรับหรือไม่
  • เรียกใช้การทดสอบทางเทคนิค (รวบรวมหลายเฉดสี ดำเนินการ ตรวจสอบว่าผลลัพธ์เป็นไปตามที่คาดไว้ ฯลฯ)

คุณสามารถเรียกใช้การทดสอบ Game Loop บนอุปกรณ์ทดสอบเครื่องเดียว ชุดอุปกรณ์ทดสอบ หรือใน Test Lab อย่างไรก็ตาม เราไม่แนะนำให้ใช้การทดสอบ Game Loop บนอุปกรณ์เสมือน เนื่องจากมีอัตราเฟรมกราฟิกที่ต่ำกว่าอุปกรณ์จริง

ก่อนจะเริ่ม

ในการดำเนินการทดสอบ คุณต้องกำหนดค่าแอปของคุณสำหรับการทดสอบ Game Loop ก่อน

  1. ในที่ประจักษ์ของแอปเพิ่มตัวกรองความตั้งใจของคุณใหม่เพื่อ กิจกรรม :

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

    ซึ่งจะทำให้ Test Lab สามารถเปิดเกมของคุณได้โดยการเรียกเกมด้วยความตั้งใจเฉพาะ

  2. ในรหัสของคุณ (เราขอแนะนำภายใน onCreate ประกาศวิธี), เพิ่มต่อไปนี้:

    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
    }

    คอตลิน+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
    }

    ซึ่งช่วยให้กิจกรรมของคุณตรวจสอบเจตนาที่เปิดตัวได้ คุณสามารถเพิ่มรหัสนี้ในภายหลังได้หากต้องการ (เช่น หลังจากโหลดเอ็นจิ้นเกมของคุณครั้งแรก)

  3. แนะนำ: เมื่อสิ้นสุดการทดสอบ ให้เพิ่ม:

    Java

    yourActivity.finish();

    คอตลิน+KTX

    yourActivity.finish()

    การดำเนินการนี้จะปิดแอปของคุณเมื่อการทดสอบ Game Loop เสร็จสิ้น การทดสอบใช้เฟรมเวิร์ก UI ของแอปเพื่อเริ่มลูปถัดไป และการปิดแอปจะเป็นการแจ้งว่าการทดสอบเสร็จสิ้น

สร้างและเรียกใช้การทดสอบ Game Loop

หลังจากที่คุณกำหนดค่าแอปของคุณสำหรับการทดสอบ Game Loop คุณสามารถสร้างการทดสอบและเรียกใช้ในแอปเกมของคุณได้ทันที คุณสามารถเลือกที่จะเรียกใช้การทดสอบในห้องปฏิบัติการทดสอบโดยใช้ Firebase คอนโซล หรือ ติดต่อบรรทัดคำสั่ง GCloud (CLI) หรือบน อุปกรณ์ท้องถิ่นโดยใช้ห่วงจัดการทดสอบ

ทำงานบนอุปกรณ์ท้องถิ่น

ทดสอบห่วงผู้จัดการห้องปฏิบัติการทดสอบของเป็น app ที่มาเปิดที่ช่วยให้คุณสามารถบูรณาการการทดสอบเกมห่วงและเรียกพวกเขาบนอุปกรณ์ในท้องถิ่นของคุณ นอกจากนี้ยังช่วยให้ทีมประกันคุณภาพของคุณเรียกใช้ลูปเกมเดียวกันบนอุปกรณ์ของพวกเขาได้

ในการรันการทดสอบบนอุปกรณ์ภายในเครื่องโดยใช้ Test Loop Manager:

  1. ดาวน์โหลด ห่วงผู้จัดการทดสอบ บนโทรศัพท์มือถือหรือแท็บเล็ตและติดตั้งโดยการทำงาน:
    adb install testloopmanager.apk
  2. บนอุปกรณ์ของคุณเปิดแอปพลิเคชันทดสอบห่วงบนโทรศัพท์หรือแท็บเล็ตของคุณ แอพแสดงรายการแอพในอุปกรณ์ของคุณที่สามารถรันด้วย game loop หากคุณไม่เห็นแอปการเล่นเกมของคุณที่นี่ให้แน่ใจว่าตัวกรองความตั้งใจของคุณตรงกับที่อธิบายไว้ในขั้นตอนแรกของ ก่อนที่จะเริ่มแสดง
  3. เลือกแอปเกมของคุณ จากนั้นเลือกจำนวนลูปที่คุณต้องการเรียกใช้ หมายเหตุ: ในขั้นตอนนี้ คุณสามารถเลือกเรียกใช้ชุดย่อยของลูปแทนที่จะเป็นเพียงลูปเดียว สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการทำงานลูปหลายครั้งดู คุณสมบัติเสริม
  4. คลิกเรียกใช้การทดสอบ การทดสอบของคุณเริ่มทำงานทันที

เรียกใช้ในห้องปฏิบัติการทดสอบ

คุณสามารถเรียกใช้การทดสอบเกมห่วงในการทดสอบในห้องปฏิบัติการโดยใช้ Firebase คอนโซล หรือ CLI GCloud ก่อนที่คุณจะเริ่มต้นถ้าคุณยังไม่ได้เปิด คอนโซล Firebase และสร้างโครงการ

ใช้คอนโซล Firebase

  1. ในคอนโซล Firebase คลิกห้องปฏิบัติการทดสอบจากแผงด้านซ้าย
  2. คลิกเรียกใช้การทดสอบครั้งแรกของคุณ (หรือเรียกใช้การทดสอบถ้าโครงการของคุณได้ทำงานก่อนหน้านี้การทดสอบ)
  3. เลือกเกมห่วงเป็นประเภทการทดสอบแล้วคลิกดำเนินการต่อ
  4. คลิกเรียกดูและจากนั้นเรียกดูแอปของคุณ .apk ไฟล์ หมายเหตุ: ในขั้นตอนนี้ คุณสามารถเลือกเรียกใช้ชุดย่อยของลูปแทนที่จะเป็นเพียงลูปเดียว สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการทำงานลูปหลายครั้งดู คุณสมบัติเสริม
  5. คลิกดำเนินการต่อ
  6. เลือกอุปกรณ์จริงเพื่อใช้ทดสอบแอปของคุณ
  7. คลิกเริ่มการทดสอบ

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการเริ่มต้นด้วยการ Firebase คอนโซลดู เริ่มต้นการทดสอบกับคอนโซล Firebase

ใช้บรรทัดคำสั่ง gcloud (CLI)

  1. หากคุณยังไม่ได้ดาวน์โหลดและติดตั้ง ระบบคลาวด์ SDK ของ Google

  2. ลงชื่อเข้าใช้ gcloud CLI โดยใช้บัญชี Google ของคุณ:

    gcloud auth login

  3. ตั้งโครงการ Firebase คุณใน GCloud ที่ PROJECT_ID คือรหัสของโครงการ Firebase ของคุณ:

    gcloud config set project PROJECT_ID
    
  4. ทำการทดสอบครั้งแรกของคุณ:

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

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการเริ่มต้นกับ CLI GCloud ให้ดู เริ่มต้นการทดสอบจากบรรทัดคำสั่ง GCloud

คุณสมบัติเสริม

Test Lab นำเสนอคุณสมบัติเสริมหลายอย่างที่ช่วยให้คุณปรับแต่งการทดสอบของคุณเพิ่มเติม รวมถึงความสามารถในการเขียนข้อมูลเอาต์พุต การสนับสนุนสำหรับลูปเกมหลายรายการ และป้ายกำกับสำหรับลูปที่เกี่ยวข้อง

เขียนข้อมูลเอาต์พุต

ทดสอบเกมห่วงของคุณสามารถเขียนออกไปยังแฟ้มที่ระบุไว้ใน launchIntent.getData() วิธีการ หลังจากที่คุณเรียกใช้การทดสอบคุณสามารถเข้าถึงข้อมูลการแสดงผลนี้ในส่วนของห้องปฏิบัติการทดสอบของคอนโซล Firebase (ดู ห่วงเช่นการทดสอบการส่งออกไฟล์เกม )

ห้องปฏิบัติการทดสอบต่อไปนี้ปฏิบัติที่ดีที่สุดสำหรับการแชร์ไฟล์ระหว่างปพลิเคชันที่อธิบายไว้ใน การแชร์ไฟล์ ในกิจกรรมของคุณ onCreate() วิธีการที่เจตนาของคุณตั้งอยู่คุณสามารถตรวจสอบไฟล์ที่ส่งออกข้อมูลของคุณโดยใช้รหัสต่อไปนี้:

Java

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

คอตลิน+KTX

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

หากคุณต้องการเขียนไฟล์จากด้าน C++ ของแอปเกม คุณสามารถส่งผ่าน file descriptor แทนเส้นทางของไฟล์:

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

คอตลิน+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);
}

ตัวอย่างไฟล์เอาต์พุต

คุณสามารถใช้ไฟล์ (รูปแบบเช่นตัวอย่างด้านล่าง) ไปที่เกมการแสดงผลผลการทดสอบห่วงข้อมูลออกในส่วนของห้องปฏิบัติการทดสอบของคอนโซล Firebase พื้นที่แสดงเป็น /.../ สามารถมีช่องที่กำหนดเองใด ๆ ที่คุณต้องการตราบเท่าที่พวกเขาไม่ได้มีความขัดแย้งกับชื่อของสาขาอื่น ๆ ที่ใช้ในแฟ้มนี้:

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

หลายเกมลูป

คุณอาจพบว่าการเรียกใช้หลายเกมวนซ้ำในแอปของคุณอาจเป็นประโยชน์ การวนซ้ำเป็นการเรียกใช้แอปเกมของคุณตั้งแต่ต้นจนจบ ตัวอย่างเช่น หากคุณมีหลายระดับในเกมของคุณ คุณอาจต้องการให้มีเกมวนรอบเพื่อเริ่มแต่ละด่าน แทนที่จะมีลูปเดียวที่วนซ้ำทั้งหมด ด้วยวิธีนี้ หากแอปของคุณขัดข้องที่ระดับ 32 คุณสามารถเปิดลูปเกมนั้นได้โดยตรงเพื่อสร้างการขัดข้องซ้ำและทดสอบการแก้ไขข้อผิดพลาด

ในการทำให้แอปของคุณทำงานหลายลูปพร้อมกัน:

  • หากคุณกำลังทำการทดสอบด้วย Test Loop Manager:

    1. เพิ่มบรรทัดต่อไปนี้อย่างชัดแจ้งของแอปภายใน <application> องค์ประกอบ:

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

      ความตั้งใจในการเรียกใช้นี้มีลูปเป้าหมายเป็นพารามิเตอร์จำนวนเต็ม ใน android:value ฟิลด์คุณสามารถระบุจำนวนเต็ม 1-1024 (จำนวนสูงสุดของลูปได้รับอนุญาตสำหรับการทดสอบเดียว) โปรดทราบว่าลูปถูกสร้างดัชนีโดยเริ่มจาก 1 ไม่ใช่ 0

    2. ในแอพ Test Loop Manager หน้าจอการเลือกจะปรากฏขึ้นเพื่อให้คุณเลือกได้ว่าต้องการเรียกใช้ลูปใด หากคุณเลือกหลายลูป แต่ละลูปจะเริ่มทำงานตามลำดับหลังจากลูปก่อนหน้าเสร็จสิ้น

  • หากคุณกำลังใช้ทดสอบกับ Firebase คอนโซลป้อนรายการหรือช่วงของตัวเลขห่วงในเขตสถานการณ์ที่

  • หากคุณกำลังใช้การทดสอบด้วย CLI GCloud ที่ระบุรายการของหมายเลขห่วงโดยใช้ --scenario-numbers ธง ยกตัวอย่างเช่น --scenario-numbers=1,3,5 วิ่งวนรอบที่ 1, 3 และ 5

  • หากคุณกำลังเขียน C++ และต้องการเปลี่ยนลักษณะการทำงานของลูป ให้ส่งต่อสิ่งพิเศษต่อไปนี้ไปยังโค้ด C++ ดั้งเดิมของคุณ:

    Java

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

    คอตลิน+KTX

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

    ขณะนี้คุณสามารถเปลี่ยนพฤติกรรมของวงของคุณตามที่เกิด int ค่า

ติดฉลากห่วงเกม

เมื่อคุณติดป้ายกำกับลูปเกมของคุณด้วยป้ายกำกับสถานการณ์หนึ่งรายการขึ้นไป คุณและทีม QA ของคุณสามารถเปิดชุดลูปเกมที่เกี่ยวข้องได้อย่างง่ายดาย (เช่น "ลูปเกมที่เข้ากันได้ทั้งหมด") และทดสอบพวกมันในเมทริกซ์เดียว คุณสามารถสร้างป้ายกำกับของคุณเองหรือใช้ป้ายกำกับที่กำหนดไว้ล่วงหน้าที่ Test Lab นำเสนอ:

  • com.google.test.loops.player_experience : สำหรับลูปที่ใช้ในการทำซ้ำประสบการณ์ผู้ใช้จริงเมื่อเล่นเกม เป้าหมายของการทดสอบด้วยลูปเหล่านี้คือการค้นหาปัญหาที่ผู้ใช้จริงต้องเผชิญขณะเล่นเกม
  • com.google.test.loops.gpu_compatibility : สำหรับลูปที่ใช้ในการปัญหา GPU ที่เกี่ยวข้องกับการทดสอบ เป้าหมายของการทดสอบด้วยลูปเหล่านี้คือการรันโค้ด GPU ที่อาจทำงานไม่ถูกต้องในการผลิต เพื่อแสดงปัญหาเกี่ยวกับฮาร์ดแวร์และไดรเวอร์
  • com.google.test.loops.compatibility : สำหรับลูปใช้ในการทดสอบความหลากหลายของปัญหาความเข้ากันรวมทั้ง I / O และประเด็นปัญหา OpenSSL
  • com.google.test.loops.performance : สำหรับลูปที่ใช้ในการทดสอบประสิทธิภาพของอุปกรณ์ ตัวอย่างเช่น เกมอาจทำงานที่การตั้งค่ากราฟิกที่ซับซ้อนที่สุดเพื่อดูว่าอุปกรณ์ใหม่ทำงานอย่างไร

วิธีเปิดใช้งานแอปของคุณเพื่อเรียกใช้ลูปที่มีป้ายกำกับเดียวกัน:

  • หากคุณกำลังทำการทดสอบด้วย Test Loop Manager:

    1. ในที่ประจักษ์ของแอปเพิ่มบรรทัด meta ข้อมูลต่อไปนี้และแทนที่ LABEL_NAME มีป้ายที่คุณเลือก:

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

      ใน android:value ฟิลด์คุณสามารถระบุช่วงหรือชุดของจำนวนเต็ม 1-1,024 A (จำนวนสูงสุดของลูปได้รับอนุญาตสำหรับการทดสอบเดียว) ที่เป็นตัวแทนของลูปที่คุณต้องการฉลาก โปรดทราบว่าลูปมีการสร้างดัชนีตั้งแต่วันที่ 1 ไม่ 0. ตัวอย่างเช่น android:value="1,3-5" ใช้ LABEL_NAME ไปลูป 1, 3, 4 และ 5

    2. ในแอปทดสอบห่วงผู้จัดการป้อนหนึ่งหรือมากกว่าหนึ่งป้ายในเขตฉลาก

  • หากคุณกำลังใช้ทดสอบกับคอนโซล Firebase ให้ป้อนหนึ่งหรือมากกว่าหนึ่งป้ายในเขตฉลาก

  • หากคุณกำลังใช้การทดสอบด้วย CLI GCloud ที่ระบุหนึ่งหรือมากกว่าหนึ่งป้ายสถานการณ์โดยใช้ --scenario-labels ธง (เช่น --scenario-labels=performance,gpu )

รองรับการออกใบอนุญาตแอป

ห้องปฏิบัติการทดสอบสนับสนุนปพลิเคชันที่ใช้ ใบอนุญาต App บริการที่นำเสนอโดย Google Play หากต้องการตรวจสอบใบอนุญาตให้สำเร็จเมื่อทดสอบแอปด้วย Test Lab คุณต้องเผยแพร่แอปไปยังช่องทางการผลิตใน Play Store หากต้องการทดสอบแอปในเวอร์ชันอัลฟาหรือเบต้าโดยใช้ Test Lab ให้นำการตรวจสอบสิทธิ์ใช้งานออกก่อนที่จะอัปโหลดแอปไปยัง Test Lab

ปัญหาที่ทราบ

การทดสอบ Game Loop ใน Test Lab มีปัญหาที่ทราบดังต่อไปนี้:

  • ข้อขัดข้องบางอย่างไม่รองรับการย้อนรอย ยกตัวอย่างเช่นการเปิดตัวบางอย่างอาจสร้างปราบปรามการส่งออกของ debuggerd กระบวนการใช้ prctl(PR_SET_DUMPABLE, 0) ต้องการเรียนรู้เพิ่มเติมโปรดดูที่ debuggerd
  • ขณะนี้ API ระดับ 19 ไม่ได้รับการสนับสนุนเนื่องจากข้อผิดพลาดในการอนุญาตไฟล์