ตัวอย่างการทดสอบด้วยตนเอง

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

ซึ่งหมายความว่าการทดสอบเครื่องมือวัดไม่สามารถแทรกตัวเองลงในเฟรมเวิร์กของ Android หรือที่เรียกว่าเซิร์ฟเวอร์ระบบเพื่อดำเนินการได้ เพื่อทดสอบกรอบ Android ของรหัสการทดสอบสามารถเรียกใช้พื้นผิว API เท่านั้นสาธารณะหรือผู้ที่สัมผัสผ่านทาง Android อินเตอร์เฟซภาษานิยาม AIDL ที่มีอยู่ในต้นไม้แหล่งแพลตฟอร์ม สำหรับการทดสอบประเภทนี้ การกำหนดเป้​​าหมายแพ็คเกจใดโดยเฉพาะไม่มีความหมาย ดังนั้นจึงเป็นประเพณีสำหรับ instrumentations ดังกล่าวจะได้รับการประกาศให้กำหนดเป้าหมายการประยุกต์ใช้แพคเกจการทดสอบของตัวเองตามที่กำหนดไว้ในตัวของมันเอง <manifest> แท็กของ AndroidManifest.xml

ขึ้นอยู่กับข้อกำหนด แพ็คเกจแอปพลิเคชันทดสอบในหมวดหมู่นี้อาจ:

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

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

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

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

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

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

สมมติว่าตำแหน่งรากสำหรับแหล่งส่วนประกอบของคุณอยู่ที่ <component source root> ส่วนประกอบส่วนใหญ่จะมี src และ tests โฟลเดอร์ภายใต้มันและบางไฟล์เพิ่มเติมเช่น Android.mk (หรือแตกออกเป็นเพิ่มเติม .mk ไฟล์) ไฟล์ชัดแจ้ง AndroidManifest.xml และแฟ้มการกำหนดค่าการทดสอบ 'AndroidTest.xml'

เนื่องจากคุณจะเพิ่มแบรนด์ทดสอบใหม่คุณอาจจะต้องสร้าง tests ไดเรกทอรีถัดจากคอมโพเนนต์ของคุณ src และเติมมันมีเนื้อหา

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

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

ไฟล์ Manifest

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

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

ซึ่งจะให้ภาพรวมขององค์ประกอบพื้นฐานของไฟล์รายการและฟังก์ชันการทำงาน ดูตัวอย่างที่ platform_testing / ทดสอบ / ตัวอย่าง / เครื่องมือ / AndroidManifest.xml

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

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="android.test.example.helloworld" >

    <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="21" />

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

    <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
                     android:targetPackage="android.test.example.helloworld"
                     android:label="Hello World Test"/>

</manifest>

ข้อสังเกตบางประการเกี่ยวกับไฟล์รายการ:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="android.test.example.helloworld" >

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

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

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

android:sharedUserId="android.uid.system"

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

  • สิทธิ์หรือ API บางอย่างได้รับการป้องกันด้วยลายเซ็น ซึ่งต้องใช้ใบรับรองการลงนามเดียวกัน
  • สิทธิ์บางส่วนหรือ API ที่ต้องใช้ system ตัวตนของผู้ใช้ของผู้โทรซึ่งจะต้องมีแพคเกจโทรที่จะแชร์รหัสผู้ใช้ที่มี system ถ้ามันเป็นแพคเกจที่แยกต่างหากจากแพลตฟอร์มหลักของตัวเอง
<uses-library android:name="android.test.runner" />

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

android:targetPackage="android.test.example.helloworld"

คุณอาจสังเกตเห็นว่า targetPackage ที่นี่มีการประกาศเช่นเดียวกับ package แอตทริบิวต์ประกาศใน manifest แท็กของไฟล์นี้ ดังกล่าวใน เบื้องต้นเกี่ยวกับการทดสอบ ประเภทของการทดสอบวัดนี้มักจะมีวัตถุประสงค์สำหรับการทดสอบ API สำหรับกรอบการทำงานเพื่อให้มันไม่ได้มีความหมายมากสำหรับพวกเขาที่จะมีแพคเกจเฉพาะของโปรแกรมที่กำหนดเป้าหมายอื่น ๆ แล้วตัวเอง

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

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

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

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

