กำหนดเป้าหมายตัวอย่างแอป

หมวดหมู่ของการทดสอบการใช้เครื่องมือนี้ไม่ได้แตกต่างจากการกำหนดเป้าหมายเหล่านั้น แอปพลิเคชัน Android ทั่วไป โปรดทราบว่าแอปพลิเคชันทดสอบที่มีเครื่องมือวัดต้องได้รับการรับรองด้วยใบรับรองเดียวกันกับแอปพลิเคชันที่กำหนดเป้าหมาย

โปรดทราบว่าคู่มือนี้ถือว่าคุณมีความรู้บางอย่างเกี่ยวกับเวิร์กโฟลว์ของต้นไม้แหล่งที่มาของแพลตฟอร์มอยู่แล้ว หากไม่มี โปรดดูข้อกำหนด ตัวอย่างที่อธิบายในที่นี้คือการเขียนการทดสอบการใช้เครื่องมือใหม่โดยมีการกำหนดเป้าหมาย สร้างเป็นแพ็กเกจแอปพลิเคชันทดสอบของตนเอง หากคุณไม่คุ้นเคยกับ โปรดอ่านบทนำการทดสอบแพลตฟอร์ม

คู่มือนี้ใช้การทดสอบต่อไปนี้เพื่อแสดงตัวอย่าง

  • เฟรมเวิร์ก/ฐาน/แพ็กเกจ/เชลล์/การทดสอบ

ขอแนะนำให้เรียกดูผ่านโค้ดก่อนเพื่อให้ได้รับการแสดงผลคร่าวๆ ก่อนดำเนินการต่อ

เลือกตําแหน่งของแหล่งที่มา

เนื่องจากการทดสอบการใช้เครื่องมือจะกำหนดเป้าหมายแอปพลิเคชัน คือการวางซอร์สโค้ดทดสอบในไดเรกทอรี tests ใต้ราก ไดเรกทอรีแหล่งที่มาของคอมโพเนนต์ในแผนผังแหล่งที่มาของแพลตฟอร์ม

ดูการสนทนาเพิ่มเติมเกี่ยวกับตำแหน่งของแหล่งที่มาในตัวอย่างตั้งแต่ต้นจนจบสำหรับ การทดสอบด้วยตนเอง

ไฟล์ Manifest

เช่นเดียวกับแอปพลิเคชันทั่วไป โมดูลการทดสอบการใช้เครื่องมือแต่ละรายการจะต้องมี Manifest หากคุณตั้งชื่อไฟล์เป็น AndroidManifest.xml และระบุเป็นรายการถัดไป ไปยัง Android.mk สำหรับโมดูลทดสอบ ซึ่งจะรวมอยู่ใน BUILD_PACKAGE ไฟล์รูปแบบหลัก

ก่อนดำเนินการต่อ เราขอแนะนำให้อ่านภาพรวมไฟล์ Manifest ของแอปก่อน

ซึ่งจะให้ภาพรวมของคอมโพเนนต์พื้นฐานของไฟล์ Manifest และคอมโพเนนต์ ที่มีประโยชน์

เข้าถึงไฟล์ Manifest เวอร์ชันล่าสุดสำหรับการเปลี่ยนแปลง Gerrit ตัวอย่างได้ ที่: https://android.googlesource.com/platform/frameworks/base/+/main/packages/Shell/tests/AndroidManifest.xml

เราได้รวมสแนปชอตไว้ที่นี่เพื่อความสะดวก:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.android.shell.tests">

    <application>
        <uses-library android:name="android.test.runner" />

        <activity
            android:name="com.android.shell.ActionSendMultipleConsumerActivity"
            android:label="ActionSendMultipleConsumer"
            android:theme="@android:style/Theme.NoDisplay"
            android:noHistory="true"
            android:excludeFromRecents="true">
            <intent-filter>
                <action android:name="android.intent.action.SEND_MULTIPLE" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="*/*" />
            </intent-filter>
        </activity>
    </application>

    <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
        android:targetPackage="com.android.shell"
        android:label="Tests for Shell" />

