การทดสอบเกมอัตโนมัติอาจทำได้ยากเมื่อแอปเกมสร้างขึ้นบนเฟรมเวิร์ก UI ที่แตกต่างกัน การทดสอบ Game Loop ช่วยให้คุณผสานรวมการทดสอบดั้งเดิมกับ Test Lab และเรียกใช้การทดสอบเหล่านั้นในอุปกรณ์ที่คุณเลือกได้อย่างง่ายดาย การทดสอบ Game Loop จะเรียกใช้การทดสอบผ่านแอปเกมของคุณขณะจำลองการกระทำของผู้เล่นจริง คำแนะนำนี้จะแสดงวิธีเรียกใช้การทดสอบ Game Loop จากนั้นดูและจัดการผลการทดสอบในFirebase Console
คุณสามารถใช้การทดสอบที่มีลูปเดียวหรือหลายลูปได้ ทั้งนี้ขึ้นอยู่กับเกมเอนจิน ลูปคือการทดสอบแอปเกมของคุณแบบเต็มหรือบางส่วน คุณใช้ Game Loop เพื่อทำสิ่งต่อไปนี้ได้
- เรียกใช้เลเวลของเกมในลักษณะเดียวกับที่ผู้ใช้ปลายทางจะเล่น คุณจะ เขียนสคริปต์อินพุตของผู้ใช้ ปล่อยให้ผู้ใช้ไม่ได้ใช้งาน หรือแทนที่ ผู้ใช้ ด้วย AI ก็ได้ หากเหมาะสมกับเกมของคุณ (เช่น สมมติว่าคุณมีแอปเกมแข่งรถและได้ติดตั้งใช้งาน AI ไว้แล้ว คุณสามารถมอบหมายให้ AI driver จัดการอินพุตของผู้ใช้ได้อย่างง่ายดาย)
- เรียกใช้เกมในการตั้งค่าคุณภาพสูงสุดเพื่อดูว่าอุปกรณ์รองรับหรือไม่
- เรียกใช้การทดสอบทางเทคนิค (คอมไพล์เชเดอร์หลายรายการ ดำเนินการ และตรวจสอบว่าเอาต์พุตเป็นไปตามที่คาดไว้ ฯลฯ)
คุณสามารถทำการทดสอบ Game Loop ในอุปกรณ์ทดสอบเครื่องเดียว ชุดอุปกรณ์ทดสอบ หรือ ใน Test Lab ได้ อย่างไรก็ตาม เราไม่แนะนำให้เรียกใช้การทดสอบ Game Loop ในอุปกรณ์เสมือน เนื่องจากมีอัตราเฟรมกราฟิกต่ำกว่าอุปกรณ์จริง
ก่อนเริ่มต้น
หากต้องการทำการทดสอบ คุณต้องกำหนดค่าแอปสำหรับการทดสอบ Game Loop ก่อน
ในไฟล์ Manifest ของแอป ให้เพิ่มตัวกรอง Intent ใหม่ไปยังกิจกรรม
<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 เปิดตัวเกมได้โดยการทริกเกอร์ด้วย Intent ที่เฉพาะเจาะจง
ในโค้ด (เราขอแนะนำให้ใส่ไว้ในการประกาศเมธอด
onCreate
) ให้เพิ่มข้อมูลต่อไปนี้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 }
ซึ่งจะช่วยให้กิจกรรมตรวจสอบ Intent ที่เปิดใช้กิจกรรมได้ คุณยังเพิ่มโค้ดนี้ในภายหลังได้หากต้องการ (เช่น หลังจากโหลดเอนจินเกมในตอนแรก)
แนะนํา: เมื่อสิ้นสุดการทดสอบ ให้เพิ่มข้อมูลต่อไปนี้
Kotlin
yourActivity.finish()
Java
yourActivity.finish();
ซึ่งจะปิดแอปเมื่อการทดสอบ Game Loop เสร็จสมบูรณ์ การทดสอบนี้อาศัยเฟรมเวิร์ก UI ของแอปเพื่อเริ่มลูปถัดไป และการปิดแอปจะบอกว่าการทดสอบเสร็จสิ้นแล้ว
สร้างและทำการทดสอบ Game Loop
หลังจากกำหนดค่าแอปสำหรับการทดสอบ Game Loop แล้ว คุณจะสร้างการทดสอบและเรียกใช้ในแอปเกมได้ทันที โดยเลือกเรียกใช้การทดสอบใน Test Lab โดยใช้ทั้งFirebase คอนโซลหรืออินเทอร์เฟซบรรทัดคำสั่ง (CLI) gcloud หรือในอุปกรณ์ในเครื่องโดยใช้ Test Loop Manager
เรียกใช้ในอุปกรณ์ภายใน
Test LabTest Loop Manager เป็นแอปโอเพนซอร์สที่จะช่วยคุณ ผสานรวมการทดสอบ Game Loop และเรียกใช้การทดสอบเหล่านั้นในอุปกรณ์ของคุณ นอกจากนี้ยังช่วยให้ ทีมประกันคุณภาพสามารถเรียกใช้ลูปเกมเดียวกันในอุปกรณ์ของตนได้ด้วย
วิธีทำการทดสอบในอุปกรณ์ภายในโดยใช้ Test Loop Manager
- ดาวน์โหลด Test Loop Manager
ในโทรศัพท์หรือแท็บเล็ต แล้วติดตั้งโดยเรียกใช้คำสั่งต่อไปนี้
adb install testloopmanager.apk
- เปิดแอป Test Loop Apps ในโทรศัพท์หรือ แท็บเล็ต แอปจะแสดงรายการแอปในอุปกรณ์ที่ เรียกใช้ด้วยลูปเกมได้ หากไม่เห็นแอปเกมของคุณที่นี่ โปรดตรวจสอบว่า ตัวกรอง Intent ตรงกับตัวกรองที่อธิบายไว้ในขั้นตอนแรกของ ส่วนก่อนที่จะเริ่ม
- เลือกแอปเกม แล้วเลือกจำนวนลูปที่ต้องการเรียกใช้ หมายเหตุ: ในขั้นตอนนี้ คุณสามารถเลือกเล่นลูปบางส่วนแทนที่จะเล่นเพียง ลูปเดียวได้ ดูข้อมูลเพิ่มเติมเกี่ยวกับ การเรียกใช้ลูปหลายรายการพร้อมกันได้ที่ฟีเจอร์ที่ไม่บังคับ
- คลิกเรียกใช้การทดสอบ การทดสอบจะเริ่มทำงานทันที
เรียกใช้ใน Test Lab
คุณสามารถเรียกใช้การทดสอบ Game Loop ใน Test Lab โดยใช้Firebase คอนโซลหรือ gcloud CLI ก่อนเริ่มต้น ให้เปิดคอนโซล Firebase และสร้างโปรเจ็กต์ หากยังไม่ได้สร้าง
ใช้คอนโซล Firebase
- ในคอนโซล Firebase ให้คลิก Test Lab จากแผงด้านซ้าย
- คลิกเรียกใช้การทดสอบครั้งแรก (หรือเรียกใช้การทดสอบหากโปรเจ็กต์ของคุณ เคยเรียกใช้การทดสอบมาก่อน)
- เลือก Game Loop เป็นประเภทการทดสอบ แล้วคลิกต่อไป
- คลิกเรียกดู แล้วเรียกดูไฟล์
.apk
ของแอป หมายเหตุ: ในขั้นตอนนี้ คุณสามารถเลือกเล่นลูปบางส่วนแทนที่จะเล่นเพียง ลูปเดียวได้ ดูข้อมูลเพิ่มเติมเกี่ยวกับ การเรียกใช้ลูปหลายรายการพร้อมกันได้ที่ ฟีเจอร์ที่ไม่บังคับ - คลิกต่อไป
- เลือกอุปกรณ์จริงที่จะใช้ทดสอบแอป
- คลิกเริ่มการทดสอบ
ดูข้อมูลเพิ่มเติมเกี่ยวกับการเริ่มต้นใช้งานFirebase Console ได้ที่ เริ่มทดสอบด้วยFirebase Console
ใช้บรรทัดคำสั่ง gcloud (CLI)
ดาวน์โหลดและติดตั้ง Google Cloud SDK หากยังไม่ได้ดำเนินการ
ลงชื่อเข้าใช้ gcloud CLI โดยใช้บัญชี Google โดยทำดังนี้
gcloud auth login
ตั้งค่าโปรเจ็กต์ Firebase ใน gcloud โดยที่
PROJECT_ID
คือรหัสโปรเจ็กต์ Firebase ของคุณgcloud config set project PROJECT_ID
ทำการทดสอบครั้งแรก
gcloud firebase test android run \ --type=game-loop --app=<var>path-to-apk</var> \ --device model=herolte,version=23
ดูข้อมูลเพิ่มเติมเกี่ยวกับการเริ่มต้นใช้งาน gcloud CLI ได้ที่ เริ่มทดสอบจากบรรทัดคำสั่ง gcloud
ฟีเจอร์เสริม
Test Lab มีฟีเจอร์เสริมหลายอย่างที่ช่วยให้คุณปรับแต่งการทดสอบได้เพิ่มเติม รวมถึงความสามารถในการเขียนข้อมูลเอาต์พุต การรองรับ Game Loop หลายรายการ และป้ายกำกับสำหรับลูปที่เกี่ยวข้อง
เขียนข้อมูลเอาต์พุต
การทดสอบ Game Loop สามารถเขียนเอาต์พุตไปยังไฟล์ที่ระบุในเมธอด
launchIntent.getData()
ได้ หลังจากเรียกใช้การทดสอบแล้ว คุณจะเข้าถึงข้อมูลเอาต์พุตนี้ได้ในส่วน Test Lab ของคอนโซล Firebase (ดูตัวอย่างไฟล์เอาต์พุตการทดสอบ Game Loop)
Test Lab ปฏิบัติตามแนวทางปฏิบัติแนะนำสำหรับการแชร์ไฟล์ระหว่างแอปตามที่อธิบายไว้ใน
การแชร์ไฟล์
ในเมธอด onCreate()
ของกิจกรรม ซึ่งเป็นที่ตั้งของ Intent คุณ
สามารถตรวจสอบไฟล์เอาต์พุตข้อมูลได้โดยการเรียกใช้โค้ดต่อไปนี้
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()); // ... }
หากต้องการเขียนลงในไฟล์จากฝั่ง C++ ของแอปเกม คุณสามารถ ส่งตัวอธิบายไฟล์แทนเส้นทางไฟล์ได้
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); }
ตัวอย่างไฟล์เอาต์พุต
คุณสามารถใช้ไฟล์ข้อมูลเอาต์พุต (จัดรูปแบบเหมือนตัวอย่างด้านล่าง) เพื่อแสดงผลการทดสอบ Game
Loop ในส่วน Test Lab ของคอนโซล 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 }
Game Loop หลายรายการ
คุณอาจพบว่าการเรียกใช้ Game Loop หลายรายการในแอปมีประโยชน์ โดยลูปคือ การเรียกใช้แอปเกมอย่างสมบูรณ์ตั้งแต่ต้นจนจบ เช่น หากเกมมีหลายระดับ คุณอาจต้องการมี Game Loop 1 รายการเพื่อเปิดตัวแต่ละระดับแทนที่จะมีลูปเดียวที่วนซ้ำผ่านทุกระดับ ด้วยวิธีนี้ หากแอปขัดข้องที่เลเวล 32 คุณจะเปิดใช้ Game Loop นั้นได้โดยตรงเพื่อจำลองการขัดข้องและทดสอบการแก้ไขข้อบกพร่อง
วิธีเปิดใช้แอปให้เล่นลูปหลายรายการพร้อมกัน
หากคุณกำลังเรียกใช้การทดสอบด้วย Test Loop Manager ให้ทำดังนี้
เพิ่มบรรทัดต่อไปนี้ลงในไฟล์ Manifest ของแอปภายในองค์ประกอบ
<application>
<meta-data android:name="com.google.test.loops" android:value="5" />
Intent การเปิดตัวนี้มีลูปเป้าหมายเป็นพารามิเตอร์จำนวนเต็ม ในช่อง
android:value
คุณระบุจำนวนเต็มได้ตั้งแต่ 1 ถึง 1024 (จำนวนลูปสูงสุดที่อนุญาตสำหรับการทดสอบครั้งเดียว) โปรดทราบ ว่าดัชนีของลูปจะเริ่มจาก 1 ไม่ใช่ 0ในแอป Test Loop Manager หน้าจอการเลือกจะปรากฏขึ้น ซึ่ง ช่วยให้คุณเลือก Loop ที่ต้องการเรียกใช้ได้ หากเลือกหลายลูป ระบบจะเปิดแต่ละลูปตามลำดับหลังจากลูปก่อนหน้า เสร็จสมบูรณ์
หากคุณกำลังทำการทดสอบด้วยFirebaseคอนโซล ให้ป้อนรายการหรือช่วงหมายเลขลูปในฟิลด์สถานการณ์
หากคุณทำการทดสอบด้วย gcloud CLI ให้ระบุรายการหมายเลขลูป โดยใช้แฟล็ก
--scenario-numbers
เช่น--scenario-numbers=1,3,5
จะเรียกใช้ลูป 1, 3 และ 5หากคุณเขียน C++ และต้องการเปลี่ยนลักษณะการทำงานของลูป ให้ส่งข้อมูลเพิ่มเติมต่อไปนี้ไปยังโค้ด C++ เนทีฟ
Kotlin
val launchIntent = intent val scenario = launchIntent.getIntExtra("scenario", 0)
Java
Intent launchIntent = getIntent(); int scenario = launchIntent.getIntExtra("scenario", 0);
ตอนนี้คุณสามารถเปลี่ยนลักษณะการทำงานของลูปตาม
int
ค่าที่ได้
ติดป้ายกำกับ Game Loop
เมื่อติดป้ายกำกับ Game Loop ด้วยป้ายกำกับสถานการณ์อย่างน้อย 1 รายการ คุณและทีม QA จะเปิดใช้ชุด Game Loop ที่เกี่ยวข้องได้อย่างง่ายดาย (เช่น "เกมลูปทั้งหมดที่เข้ากันได้") และทดสอบในเมทริกซ์เดียว คุณสร้างป้ายกำกับของคุณเองหรือ ใช้ป้ายกำกับที่กำหนดไว้ล่วงหน้าซึ่งTest Labมีให้ก็ได้
com.google.test.loops.player_experience
: สำหรับลูปที่ใช้เพื่อ จำลองประสบการณ์ของผู้ใช้จริงเมื่อเล่นเกม เป้าหมายของการทดสอบด้วยลูปเหล่านี้คือการค้นหาปัญหาที่ผู้ใช้จริงจะพบขณะเล่นเกมcom.google.test.loops.gpu_compatibility
: สำหรับลูปที่ใช้ทดสอบปัญหาที่เกี่ยวข้องกับ GPU เป้าหมายของการทดสอบด้วยลูปเหล่านี้คือการเรียกใช้โค้ด GPU ที่อาจทำงานไม่ถูกต้องในเวอร์ชันที่ใช้งานจริง เพื่อเปิดเผยปัญหาเกี่ยวกับฮาร์ดแวร์และไดรเวอร์com.google.test.loops.compatibility
: สำหรับลูปที่ใช้ทดสอบปัญหาความเข้ากันได้ในวงกว้าง ซึ่งรวมถึงปัญหา I/O และปัญหา OpenSSLcom.google.test.loops.performance
: ลูป For ใช้เพื่อทดสอบประสิทธิภาพของอุปกรณ์ ตัวอย่างเช่น เกมอาจทำงานในการตั้งค่ากราฟิกที่ซับซ้อนที่สุด เพื่อดูว่าอุปกรณ์ใหม่ทำงานอย่างไร
วิธีเปิดใช้แอปเพื่อเล่นลูปที่มีป้ายกำกับเดียวกัน
หากคุณกำลังเรียกใช้การทดสอบด้วย Test Loop Manager ให้ทำดังนี้
ในไฟล์ Manifest ของแอป ให้เพิ่มบรรทัดข้อมูลเมตาต่อไปนี้และแทนที่ LABEL_NAME ด้วยป้ายกำกับที่คุณเลือก
<meta-data android:name="com.google.test.loops.LABEL_NAME" android:value="1,3-5" />
ในช่อง
android:value
คุณสามารถระบุช่วงหรือชุดจำนวนเต็ม ตั้งแต่ 1 ถึง 1024 (จำนวนลูปสูงสุดที่อนุญาตสำหรับการทดสอบครั้งเดียว) ซึ่ง แสดงถึงลูปที่คุณต้องการติดป้ายกำกับ โปรดทราบว่าระบบจะจัดทำดัชนีลูปโดยเริ่ม จาก 1 ไม่ใช่ 0 เช่นandroid:value="1,3-5"
จะใช้ LABEL_NAME กับลูป 1, 3, 4 และ 5ในแอป Test Loop Manager ให้ป้อนป้ายกำกับอย่างน้อย 1 รายการในช่องป้ายกำกับ
หากคุณทำการทดสอบด้วยFirebaseคอนโซล ให้ป้อนป้ายกำกับอย่างน้อย 1 รายการในช่องป้ายกำกับ
หากคุณกำลังทดสอบด้วย gcloud CLI ให้ระบุป้ายกำกับสถานการณ์อย่างน้อย 1 รายการโดยใช้แฟล็ก
--scenario-labels
(เช่น--scenario-labels=performance,gpu
)
การสนับสนุนด้านการอนุญาตให้ใช้สิทธิแอป
Test Lab รองรับแอปที่ใช้บริการการอนุญาตให้ใช้สิทธิแอป ที่ Google Play นำเสนอ หากต้องการตรวจสอบการอนุญาตให้ใช้สิทธิเมื่อทดสอบ แอปด้วย Test Lab ให้สำเร็จ คุณต้องเผยแพร่แอปไปยังแชแนลการผลิต ใน Play Store หากต้องการทดสอบแอปในช่องอัลฟ่าหรือเบต้าโดยใช้ Test Lab ให้นำการตรวจสอบการอนุญาตให้ใช้สิทธิออกก่อนอัปโหลดแอปไปยัง Test Lab
ปัญหาที่ทราบ
การทดสอบ Game Loop ใน Test Lab มีปัญหาที่ทราบดังต่อไปนี้
- การขัดข้องบางอย่างไม่รองรับการย้อนรอย เช่น บิลด์รุ่นที่เผยแพร่บางรายการอาจ
ระงับเอาต์พุตของกระบวนการ
debuggerd
โดยใช้prctl(PR_SET_DUMPABLE, 0)
ดูข้อมูลเพิ่มเติมได้ที่debuggerd
- ขณะนี้ระบบยังไม่รองรับ API ระดับ 19 เนื่องจากข้อผิดพลาดเกี่ยวกับสิทธิ์ของไฟล์