ทดสอบใน Android Studio และ ทดสอบจากบรรทัดคำสั่งอธิบายวิธีตั้งค่า และเรียกใช้การกำหนดค่าการทดสอบพื้นฐาน อย่างไรก็ตาม เมื่อแอปของคุณและแอป ข้อกำหนดการทดสอบมีความซับซ้อนขึ้นมาก คุณอาจต้องปรับตัว การกำหนดค่าเพิ่มเติม ตัวอย่างเช่น คุณอาจต้องใช้การตั้งค่าการทดสอบขั้นสูงเมื่อ คุณต้องการดำเนินการต่อไปนี้
- ทำการทดสอบแบบมีเครื่องควบคุมสำหรับตัวแปรบิลด์ที่เฉพาะเจาะจงหรือลบล้างตัวแปรบิลด์ การตั้งค่าไฟล์ Manifest
- เปลี่ยนประเภทบิลด์ที่ใช้ทดสอบหรือกำหนดค่า Gradle ตัวเลือก
- แยกการทดสอบที่มีเครื่องมือไว้ในโมดูลการทดสอบของตัวเอง
- ทำการทดสอบขั้นสูงขึ้นในฐานะส่วนหนึ่งของการตั้งค่าการผสานรวมอย่างต่อเนื่อง
หน้านี้จะอธิบายถึงวิธีต่างๆ ในการกำหนดค่าการทดสอบของคุณเมื่อค่าเริ่มต้น การตั้งค่าไม่ตรงกับความต้องการของคุณ
สร้างการทดสอบแบบมีเครื่องวัดสำหรับตัวแปรบิลด์
หากโปรเจ็กต์มีสร้างตัวแปรด้วย ชุดแหล่งที่มาที่ไม่ซ้ำกัน คุณอาจต้องรวมการทดสอบแบบมีเครื่องควบคุมที่ จะสอดคล้องกับชุดแหล่งที่มาเหล่านั้น ซึ่งจะช่วยจัดระเบียบโค้ดการทดสอบและ ช่วยให้คุณทําเฉพาะการทดสอบที่ใช้กับตัวแปรบิลด์หนึ่งๆ ได้
หากต้องการลิงก์การทดสอบที่มีการวัดคุมกับตัวแปรบิลด์ ให้วางการทดสอบลงในตัวแปรของตัวเอง
กลุ่มแหล่งที่มาซึ่งมีอยู่ที่
src/androidTestVariantName
ทุกคนจะแชร์การทดสอบที่มีเครื่องดนตรีในชุดแหล่งที่มา src/androidTest/
ตัวแปรของบิลด์ เมื่อสร้าง APK ทดสอบสำหรับ "MyFlavor" ของ
Gradle รวม src/androidTest/
และ src/androidTestMyFlavor/
ชุดแหล่งที่มา
หากต้องการเพิ่มชุดแหล่งที่มาของการทดสอบสำหรับเวอร์ชันของบิลด์ใน Android Studio ให้ทำตาม ขั้นตอนเหล่านี้:
- คลิกเมนูในหน้าต่างโปรเจ็กต์ แล้วเลือก มุมมองโปรเจ็กต์
- ภายในโฟลเดอร์โมดูลที่เหมาะสม ให้คลิกขวาที่โฟลเดอร์ src และ คลิกใหม่ > ไดเรกทอรี
- สำหรับชื่อไดเรกทอรี ให้ป้อน "androidTestVariantName" ตัวอย่างเช่น หาก
คุณมีเวอร์ชันบิลด์ที่ชื่อ "MyFlavor" ใช้ชื่อไดเรกทอรี
androidTestMyFlavor
- คลิกตกลง
- คลิกขวาที่ไดเรกทอรีใหม่แล้วเลือก ใหม่ > ไดเรกทอรี
- ป้อน "java" เป็นชื่อไดเรกทอรี แล้วคลิกตกลง
ตอนนี้คุณเพิ่มการทดสอบในแหล่งที่มาใหม่นี้ได้โดยทําตาม ขั้นตอนเหล่านี้เพื่อเพิ่มการทดสอบใหม่ เมื่อคุณไปถึงกล่องโต้ตอบเลือกไดเรกทอรีปลายทาง ให้เลือก ชุดแหล่งที่มาทดสอบตัวแปร
ตารางต่อไปนี้แสดงตัวอย่างว่าไฟล์ทดสอบการใช้เครื่องมืออาจ อยู่ในชุดแหล่งที่มาที่สอดคล้องกับชุดซอร์สโค้ดของแอป:
ตาราง 1 ซอร์สโค้ดของแอปและความเกี่ยวข้อง ไฟล์ทดสอบการใช้เครื่องมือ
เส้นทางไปยังคลาสแอป | เส้นทางไปยังคลาสการทดสอบการใช้เครื่องมือที่ตรงกัน |
---|---|
src/main/java/Example.java
|
src/androidTest/java/AndroidExampleTest.java
|
src/myFlavor/java/Example.java
|
src/androidTestMyFlavor/java/AndroidExampleTest.java
|
เช่นเดียวกับที่ดำเนินการกับชุดแหล่งที่มาของแอป บิลด์ Gradle จะรวม
ลบล้างไฟล์จากชุดแหล่งที่มาทดสอบอื่น ในกรณีนี้ ค่า
AndroidExampleTest.java
ไฟล์ในการลบล้างชุดต้นฉบับ androidTestMyFlavor
เวอร์ชันในชุดต้นฉบับ androidTest
นั่นเป็นเพราะ
ชุดแหล่งที่มาของรสชาติของผลิตภัณฑ์มีลำดับความสำคัญเหนือชุดแหล่งที่มาหลัก
เมื่อคุณเลือกเวอร์ชันต่างๆ ในตัวเลือกตัวแปรบิลด์
โฟลเดอร์ androidTest
ที่เหมาะสมจะแสดงในมุมมอง Android เพื่อ
แสดงโฟลเดอร์ที่ใช้
![ตัวแปร MyFlavor ที่เลือกและแสดงโฟลเดอร์ androidTestMyFlavor
ในมุมมอง Android](https://developer.android.com/static/studio/images/test/test-myflavor-android-test-android-view.png?authuser=7&hl=th)
MyFlavor
ตัวแปร เวลา
โฟลเดอร์ androidTestMyFlavor
จะแสดงในมุมมอง Androidโฟลเดอร์ androidTestMyFlavor
ไม่แสดงเมื่อตัวแปรอื่น
ที่เลือกไว้:
![ตัวแปร OtherFlavor ที่เลือกและโฟลเดอร์ androidTestMyFlavor ไม่ได้
แสดงในมุมมอง Android](https://developer.android.com/static/studio/images/test/test-otherflavor-android-test-android-view.png?authuser=7&hl=th)
OtherFlavor
ตัวแปร เวลา
โฟลเดอร์ androidTestMyFlavor
จะไม่แสดงในมุมมอง Androidซึ่งดูจะแตกต่างไปเล็กน้อยหากคุณใช้มุมมองโปรเจ็กต์ หลักการที่ใช้:
![ตัวแปร MyFlavor ที่เลือกและโฟลเดอร์ androidTestMyFlavor ทำงานอยู่
ในมุมมองโปรเจ็กต์](https://developer.android.com/static/studio/images/test/test-myflavor-android-test-project-view.png?authuser=7&hl=th)
MyFlavor
ตัวแปร เวลา
โฟลเดอร์ androidTestMyFlavor
มีการใช้งานอยู่ในมุมมองโครงการเมื่อเลือกตัวแปรอื่น โฟลเดอร์ androidTestMyFlavor
จะยังอยู่
แสดงแต่ไม่แสดงว่าใช้งานอยู่
![ตัวแปร OtherFlavor ที่เลือกและโฟลเดอร์ androidTestMyFlavor ไม่ได้
ทำงานอยู่ในมุมมองโปรเจ็กต์](https://developer.android.com/static/studio/images/test/test-otherflavor-android-test-project-view.png?authuser=7&hl=th)
OtherFlavor
ตัวแปร เวลา
โฟลเดอร์ androidTestMyFlavor
ไม่มีการใช้งานในมุมมองโปรเจ็กต์สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีรวมชุดแหล่งที่มา โปรดดู ชุดแหล่งที่มา
กำหนดการตั้งค่าไฟล์ Manifest สำหรับการใช้เครื่องมือ
การทดสอบที่มีเครื่องวัดจะสร้างไว้ใน APK แยกต่างหากพร้อมด้วย
AndroidManifest.xml
ไฟล์ เมื่อ Gradle สร้าง APK ทดสอบของคุณ
สร้างไฟล์ AndroidManifest.xml
และกำหนดค่าไฟล์
พร้อมด้วย
<instrumentation>
โหนด
หนึ่งในเหตุผลที่ Gradle กำหนดค่าโหนดนี้ให้คุณคือเพื่อให้แน่ใจว่า
targetPackage
ระบุชื่อแพ็กเกจที่ถูกต้องของแอปที่อยู่ระหว่างการทดสอบ
ในการเปลี่ยนการตั้งค่าอื่นๆ สำหรับโหนดนี้ ให้สร้างโหนดอื่น
Manifest ในชุดแหล่งที่มาทดสอบหรือกำหนดค่าระดับโมดูลของคุณ
build.gradle
ไฟล์ตามที่แสดงใน
ตัวอย่างโค้ดต่อไปนี้ ดูรายการตัวเลือกทั้งหมดได้ใน
BaseFlavor
การอ้างอิง API
ดึงดูด
android { ... defaultConfig { ... testApplicationId "com.example.test" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testHandleProfiling true testFunctionalTest true } }
Kotlin
android { ... defaultConfig { ... testApplicationId = "com.example.test" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" testHandleProfiling = true testFunctionalTest = true } }
Each product flavor you configure can override properties in the
defaultConfig {}
block. To learn more, go to Configure product
flavors.
The properties in the snippet are:
Setting | Description |
---|---|
testApplicationId
|
Specifies the application ID for the test APK. |
testInstrumentationRunner
|
Specifies the fully qualified class name of the test instrumentation runner. |
testHandleProfiling
|
If set to true , enables the instrumentation class
to start and stop profiling.If set to false , profiling occurs the entire time
the instrumentation class is running. |
testFunctionalTest
|
If set to true , indicates that the Android system
should run the instrumentation class as a functional
test.The default value is false . |
Change the test build type
By default, all instrumentation tests run against the debug
build type.
You can change this to another build type by using the testBuildType
property in your module-level build.gradle
file. For example, if you want
to run your tests against your staging
build type, edit the file as
shown in the following snippet:
Groovy
android { ... testBuildType "staging" }
Kotlin
android { ... testBuildType = "staging" }
กำหนดค่าตัวเลือกการทดสอบ Gradle
ปลั๊กอิน Android Gradle
ระบุตัวเลือกบางอย่างสำหรับการทดสอบทั้งหมดหรือเฉพาะบางรายการ ใน
build.gradle
ระดับโมดูล ให้ใช้
testOptions
เพื่อระบุตัวเลือกที่เปลี่ยนวิธีที่ Gradle ทำการทดสอบทั้งหมดของคุณ
ดึงดูด
android { ... // Encapsulates options for running tests. testOptions { reportDir "$rootDir/test-reports" resultsDir "$rootDir/test-results" } }
Kotlin
android { ... // Encapsulates options for running tests. testOptions { reportDir "$rootDir/test-reports" resultsDir = "$rootDir/test-results" } }
พร็อพเพอร์ตี้ reportDir
เปลี่ยนไดเรกทอรีที่ Gradle บันทึกการทดสอบ
รายงาน โดยค่าเริ่มต้น Gradle จะบันทึกรายงานการทดสอบใน
ไดเรกทอรี path_to_your_project/module_name
/build/outputs/reports/
$rootDir
กำหนดเส้นทางโดยสัมพัทธ์
ลงในไดเรกทอรีรากของโปรเจ็กต์ปัจจุบัน
พร็อพเพอร์ตี้ resultsDir
เปลี่ยนไดเรกทอรีที่ Gradle บันทึกการทดสอบ
ผลลัพธ์ โดยค่าเริ่มต้น Gradle จะบันทึกผลการทดสอบใน
ไดเรกทอรี path_to_your_project/module_name
/build/outputs/test-results/
$rootDir
กำหนดเส้นทางโดยสัมพัทธ์
ลงในไดเรกทอรีรากของโปรเจ็กต์ปัจจุบัน
หากต้องการระบุตัวเลือกเฉพาะสำหรับการทดสอบ 1 หน่วยในเครื่อง ให้กำหนดค่า
unitTests
ใน testOptions
ดึงดูด
android { ... testOptions { ... // Encapsulates options for local unit tests. unitTests { returnDefaultValues true all { jvmArgs '-XX:MaxPermSize=256m' if (it.name == 'testDebugUnitTest') { systemProperty 'debug', 'true' } ... } } } }
Kotlin
android { ... testOptions { ... // Encapsulates options for local unit tests. unitTests { returnDefaultValues = true all { jvmArgs = listOf("-XX:MaxPermSize=256m") if (it.name == "testDebugUnitTest") { systemProperty = mapOf("debug" to "true") } ... } } } }
โดยค่าเริ่มต้น การทดสอบหน่วยในเครื่องจะส่งข้อยกเว้นทุกครั้งที่โค้ด
ที่คุณกำลังทดสอบพยายามเข้าถึง API ของแพลตฟอร์ม Android เว้นแต่ว่าคุณ
จำลองทรัพยากร Dependency ของ Android
ตัวคุณเองหรือด้วยกรอบการทดสอบ เช่น
Mockito แต่คุณสามารถเปิดใช้พร็อพเพอร์ตี้ returnDefaultValues
เพื่อให้
การทดสอบจะแสดงผลค่า Null หรือ 0 เมื่อเข้าถึง API ของแพลตฟอร์ม
มากกว่าการแสดงข้อผิดพลาด
บล็อก all
สรุปตัวเลือกเพื่อควบคุมวิธีการทํางานของ Gradle
การทดสอบหน่วยในเครื่อง สำหรับรายการตัวเลือกทั้งหมดที่คุณระบุ โปรดอ่าน
เอกสารอ้างอิงของ Gradle
พร็อพเพอร์ตี้ jvmArgs
ตั้งค่าอาร์กิวเมนต์ JVM สำหรับ JVM ทดสอบ
หรือตรวจสอบชื่องานเพื่อใช้ตัวเลือกเฉพาะกับการทดสอบที่คุณ
ระบุ ในตัวอย่างข้อมูลโค้ด พร็อพเพอร์ตี้ debug
ตั้งค่าเป็น true
แต่
สำหรับงาน testDebugUnitTest
เท่านั้น
ใช้โมดูลทดสอบแยกต่างหากสำหรับการทดสอบแบบมีเครื่องวัด
หากต้องการโมดูลเฉพาะสำหรับการทดสอบแบบมีเครื่อง ให้แยกส่วน โค้ดที่เหลือจากการทดสอบของคุณ ให้สร้างโมดูลการทดสอบแยกต่างหากและ กำหนดค่าบิลด์ที่คล้ายกับของโมดูลไลบรารี
หากต้องการสร้างโมดูลทดสอบ ให้ทำตามขั้นตอนต่อไปนี้
- สร้างโมดูลคลัง
- ในไฟล์
build.gradle
ระดับโมดูล ให้ใช้com.android.test
แทนcom.android.library
- คลิกซิงค์โปรเจ็กต์
หลังจากสร้างโมดูลทดสอบแล้ว คุณสามารถใส่โค้ดทดสอบไว้ใน
ชุดแหล่งที่มาของรูปแบบหลักหรือตัวแปร (เช่น src/main/java
หรือ
src/variant/java
) หากโมดูลแอปกำหนด
เวอร์ชันผลิตภัณฑ์ที่หลากหลาย คุณสามารถสร้างรสชาติเหล่านั้นใหม่ได้ในโมดูลทดสอบ
การใช้ทรัพยากร Dependency ที่คำนึงถึงตัวแปร
การจัดการ
โมดูลทดสอบจะพยายามทดสอบรสชาติที่ตรงกันในโมดูลเป้าหมาย
โดยค่าเริ่มต้น โมดูลทดสอบจะมีและทดสอบเฉพาะตัวแปรการแก้ไขข้อบกพร่องเท่านั้น อย่างไรก็ตาม
คุณจะสร้างประเภทบิลด์ใหม่ให้ตรงกับโปรเจ็กต์แอปที่ทดสอบได้ หากต้องการทำให้
โมดูลทดสอบ ทดสอบบิลด์ประเภทอื่น ไม่ใช่ประเภทการแก้ไขข้อบกพร่อง ให้ใช้
VariantFilter
เพื่อปิดใช้ตัวแปรการแก้ไขข้อบกพร่องในโปรเจ็กต์ทดสอบ ดังนี้
ดึงดูด
android { variantFilter { variant -> if (variant.buildType.name.equals('debug')) { variant.setIgnore(true); } } }
Kotlin
android { variantFilter { if (buildType.name == "debug") { ignore = true } } }
หากต้องการกำหนดเป้าหมายเฉพาะเวอร์ชันหรือเวอร์ชันบิลด์ของ
คุณสามารถใช้ matchingFallbacks
เพื่อกำหนดเป้าหมายเฉพาะตัวแปรที่คุณต้องการทดสอบ วิธีนี้ยังป้องกันไม่ให้
ไม่ให้ต้องกำหนดค่าตัวแปรเหล่านั้นด้วยตัวเอง