Google มุ่งมั่นที่จะพัฒนาความเท่าเทียมทางเชื้อชาติสำหรับชุมชนคนผิวดำ มาดูกันว่า
หน้านี้ได้รับการแปลโดย Cloud Translation API
Switch to English

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

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

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

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

  • กรอบ / ฐาน / แพคเกจ / เชลล์ / ทดสอบ

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

ตัดสินใจเลือกที่ตั้งต้นทาง

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

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

ไฟล์มานิเฟสต์

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

ก่อนดำเนินการเพิ่มเติมขอแนะนำอย่างยิ่งให้อ่าน ภาพรวม App ก่อน

สิ่งนี้จะให้ภาพรวมขององค์ประกอบพื้นฐานของไฟล์ 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" />
 

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

 android:targetPackage="com.android.shell"
 

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

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

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

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

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

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

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

สิ่งนี้บอกให้สหพันธ์การค้าติดตั้ง 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 ไลบรารี่ในฐานะนักทดสอบจะเปิดใช้งานการทดสอบสไตล์ 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() {
    ...
 

คำอธิบายประกอบ @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

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