หน้านี้จะบอกวิธีเขียนการทดสอบฝั่งโฮสต์ที่ไม่ต้องใช้อุปกรณ์ เช่น การทดสอบที่ทำงานบนอินสแตนซ์ Linux GCE (สำหรับรายละเอียดเกี่ยวกับการเขียนการทดสอบที่ขับเคลื่อนด้วยโฮสต์ที่ต้องใช้อุปกรณ์ โปรดดูที่ เขียนการทดสอบที่ขับเคลื่อนด้วยโฮสต์ในสหพันธ์การค้า )
ประเภทการทดสอบฝั่งโฮสต์
คุณสามารถเรียกใช้การทดสอบฝั่งโฮสต์ได้หลายประเภทผ่าน Trade Federation (TF)
การทดสอบเนทิฟ (gtest)
สร้าง การทดสอบแบบเนทีฟ (gtests) เพื่อทดสอบแพลตฟอร์ม หากการทดสอบไม่จำเป็นต้องใช้อุปกรณ์ ให้รันบนโฮสต์ การทดสอบจะทำงานเร็วขึ้นมากในลักษณะนั้น หากต้องการกำหนดค่าการทดสอบดังกล่าวให้ทำงานบนโฮสต์ทดสอบ ให้ใช้ TF runner HostGTest
นี่คือตัวอย่างการกำหนดค่าการทดสอบ TradeFed:
<configuration description="Runs hello_world_test."> <option name="null-device" value="true" /> <test class="com.android.tradefed.testtype.HostGTest" > <option name="module-name" value="hello_world_test" /> </test> </configuration>
การกำหนดค่าการทดสอบจะรันการทดสอบ gtest ( hello_world_test ) บนโฮสต์ การกำหนดค่าการทดสอบตัวอย่างสามารถสร้างได้อัตโนมัติ ยกเว้นว่าการทดสอบของคุณจำเป็นต้องมีการตั้งค่าพิเศษหรือการล้างข้อมูล คุณสามารถไว้วางใจการสร้างการกำหนดค่าการทดสอบอัตโนมัติเพื่อสร้างการกำหนดค่าการทดสอบ TF ที่เหมาะสมได้
หากต้องการกำหนดค่า gtest ฝั่งโฮสต์และเปิดใช้งานการสร้างการกำหนดค่าการทดสอบอัตโนมัติ ให้ตั้ง host_supported
เป็น true
ใน Android.bp
เช่นเดียวกับใน hello_world_test
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการเขียนแบบทดสอบภาษาพื้นเมือง โปรดดูที่ การเพิ่มตัวอย่างการทดสอบภาษาพื้นเมืองใหม่
การทดสอบโฮสต์ JAR
การทดสอบโฮสต์ JAR (Java) เช่น JUnit เป็นการทดสอบที่ไม่จำเป็นต้องรันบนอุปกรณ์ และที่ให้การครอบคลุมโค้ดของโปรเจ็กต์ Java ของคุณ การทดสอบดังกล่าวสามารถกำหนดค่าให้ทำงานบนโฮสต์ทดสอบได้โดยใช้ runner HostTest
ตัวอย่างการกำหนดค่าการทดสอบ TradeFed
<configuration description="Executes HelloWorldHostTest"> <test class="com.android.tradefed.testtype.HostTest" > <option name="jar" value="HelloWorldHostTest.jar" /> </test> </configuration>
การกำหนดค่าการทดสอบจะรันการทดสอบ JUnit ฝั่งโฮสต์ของ HelloWorldHostTest โปรดทราบว่าการกำหนดค่าการทดสอบข้างต้นสามารถสร้างได้อัตโนมัติ ยกเว้นว่าการทดสอบของคุณจำเป็นต้องมีการตั้งค่าพิเศษหรือการล้างข้อมูล ให้ใช้การสร้างการกำหนดค่าการทดสอบอัตโนมัติเพื่อสร้างการกำหนดค่าการทดสอบ TradeFed ที่เหมาะสม
สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับวิธีการเขียนการทดสอบโฮสต์ JAR โปรดดูที่หน้า การทดสอบโฮสต์ JAR (Java)
การทดสอบโฮสต์ Java ที่แยกออกมา
การทดสอบ Java แบบไร้อุปกรณ์สามารถรันในสภาพแวดล้อมแบบแยกส่วนโดยมีค่าใช้จ่ายด้านประสิทธิภาพเล็กน้อย อย่างไรก็ตาม มีข้อควรพิจารณาที่สำคัญบางประการก่อนที่จะเลือกใช้สภาพแวดล้อมนี้
- นี่คือรันเนอร์เริ่มต้นที่ใช้สำหรับการทดสอบหน่วย Robolectric และ JUnit
- Tradefed รองรับเฉพาะการทดสอบ JUnit ในสภาพแวดล้อมแบบแยกส่วน
- รองรับเฉพาะการขึ้นต่อกันที่เชื่อมโยงแบบคงที่เท่านั้น ไม่มีการขึ้นต่อกันที่ประกาศด้วย
lib
รวมอยู่ใน classpath - Isolation Runner จะทำให้ Shim runner และ Test Jar ของคุณอยู่บนคลาสพาธเท่านั้น
- มีค่าใช้จ่ายคงที่จำนวนหนึ่งต่อการทดสอบรันที่ดำเนินการกับนักวิ่งรายนี้
ตัวอย่างการกำหนดค่าการทดสอบ Tradefed (แยกกัน)
<configuration description="Executes HelloWorldHostTest"> <test class="com.android.tradefed.testtype.IsolatedHostTest" > <option name="jar" value="HelloWorldHostTest.jar" /> </test> </configuration>
ตัวอย่างการกำหนดค่า Soong สำหรับการสร้างอัตโนมัติ
แทนที่จะสร้างการกำหนดค่าการทดสอบด้วยตนเองเหมือน ด้านบน Soong สามารถสร้างการกำหนดค่าอัตโนมัติได้โดยใช้การประกาศตามตัวอย่างนี้
java_test_host { name: "HelloWorldHostTest", test_options: { unit_test: true, }, test_suites: ["general-tests"], srcs: ["test/**/*.java"], static_libs: [ "junit", ], }
การทดสอบโรโบเล็กตริก
การทดสอบ Robolectric ใช้รันเนอร์เดียวกันกับการทดสอบโฮสต์แบบแยก โดยมีตัวเลือกพิเศษบางอย่าง
- ตัวเลือก
robolectric-resources
ช่วยให้สามารถส่งผ่านตัวเลือกบรรทัดคำสั่งเฉพาะ Robolectric บางตัวไปยังกระบวนการย่อยได้ รวมถึงเพิ่มโครงสร้างแผนผังของandroid-all
ไปยัง classpath ของกระบวนการย่อย ในขณะที่อีกสองแนวทางปฏิบัติที่ดีที่สุดคือตัวเลือกนี้ จำเป็น สำหรับการรันการทดสอบ Robolectric หากประสบความสำเร็จ - ตัวเลือก
java-folder
อนุญาตให้เปลี่ยนรันไทม์ Java ที่ใช้โดยกระบวนการย่อย นี่เป็นสิ่งจำเป็นเนื่องจาก Robolectric เลือกใช้เวอร์ชัน Java เฉพาะที่อาจไม่สอดคล้องกับ JVM ที่ต้องการของระบบโฮสต์ -
exclude-paths
ช่วยให้ผู้รันกระบวนการย่อยหลีกเลี่ยงการโหลดโมดูลใดโมดูลหนึ่งเลย ซึ่งมีประโยชน์เมื่อ JAR มาพร้อมกับคลาสที่ไม่เกี่ยวข้องซึ่งอาจทำให้เกิดข้อผิดพลาดในการโหลดjava.
เป็นข้อยกเว้นทั่วไปเพื่อหลีกเลี่ยงการทิ้งข้อยกเว้นSecurityException
ตัวอย่างการกำหนดค่า Robolectric
<configuration description="Executes a Sample Robolectric Test"> <option name="java-folder" value="prebuilts/jdk/jdk9/linux-x86/" /> <option name="exclude-paths" value="java" /> <option name="use-robolectric-resources" value="true" /> <test class="com.android.tradefed.testtype.IsolatedHostTest"> <option name="jar" value="RobolectricExampleTest.jar" /> </test> </configuration>
ตัวอย่างการกำหนดค่า Soong สำหรับการสร้างอัตโนมัติ Robolectric
แทนที่จะสร้างการกำหนดค่าการทดสอบด้วยตนเองเหมือน ด้านบน Soong สามารถสร้างการกำหนดค่าอัตโนมัติได้โดยใช้การประกาศตามตัวอย่างนี้
android_robolectric_test { name: "HelloWorldRoboTest", srcs: [ "src/**/*.java", ], // Include the testing libraries static_libs: [ "mockito-robolectric-prebuilt", "platform-test-annotations", "testng", "truth-prebuilt", ], instrumentation_for: "HelloWorldApp", }
การทดสอบหลาม
หากตรรกะการทดสอบเขียนด้วย Python ให้ใช้ประเภทบิลด์ python_test_host
เพื่อสร้างไฟล์พาร์ที่สามารถรันโดย TF PythonBinaryHostTest
ตัวอย่างการกำหนดค่าการทดสอบ TradeFed
<configuration description="Config to run atest unittests"> <test class="com.android.tradefed.testtype.python.PythonBinaryHostTest" > <option name="par-file-name" value="atest_unittests" /> <option name="test-timeout" value="2m" /> </test> </configuration>
การตั้งค่าชุดทดสอบ
เพื่อให้การทดสอบฝั่งโฮสต์สามารถเข้าถึงได้โดย TF สำหรับบิลด์ที่กำหนด ให้ตั้งค่าโมดูลการทดสอบ `test_suites`
เป็น `general-tests`
:
test_suites: ["general-tests"],
ด้วยการตั้งค่านี้ การทดสอบจะถูกรวมเป็นแพ็กเกจ general-tests.zip
บนเป้าหมาย test_suites