</manifest>

บางรายเลือกหมายเหตุในไฟล์ Manifest ดังนี้

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.android.shell.tests">

แอตทริบิวต์ package เป็นชื่อแพ็กเกจของแอปพลิเคชัน ซึ่งเป็นชื่อที่ไม่ซ้ำกัน ที่เฟรมเวิร์กแอปพลิเคชัน Android ใช้เพื่อระบุ แอปพลิเคชัน (หรือในบริบทนี้คือแอปพลิเคชันทดสอบของคุณ) ผู้ใช้แต่ละรายในระบบ สามารถติดตั้งแอปพลิเคชันที่มีชื่อแพ็กเกจนั้นได้เพียงรายการเดียวเท่านั้น

เนื่องจากนี่คือแพ็กเกจแอปพลิเคชันทดสอบที่ไม่เกี่ยวข้องกับแอปพลิเคชัน แพ็กเกจที่อยู่ระหว่างการทดสอบ จะต้องใช้ชื่อแพ็กเกจอื่น: แบบแผนทั่วไปหนึ่งแบบ คือการเพิ่มคำต่อท้าย .test

นอกจากนี้ แอตทริบิวต์ package นี้เหมือนกับ ComponentName#getPackageName() การคืนสินค้า และเช่นเดียวกับที่คุณจะใช้ในการโต้ตอบกับย่อย pm ที่หลากหลาย คำสั่งผ่าน adb shell

โปรดทราบว่าแม้ว่าชื่อแพ็กเกจมักจะอยู่ในรูปแบบเดียวกัน เป็นชื่อแพ็กเกจ Java เรียกสิ่งนี้ได้น้อยมาก ในอีก คำ แพ็คเกจแอปพลิเคชัน (หรือการทดสอบ) ของคุณอาจมีคลาสที่มีแพ็คเกจใดๆ แต่ในทางกลับกัน คุณสามารถเลือกความเรียบง่ายและ ชื่อแพ็กเกจ Java ระดับเดิมในแอปพลิเคชันหรือการทดสอบเหมือนกับแอปพลิเคชันของคุณ ชื่อแพ็กเกจ

<uses-library android:name="android.test.runner" />

ซึ่งจำเป็นสำหรับการทดสอบการใช้เครื่องมือทั้งหมด เนื่องจากชั้นเรียนที่เกี่ยวข้อง อยู่ในไฟล์ไลบรารี Jar ของเฟรมเวิร์กที่แยกต่างหาก ดังนั้นจึงต้องมี รายการ classpath เมื่อเฟรมเวิร์กแอปพลิเคชันเรียกใช้แพ็กเกจทดสอบ

android:targetPackage="com.android.shell"

ซึ่งจะตั้งค่าแพ็กเกจเป้าหมายของการใช้เครื่องมือเป็น com.android.shell เมื่อเครื่องมือเรียกใช้ผ่านคำสั่ง am instrument เฟรมเวิร์ก รีสตาร์ทกระบวนการ com.android.shell และแทรกโค้ดการใช้เครื่องมือลงใน ขั้นตอนการดำเนินการทดสอบ ซึ่งหมายความว่าโค้ดทดสอบจะมี เข้าถึงอินสแตนซ์คลาสทั้งหมดที่ใช้งานในแอปพลิเคชันภายใต้การทดสอบ และอาจ สถานะความสามารถในการปรับเปลี่ยนจะขึ้นอยู่กับฮุกทดสอบที่เปิดเผย

ไฟล์การกําหนดค่าแบบง่าย

โมดูลทดสอบใหม่แต่ละรายการต้องมีไฟล์การกําหนดค่าเพื่อควบคุมระบบการสร้างด้วยข้อมูลเมตาของโมดูล ไลบรารีที่ใช้ร่วมกันขณะคอมไพล์ และวิธีการจัดแพ็กเกจ ในกรณีส่วนใหญ่ ตัวเลือกไฟล์ Blueprint แบบ Soong เพียงพอ โปรดดูรายละเอียดในการกำหนดค่าการทดสอบแบบง่าย

