การตั้งค่าการทดสอบขั้นสูง

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

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

หน้านี้อธิบายวิธีต่างๆ ในการกำหนดค่าการทดสอบเมื่อการตั้งค่าเริ่มต้นไม่ตรงกับความต้องการของคุณ

สร้างการทดสอบการใช้เครื่องมือสำหรับตัวแปรบิลด์

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

หากต้องการลิงก์การทดสอบการวัดคุมกับตัวแปรบิลด์ ให้วางการทดสอบเหล่านั้นไว้ในชุดซอร์สของตัวเองที่อยู่ที่ src/androidTestVariantName

การทดสอบการใช้เครื่องมือในชุดซอร์ส src/androidTest/ จะแชร์โดยบิลด์ตัวแปรทั้งหมด เมื่อสร้าง APK ทดสอบสำหรับตัวแปร "MyFlavor" ของแอป Gradle จะรวมชุดซอร์ส src/androidTest/ และ src/androidTestMyFlavor/

หากต้องการเพิ่มชุดซอร์สการทดสอบสำหรับตัวแปรบิลด์ใน Android Studio ให้ทำตามขั้นตอนต่อไปนี้

  1. ในหน้าต่างโปรเจ็กต์ ให้คลิกเมนู แล้วเลือกมุมมองโปรเจ็กต์
  2. ในโฟลเดอร์โมดูลที่เหมาะสม ให้คลิกขวาที่โฟลเดอร์ src แล้วคลิกใหม่ > ไดเรกทอรี
  3. ป้อน "androidTestVariantName." เป็นชื่อไดเรกทอรี เช่น หากคุณมีตัวแปรบิลด์ชื่อ "MyFlavor" ให้ใช้ชื่อไดเรกทอรี androidTestMyFlavor
  4. คลิกตกลง
  5. คลิกขวาที่ไดเรกทอรีใหม่ แล้วเลือกใหม่ > ไดเรกทอรี
  6. ป้อน "java" เป็นชื่อไดเรกทอรี แล้วคลิกตกลง

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

ตารางต่อไปนี้แสดงตัวอย่างวิธีที่ไฟล์การทดสอบการวัดคุมอาจอยู่ในชุดซอร์สที่สอดคล้องกับชุดซอร์สโค้ดของแอป

ตารางที่ 1 ซอร์สโค้ดของแอปและไฟล์การทดสอบการวัดคุมที่เกี่ยวข้อง

เส้นทางไปยังคลาสของแอป เส้นทางไปยังคลาสการทดสอบการใช้เครื่องมือที่ตรงกัน
src/main/kotlin+java/Example.kt src/androidTest/java/AndroidExampleTest.kt
src/myFlavor/kotlin+java/Example.kt src/androidTestMyFlavor/java/AndroidExampleTest.kt

การสร้าง Gradle จะผสานและลบล้างไฟล์จากชุดซอร์สการทดสอบต่างๆ เช่นเดียวกับที่ทำกับชุดซอร์สของแอป ในกรณีนี้ ไฟล์ AndroidExampleTest.kt ในชุดซอร์ส androidTestMyFlavor จะลบล้าง เวอร์ชันในชุดซอร์ส androidTest เนื่องจากชุดซอร์สของเวอร์ชันผลิตภัณฑ์มีลำดับความสำคัญสูงกว่าชุดซอร์สหลัก

เมื่อคุณเลือก Flavor ต่างๆ ในตัวเลือกบิลด์ตัวแปร โฟลเดอร์ androidTest ที่เหมาะสมจะแสดงในมุมมองAndroid เพื่อแสดงโฟลเดอร์ที่ใช้

เลือกตัวแปร MyFlavor และโฟลเดอร์ androidTestMyFlavor จะแสดง
        ในมุมมอง Android
รูปที่ 1 เลือกตัวแปร MyFlavor แล้ว โฟลเดอร์ androidTestMyFlavor จะแสดงในมุมมองAndroid

ระบบจะไม่แสดงโฟลเดอร์ androidTestMyFlavor เมื่อเลือกตัวแปรอื่น

เลือกตัวแปร OtherFlavor และโฟลเดอร์ androidTestMyFlavor ไม่แสดงในมุมมอง Android
รูปที่ 2 เลือกตัวแปร OtherFlavor แล้ว โฟลเดอร์ androidTestMyFlavor จะไม่แสดงในมุมมองAndroid

