หน้านี้จะบอกวิธีเขียนการทดสอบฝั่งโฮสต์ที่ไม่ต้องใช้อุปกรณ์ เช่น การทดสอบที่ทํางานบนอินสแตนซ์ GCE ของ Linux (โปรดดูรายละเอียดเกี่ยวกับการเขียนการทดสอบที่เรียกใช้โฮสต์ซึ่งต้องใช้อุปกรณ์ที่หัวข้อ เขียนการทดสอบที่เรียกใช้โฮสต์ใน Trade Federation)
ประเภทการทดสอบฝั่งโฮสต์
คุณทำการทดสอบฝั่งโฮสต์ได้หลายประเภทผ่าน Trade Federation (TF)
การทดสอบแบบเนทีฟ (gtest)
สร้างการทดสอบเนทีฟ (gtest) เพื่อทดสอบแพลตฟอร์ม หากการทดสอบไม่จําเป็นต้องใช้อุปกรณ์ ให้เรียกใช้การทดสอบในโฮสต์ การทดสอบจะทํางานได้เร็วขึ้นมาก หากต้องการกําหนดค่าการทดสอบดังกล่าวให้ทํางานบนโฮสต์ทดสอบ ให้ใช้ 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) ในโฮสต์ ระบบจะสร้างตัวอย่าง test.config โดยอัตโนมัติ คุณสามารถอาศัยการสร้างการกําหนดค่าการทดสอบอัตโนมัติเพื่อสร้างการกําหนดค่าการทดสอบ TF ที่เหมาะสมได้ เว้นแต่การทดสอบจะต้องมีการตั้งค่าหรือการล้างข้อมูลพิเศษ
หากต้องการกําหนดค่า gtest ฝั่งโฮสต์และเปิดใช้การสร้างการกําหนดค่าการทดสอบอัตโนมัติ ให้ตั้งค่า host_supported
เป็น true
ใน Android.bp
ดังเช่นใน hello_world_test
ดูข้อมูลเพิ่มเติมเกี่ยวกับการเขียนการทดสอบแบบเนทีฟได้ที่ตัวอย่างการเพิ่มการทดสอบแบบเนทีฟใหม่
การทดสอบโฮสต์ JAR
การทดสอบโฮสต์ JAR (Java) เช่น JUnit เป็นการทดสอบที่ไม่จําเป็นต้องทํางานบนอุปกรณ์ และให้การครอบคลุมโค้ดของโปรเจ็กต์ Java การทดสอบดังกล่าวสามารถกําหนดค่าให้ทํางานบนโฮสต์ทดสอบได้โดยใช้โปรแกรมรัน 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 แบบไม่มีอุปกรณ์จะทํางานได้ในสภาพแวดล้อมแยกต่างหากโดยเสียประสิทธิภาพเล็กน้อย อย่างไรก็ตาม มีข้อควรพิจารณาที่สำคัญบางประการที่ควรทำก่อนเลือกใช้สภาพแวดล้อมนี้
- นี่คือโปรแกรมรันไทม์เริ่มต้นที่ใช้สำหรับการทดสอบ 1 หน่วยของ Robolectric และ JUnit
- Tradefed รองรับเฉพาะการทดสอบ JUnit ในสภาพแวดล้อมแยก
- ระบบรองรับเฉพาะไลบรารีที่ลิงก์แบบคงที่เท่านั้น ไม่มี Dependency ที่ประกาศด้วย
lib
รวมอยู่ใน Classpath - โปรแกรมรันไทม์การแยกจะใส่เฉพาะโปรแกรมรันไทม์ชิมและไฟล์ 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 ใช้รันเนอร์เดียวกับการทดสอบโฮสต์แบบแยกซึ่งมีตัวเลือกพิเศษ 2-3 รายการ
- ตัวเลือก
robolectric-resources
จะช่วยให้ส่งตัวเลือกบรรทัดคำสั่งสำหรับ Robolectric บางรายการไปยังกระบวนการย่อยได้ รวมถึงเพิ่มบิลด์ต้นไม้ของandroid-all
ลงในเส้นทางของคลาสของกระบวนการย่อย แม้ว่าอีก 2 ตัวเลือกจะเป็นแนวทางปฏิบัติแนะนำ แต่ตัวเลือกนี้ต้องระบุเพื่อทำการทดสอบ 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 ให้ใช้ประเภทบิลด์ python_test_host
เพื่อสร้างไฟล์ PAR ที่ 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