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

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