เขียนการทดสอบแบบไม่ใช้อุปกรณ์ฝั่งโฮสต์ใน TF

หน้านี้จะบอกวิธีเขียนการทดสอบฝั่งโฮสต์ที่ไม่ต้องใช้อุปกรณ์ เช่น การทดสอบที่ทำงานบนอินสแตนซ์ GCE ของ Linux (ดูรายละเอียดเกี่ยวกับการ เขียนการทดสอบที่ขับเคลื่อนโดยโฮสต์ซึ่งต้องใช้อุปกรณ์ได้ที่ เขียนการทดสอบที่ขับเคลื่อนโดยโฮสต์ใน Trade Federation)

ประเภทการทดสอบฝั่งโฮสต์

คุณสามารถเรียกใช้การทดสอบฝั่งโฮสต์ได้หลายประเภทผ่าน 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 คุณกำหนดค่าการทดสอบดังกล่าวให้ทำงานในโฮสต์ทดสอบได้โดยใช้โปรแกรมเรียกใช้ 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 ในสภาพแวดล้อมที่แยก
  • ระบบรองรับเฉพาะการอ้างอิงที่ลิงก์แบบคงที่เท่านั้น ไม่มีการประกาศทรัพยากร Dependency ที่มี lib จะรวมอยู่ใน classpath
  • โปรแกรมเรียกใช้การแยกจะวางโปรแกรมเรียกใช้ Shim และไฟล์ 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 ใช้ตัวเรียกใช้เดียวกันกับการทดสอบโฮสต์ที่แยกต่างหาก โดยมีตัวเลือกพิเศษบางอย่าง

  • 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