การกำหนดค่าการทดสอบสามารถระบุตัวเลือกการตั้งค่าอุปกรณ์พิเศษและอาร์กิวเมนต์เริ่มต้นเพื่อจัดหาคลาสการทดสอบ ดูตัวอย่างที่ /platform_testing/tests/example/instrumentation/AndroidTest.xml

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

<configuration description="Runs sample instrumentation test.">
  <target_preparer class="com.android.tradefed.targetprep.TestFilePushSetup"/>
  <target_preparer class="com.android.tradefed.targetprep.TestAppInstallSetup">
    <option name="test-file-name" value="HelloWorldTests.apk"/>
  </target_preparer>
  <target_preparer class="com.android.tradefed.targetprep.PushFilePreparer"/>
  <target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer"/>
  <option name="test-suite-tag" value="apct"/>
  <option name="test-tag" value="SampleInstrumentationTest"/>

  <test class="com.android.tradefed.testtype.AndroidJUnitTest">
    <option name="package" value="android.test.example.helloworld"/>
    <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="HelloWorldTests.apk"/>
</target_preparer>

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

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

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

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

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

การใช้ android-support-test ห้องสมุดขณะวิ่งทดสอบจะช่วยให้การนำของการเรียนการทดสอบรูปแบบ JUnit4 ใหม่และการเปลี่ยนแปลงตัวอย่าง Gerrit มีบางส่วนที่ใช้งานพื้นฐานมากจากคุณลักษณะของมัน ดูตัวอย่างที่ /platform_testing/tests/example/instrumentation/src/android/test/example/helloworld/HelloWorldTest.java

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

@RunWith(JUnit4.class)
public class HelloWorldTest {

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

    @BeforeClass
    public static void beforeClass() {
    ...
    @AfterClass
    public static void afterClass() {
    ...
    @Before
    public void before() {
    ...
    @After
    public void after() {
    ...
    @Test
    @SmallTest
    public void testHelloWorld() {
    ...

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

สำคัญ: วิธีการทดสอบตัวเองจะมีคำอธิบายประกอบกับ @Test คำอธิบายประกอบ; และทราบว่าสำหรับการทดสอบที่จะดำเนินการผ่านทาง APCT พวกเขาจะต้องมีคำอธิบายประกอบที่มีขนาดการทดสอบ: ตัวอย่างข้อเขียนวิธี testHelloWorld เป็น @SmallTest อาจใช้คำอธิบายประกอบที่ขอบเขตเมธอดหรือขอบเขตคลาส

การเข้าถึง instrumentation

แม้ว่าจะไม่ได้รับการคุ้มครองในตัวอย่าง Hello World พื้นฐานมันเป็นเรื่องธรรมดาสำหรับการทดสอบ Android เพื่อต้องการการเข้าถึง Instrumentation เช่นนี้เป็นอินเตอร์เฟซ API หลักที่ให้การเข้าถึงบริบทการประยุกต์ใช้วงจรกิจกรรมที่เกี่ยวข้องกับการทดสอบ APIs และอื่น ๆ

เพราะ JUnit4 ทดสอบไม่จำเป็นต้องมีระดับฐานร่วมกันก็ไม่จำเป็นอีกต่อไปที่จะได้รับ Instrumentation เช่นผ่าน InstrumentationTestCase#getInstrumentation() แทนวิ่งทดสอบใหม่การบริหารจัดการผ่านทาง InstrumentationRegistry ที่ติดตั้งตามบริบทและสิ่งแวดล้อมที่สร้างขึ้นโดยกรอบการวัดจะถูกเก็บไว้

ในการเข้าถึงตัวอย่างของ Instrumentation ระดับเพียงโทรวิธีคง getInstrumentation() บน InstrumentationRegistry ระดับ:

Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation()

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

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

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