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

หน้านี้จะอธิบายวิธีเขียนการทดสอบฝั่งโฮสต์ที่ไม่ต้องใช้อุปกรณ์ เช่น การทดสอบที่ทำงานในอินสแตนซ์ Linux GCE (โปรดดูรายละเอียดเกี่ยวกับการ เขียนการทดสอบที่ขับเคลื่อนโดยโฮสต์ซึ่งต้องใช้อุปกรณ์ที่หัวข้อ Write a Host-driven Test in 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) ในโฮสต์ ระบบสามารถสร้างการกำหนดค่าการทดสอบตัวอย่างได้โดยอัตโนมัติ คุณสามารถใช้การสร้างการกำหนดค่าการทดสอบอัตโนมัติเพื่อสร้างการกำหนดค่าการทดสอบ TF ที่เหมาะสมได้ เว้นแต่ว่าการทดสอบของคุณจะต้องมีการตั้งค่าหรือการล้างข้อมูลพิเศษ

หากต้องการกำหนดค่า gtest ฝั่งโฮสต์และเปิดใช้การสร้างการกำหนดค่าการทดสอบอัตโนมัติ ให้ตั้งค่า host_supported เป็น true ใน Android.bp เช่นเดียวกับใน hello_world_test

ดูข้อมูลเพิ่มเติมเกี่ยวกับการเขียนการทดสอบแบบเนทีฟได้ที่หัวข้อ Adding a New Native Test Example

การทดสอบโฮสต์ 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 ที่ไม่ใช้อุปกรณ์ในสภาพแวดล้อมแบบแยกได้โดยมีค่าใช้จ่ายด้านประสิทธิภาพเล็กน้อย อย่างไรก็ตาม คุณควรพิจารณาข้อควรพิจารณาที่สำคัญบางประการก่อนเลือกใช้สภาพแวดล้อมนี้

  • นี่คือ Runner เริ่มต้นที่ใช้สำหรับการทดสอบหน่วย Robolectric และ JUnit
  • Tradefed รองรับเฉพาะการทดสอบ JUnit ในสภาพแวดล้อมแบบแยก
  • ระบบรองรับเฉพาะทรัพยากร Dependency ที่ลิงก์แบบคงที่ ระบบจะไม่รวมทรัพยากร Dependency ที่ประกาศ ด้วย lib ไว้ใน classpath
  • Runner แบบแยกจะวางเฉพาะ Runner Shim และ JAR การทดสอบของคุณไว้ใน classpath
  • การเรียกใช้การทดสอบแต่ละครั้งที่ดำเนินการด้วย Runner นี้จะมีค่าใช้จ่ายคงที่จำนวนหนึ่ง

ตัวอย่างการกำหนดค่าการทดสอบ 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 ใช้ Runner เดียวกับการทดสอบโฮสต์แบบแยก โดยมีตัวเลือกพิเศษบางอย่าง

  • ตัวเลือก robolectric-resources ช่วยให้ส่งตัวเลือกบรรทัดคำสั่งเฉพาะของ Robolectric บางตัว ไปยังกระบวนการย่อยได้ รวมถึงเพิ่มการสร้างแบบต้นไม้ของ android-all ลงใน classpath ของกระบวนการย่อย แม้ว่าตัวเลือกอื่นๆ 2 ตัวจะเป็นแนวทางปฏิบัติแนะนำ แต่ตัวเลือกนี้เป็น ข้อบังคับ สำหรับ การเรียกใช้การทดสอบ Robolectric ให้สำเร็จ
  • ตัวเลือก java-folder ช่วยให้เปลี่ยนรันไทม์ Java ที่กระบวนการย่อยใช้ได้ ตัวเลือกนี้จำเป็นเนื่องจาก Robolectric ชอบ Java เวอร์ชันที่เฉพาะเจาะจงซึ่งอาจไม่สอดคล้องกับ JVM ที่ระบบโฮสต์ต้องการ
  • ตัวเลือก exclude-paths ช่วยให้ Runner กระบวนการย่อยหลีกเลี่ยงการโหลดโมดูลที่เฉพาะเจาะจง ได้ ซึ่งมีประโยชน์เมื่อ 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