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

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