หมวดหมู่ของการทดสอบการใช้เครื่องมือนี้ไม่ได้แตกต่างจากการกำหนดเป้าหมายเหล่านั้น แอปพลิเคชัน 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
สำหรับกรณีที่ซับซ้อนมากขึ้นที่ต้องปรับแต่งมากขึ้น ให้ทำตาม วิธีการวัดคุม