ไฟล์การกำหนดค่าที่ซับซ้อน

สําหรับการทดสอบที่ซับซ้อนมากขึ้น คุณจะต้องเขียนไฟล์การกําหนดค่าการทดสอบสําหรับ Trade Federation ซึ่งเป็นชุดทดสอบของ Android ด้วย

การกําหนดค่าการทดสอบสามารถระบุตัวเลือกการตั้งค่าอุปกรณ์พิเศษและอาร์กิวเมนต์เริ่มต้นเพื่อระบุคลาสทดสอบ

สามารถเข้าถึงไฟล์การกำหนดค่าเวอร์ชันล่าสุดสำหรับการเปลี่ยนแปลง Gerrit ตัวอย่างได้ ที่: เฟรมเวิร์ก/base/packages/Shell/tests/AndroidTest.xml

เรามีภาพรวมไว้ให้ที่นี่เพื่อความสะดวก

<configuration description="Runs Tests for Shell.">
    <target_preparer class="com.android.tradefed.targetprep.TestAppInstallSetup">
        <option name="test-file-name" value="ShellTests.apk" />
    </target_preparer>

    <option name="test-suite-tag" value="apct" />
    <option name="test-tag" value="ShellTests" />
    <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
        <option name="package" value="com.android.shell.tests" />
        <option name="runner" value="android.support.test.runner.AndroidJUnitRunner" />
    </test>
</configuration>

เลือกหมายเหตุในไฟล์การกำหนดค่าการทดสอบดังนี้

<target_preparer class="com.android.tradefed.targetprep.TestAppInstallSetup">
  <option name="test-file-name" value="ShellTests.apk"/>
</target_preparer>

การดำเนินการนี้จะบอกให้ Trade Federation ติดตั้ง ShellTests.apk บนเป้าหมาย โดยใช้ target_preparer ที่ระบุ มีผู้เตรียมเป้าหมายหลายราย พร้อมใช้งานสำหรับนักพัฒนาซอฟต์แวร์ในสหพันธ์การค้า ซึ่งสามารถใช้เพื่อ ตั้งค่าอุปกรณ์อย่างเหมาะสมก่อนทดสอบการดำเนินการ

<test class="com.android.tradefed.testtype.AndroidJUnitTest">
  <option name="package" value="com.android.shell.tests"/>
  <option name="runner" value="android.support.test.runner.AndroidJUnitRunner"/>
</test>

ช่องนี้ระบุคลาสการทดสอบสหพันธ์การค้าที่จะใช้เพื่อดำเนินการทดสอบและ ในแพ็กเกจบนอุปกรณ์เพื่อดำเนินการและตัวดำเนินการทดสอบ ซึ่งในกรณีนี้คือ JUnit

ดูข้อมูลเพิ่มเติมเกี่ยวกับการกำหนดค่าโมดูลการทดสอบได้ที่นี่

ฟีเจอร์ของ JUnit4

การใช้ไลบรารี android-support-test เป็นตัวดำเนินการทดสอบช่วยให้สามารถปรับใช้ คลาสการทดสอบสไตล์ JUnit4 และการเปลี่ยนแปลง Gerrit ตัวอย่างมีข้อมูลเบื้องต้น การใช้งานฟีเจอร์ต่างๆ ได้

คุณสามารถเข้าถึงซอร์สโค้ดล่าสุดสำหรับการเปลี่ยนแปลง Gerrit ตัวอย่างได้ที่: frameworks/base/packages/Shell/tests/src/com/android/shell/BugreportReceiverTest.java

แม้ว่าโดยทั่วไปแล้วรูปแบบการทดสอบจะเจาะจงสำหรับทีมคอมโพเนนต์ แต่ก็มีรูปแบบการใช้งานที่มีประโยชน์โดยทั่วไป

