การกำหนดเป้าหมายตัวอย่างแอปพลิเคชัน

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

โปรดทราบว่าคู่มือนี้ถือว่าคุณมีความรู้ในเวิร์กโฟลว์แผนผังแหล่งที่มาของแพลตฟอร์มอยู่แล้ว หากไม่ใช่ โปรดดูที่ https://source.android.com/source/requirements ตัวอย่างที่กล่าวถึงในที่นี้คือการเขียนการทดสอบเครื่องมือวัดใหม่ด้วยแพ็คเกจเป้าหมายที่ตั้งไว้ที่แพ็คเกจแอปพลิเคชันทดสอบของตัวเอง ถ้าคุณไม่คุ้นเคยกับแนวคิดโปรดอ่านผ่าน การแนะนำการทดสอบแพลตฟอร์ม

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

  • frameworks/base/packages/Shell/tests

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

การตัดสินใจเลือกตำแหน่งต้นทาง

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

ดูการอภิปรายเพิ่มเติมเกี่ยวกับสถานที่ตั้งของแหล่งที่มาใน ตัวอย่างแบบ end-to-end สำหรับการทดสอบด้วยตนเอง instrumenting

ไฟล์ Manifest

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

ก่อนที่จะดำเนินต่อไปก็ขอแนะนำให้ไปผ่าน ภาพรวม App Manifest แรก

ซึ่งจะให้ภาพรวมขององค์ประกอบพื้นฐานของไฟล์รายการและฟังก์ชันการทำงาน

เวอร์ชันล่าสุดของไฟล์ Manifest สำหรับการเปลี่ยนแปลง gerrit ตัวอย่างสามารถเข้าถึงได้ที่: https://android.googlesource.com/platform/frameworks/base/+/master/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 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" />

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

android:targetPackage="com.android.shell"

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

ไฟล์กำหนดค่าอย่างง่าย

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

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

สำหรับการทดสอบที่ซับซ้อนมากขึ้นคุณยังต้องเขียนไฟล์การกำหนดค่าสำหรับการทดสอบเทียมทดสอบของ Android มาพันธ์การค้า

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

รุ่นล่าสุดของไฟล์ config สำหรับการเปลี่ยนแปลง Gerrit ตัวอย่างสามารถเข้าถึงได้ที่: กรอบ / ฐาน / แพคเกจ / เชลล์ / ทดสอบ / 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>

สิ่งนี้บอกให้สหพันธ์การค้าติดตั้ง 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 ในกรณีนี้

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

คุณสมบัติของ JUnit4

การใช้ android-support-test ห้องสมุดขณะวิ่งทดสอบช่วยให้ adoptation ของการเรียนการทดสอบรูปแบบ JUnit4 ใหม่และการเปลี่ยนแปลงตัวอย่าง Gerrit มีบางส่วนที่ใช้งานพื้นฐานมากจากคุณลักษณะของมัน

รหัสที่มาล่าสุดสำหรับการเปลี่ยนแปลง Gerrit ตัวอย่างสามารถเข้าถึงได้ที่: กรอบ / ฐาน / แพคเกจ / เชลล์ / ทดสอบ / src / co.th / Android / เปลือก / BugreportReceiverTest.java

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

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

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

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

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

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

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

        Context context = InstrumentationRegistry.getTargetContext();

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

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

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

สำหรับส่วนกรณีการใช้งานร่วมกันจ้าง Atest

สำหรับกรณีที่ซับซ้อนมากขึ้นที่กำหนดให้การปรับแต่งหนักทำตาม คำแนะนำเครื่องมือ