Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

เริ่มต้นกับการทดสอบ 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 ไม่ได้รับการสนับสนุนเนื่องจากข้อผิดพลาดในการอนุญาตไฟล์