มุมมองจะแตกต่างออกไปเล็กน้อยหากคุณใช้มุมมองโปรเจ็กต์ แต่หลักการเดียวกันนี้จะยังคงใช้ได้

เลือกตัวแปร MyFlavor และโฟลเดอร์ androidTestMyFlavor จะใช้งานได้
        ในมุมมองโปรเจ็กต์
รูปที่ 3 เลือกตัวแ0/}ปร androidTestMyFlavor แล้ว โฟลเดอร์ จะใช้งานอยู่ในมุมมองโปรเจ็กต์
MyFlavor

เมื่อเลือกตัวแปรอื่น โฟลเดอร์ androidTestMyFlavor จะยังคงแสดงอยู่ แต่จะไม่แสดงเป็นโฟลเดอร์ที่ใช้งานอยู่

เลือกตัวแปร OtherFlavor และโฟลเดอร์ androidTestMyFlavor ไม่ได้
            เปิดใช้งานในมุมมองโปรเจ็กต์
รูปที่ 4 เลือกตัวแปร OtherFlavor แล้ว โฟลเดอร์ androidTestMyFlavor จะไม่ใช้งานอยู่ในมุมมองโปรเจ็กต์

ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีผสานชุดซอร์สได้ที่ ชุดซอร์ส

กำหนดค่าการตั้งค่า Manifest ของการใช้เครื่องมือ

การทดสอบการใช้เครื่องมือจะสร้างขึ้นใน APK แยกต่างหากที่มีไฟล์ AndroidManifest.xml ของตัวเอง เมื่อ Gradle สร้าง APK ทดสอบ ระบบจะ สร้างไฟล์ AndroidManifest.xml โดยอัตโนมัติและกำหนดค่า ด้วย <instrumentation> โหนด เหตุผลหนึ่งที่ Gradle กำหนดค่าโหนดนี้ให้คุณก็คือเพื่อให้แน่ใจว่า targetPackage พร็อพเพอร์ตี้ระบุชื่อแพ็กเกจที่ถูกต้องของแอปที่อยู่ระหว่างการทดสอบ

หากต้องการเปลี่ยนการตั้งค่าอื่นๆ สำหรับโหนดนี้ ให้สร้างไฟล์ Manifest อีกไฟล์ในชุดซอร์สการทดสอบ หรือกำหนดค่าไฟล์ build.gradle ระดับโมดูล ดังที่แสดงในตัวอย่างโค้ดต่อไปนี้ คุณดูรายการตัวเลือกทั้งหมดได้ใน BaseFlavor เอกสารอ้างอิง API

Kotlin

android {
    ...
    defaultConfig {
        ...
        testApplicationId = "com.example.test"
        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
        testHandleProfiling = true
        testFunctionalTest = true
    }
}

ดึงดูด

android {
    ...
    defaultConfig {
        ...
        testApplicationId "com.example.test"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        testHandleProfiling true
        testFunctionalTest true
    }
}

เวอร์ชันผลิตภัณฑ์แต่ละรายการที่คุณกำหนดค่าสามารถลบล้างพร็อพเพอร์ตี้ในบล็อก defaultConfig {} ได้ ดูข้อมูลเพิ่มเติมได้ที่ กำหนดค่า Product Flavor

พร็อพเพอร์ตี้ในข้อมูลโค้ดมีดังนี้

การตั้งค่า คำอธิบาย
testApplicationId ระบุรหัสแอปพลิเคชันสำหรับ APK ทดสอบ
testInstrumentationRunner ระบุชื่อคลาสที่สมบูรณ์ในตัวเองของตัวเรียกใช้การทดสอบการใช้เครื่องมือ
testHandleProfiling หากตั้งค่าเป็น true จะเปิดใช้คลาสการใช้เครื่องมือเพื่อเริ่มและหยุดการสร้างโปรไฟล์
หากตั้งค่าเป็น false การสร้างโปรไฟล์จะเกิดขึ้นตลอดเวลาที่คลาสการใช้เครื่องมือทำงาน
testFunctionalTest หากตั้งค่าเป็น true จะระบุว่าระบบ Android ควรเรียกใช้คลาสการใช้เครื่องมือเป็นการทดสอบฟังก์ชัน การทดสอบ
ค่าเริ่มต้นคือ false

เปลี่ยนประเภทบิลด์ทดสอบ

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