@SmallTest
@RunWith(AndroidJUnit4.class)
public final class FeatureFactoryImplTest {

ความแตกต่างที่สำคัญใน JUnit4 คือไม่จำเป็นต้องเขียนการทดสอบเพื่อรับค่าจากคลาสทดสอบพื้นฐานทั่วไปอีกต่อไป แต่ให้เขียนการทดสอบในคลาส Java ธรรมดาและใช้แอตทริบิวต์กำกับเพื่อระบุการตั้งค่าการทดสอบและข้อจำกัดบางอย่าง ใน ในตัวอย่างนี้ เราจะบอกได้ว่าชั้นเรียนนี้ควรใช้งานในแบบ Android การทดสอบ JUnit4

คำอธิบายประกอบ @SmallTest ระบุขนาดการทดสอบสำหรับคลาสการทดสอบทั้งหมด: ทั้งหมด วิธีทดสอบที่เพิ่มลงในคลาสทดสอบนี้จะรับค่าคำอธิบายประกอบขนาดการทดสอบนี้ การตั้งค่าชั้นเรียนก่อนการทดสอบ การฉีกการทดสอบหลังการสอบ และหลังจบการทดสอบ ซึ่งคล้ายกับเมธอด setUp และ tearDown ใน JUnit4 ใช้คำอธิบายประกอบ Test สำหรับคำอธิบายประกอบการทดสอบจริง

    @Before
    public void setup() {
    ...
    @Test
    public void testGetProvider_shouldCacheProvider() {
    ...

JUnit4 ใช้หมายเหตุ @Before กับเมธอดเพื่อตั้งค่าก่อนการทดสอบ แม้ว่าตัวอย่างนี้ไม่ได้ใช้ในตัวอย่างนี้ แต่ก็ยังมี @After สำหรับการทำลายหลังการทดสอบ ในทำนองเดียวกัน คำอธิบายประกอบ @BeforeClass และ @AfterClass สามารถใช้ใน โดยใช้ JUnit4 เพื่อตั้งค่าก่อนดำเนินการทดสอบทั้งหมดในคลาสทดสอบ และรื้อถอนในภายหลัง โปรดทราบว่าการตั้งค่าขอบเขตคลาสและวิธีการแยกข้อมูล ต้องเป็นแบบคงที่

ในส่วนของวิธีทดสอบ JUnit ต่างกับก่อนหน้านี้ คือไม่จำเป็นต้องใช้อีกต่อไป ขึ้นต้นชื่อเมธอดด้วย test แทน แต่ละรายการจะต้องมีคำอธิบายประกอบ ด้วย @Test ตามปกติแล้ว เมธอดทดสอบต้องเป็นแบบสาธารณะ ไม่ประกาศค่าที่แสดงผล ไม่รับพารามิเตอร์ และอาจแสดงข้อยกเว้น

        Context context = InstrumentationRegistry.getTargetContext();

เนื่องจากการทดสอบ JUnit4 ไม่จำเป็นต้องใช้คลาสพื้นฐานทั่วไปอีกต่อไป จำเป็นต่อการรับอินสแตนซ์ Context ผ่าน getContext() หรือ getTargetContext() ผ่านเมธอดคลาสพื้นฐาน ตัวดำเนินการทดสอบใหม่ จัดการผ่าน InstrumentationRegistry โดยการตั้งค่าตามบริบทและสภาพแวดล้อมที่สร้างโดยเฟรมเวิร์กการใช้เครื่องมือ ที่จัดเก็บไว้ ในชั้นเรียนนี้ คุณยังสามารถโทรหา

  • getInstrumentation(): อินสแตนซ์ของคลาส Instrumentation
  • getArguments(): อาร์กิวเมนต์บรรทัดคำสั่งที่ส่งไปยัง am instrument ผ่าน -e <key> <value>

สร้างและทดสอบภายในเครื่อง

สําหรับ Use Case ที่พบบ่อยที่สุด ให้ใช้ Atest

สำหรับกรณีที่ซับซ้อนมากขึ้นที่ต้องปรับแต่งมากขึ้น ให้ทำตาม วิธีการวัดคุม