Kotlin

android {
    ...
    testBuildType = "staging"
}

ดึงดูด

android {
    ...
    testBuildType "staging"
}

กำหนดค่าตัวเลือกการทดสอบ Gradle

ปลั๊กอิน Android Gradle ช่วยให้คุณ ระบุตัวเลือกบางอย่างสำหรับการทดสอบทั้งหมดหรือบางส่วนได้ ในไฟล์ระดับโมดูล ให้ใช้บล็อกเพื่อระบุตัวเลือกที่จะเปลี่ยนวิธีที่ Gradle เรียกใช้การทดสอบทั้งหมดbuild.gradletestOptions

Kotlin

android {
    ...
    // Encapsulates options for running tests.
    testOptions {
        reportDir = "$rootDir/test-reports"
        resultsDir = "$rootDir/test-results"
    }
}

ดึงดูด

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

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")
                }
                ...
            }
        }
    }
}

ดึงดูด

android {
    ...
    testOptions {
        ...
        // Encapsulates options for local unit tests.
        unitTests {
            returnDefaultValues true

            all {
                jvmArgs '-XX:MaxPermSize=256m'

                if (it.name == 'testDebugUnitTest') {
                    systemProperty 'debug', 'true'
                }
                ...
            }
        }
    }
}

โดยค่าเริ่มต้น การทดสอบ 1 หน่วยในเครื่องจะแสดงข้อยกเว้นทุกครั้งที่โค้ด ที่คุณทดสอบพยายามเข้าถึง Android Platform API เว้นแต่คุณจะ จำลองทรัพยากร Dependency ของ Android ด้วยตนเองหรือใช้เฟรมเวิร์กการทดสอบ เช่น Mockito อย่างไรก็ตาม คุณสามารถเปิดใช้พร็อพเพอร์ตี้ returnDefaultValues เพื่อให้การทดสอบแสดงผลเป็น null หรือ 0 เมื่อเข้าถึง Platform API แทนที่จะแสดงข้อยกเว้น

บล็อก all จะห่อหุ้มตัวเลือกสำหรับการควบคุมวิธีที่ Gradle เรียกใช้การทดสอบ 1 หน่วยในเครื่อง โปรดอ่าน เอกสารอ้างอิงของ Gradle เพื่อดูรายการตัวเลือกทั้งหมดที่คุณระบุได้

พร็อพเพอร์ตี้ jvmArgs จะตั้งค่าอาร์กิวเมนต์ JVM สำหรับ JVM ของการทดสอบ

นอกจากนี้ คุณยังตรวจสอบชื่อ Task เพื่อใช้ตัวเลือกกับการทดสอบที่คุณระบุเท่านั้นได้ด้วย ในข้อมูลโค้ดตัวอย่าง พร็อพเพอร์ตี้ debug จะตั้งค่าเป็น true แต่ใช้ได้กับ Task testDebugUnitTest เท่านั้น

ใช้โมดูลการทดสอบแยกต่างหากสำหรับการทดสอบการใช้เครื่องมือ

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

หากต้องการสร้างโมดูลการทดสอบ ให้ทำดังนี้

  1. สร้างโมดูลไลบรารี
  2. ในไฟล์ build.gradle ระดับโมดูล ให้ใช้ปลั๊กอิน com.android.test แทน com.android.library
  3. คลิกซิงค์โปรเจ็กต์

หลังจากสร้างโมดูลการทดสอบแล้ว คุณสามารถรวมโค้ดทดสอบไว้ใน ชุดซอร์สหลักหรือชุดซอร์สตัวแปร (เช่น src/main/kotlin+java หรือ src/variant/kotlin+java) หากโมดูลแอป กำหนด Product Flavor หลายรายการ คุณสามารถสร้าง Flavor เหล่านั้นใหม่ในโมดูลการทดสอบ ได้ โมดูลการทดสอบจะพยายามทดสอบ Flavor ที่ตรงกันในโมดูลเป้าหมายโดยใช้การจัดการทรัพยากร Dependency ที่คำนึงถึงตัวแปร

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

Kotlin

android {
    variantFilter {
        if (buildType.name == "debug") {
            ignore = true
        }
    }
}

ดึงดูด

android {
    variantFilter { variant ->
        if (variant.buildType.name.equals('debug')) {
            variant.setIgnore(true);
        }
    }
}

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