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

ทดสอบใน 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/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
รูปที่ 1 เลือก MyFlavor ตัวแปร เวลา โฟลเดอร์ androidTestMyFlavor จะแสดงในมุมมอง Android

โฟลเดอร์ androidTestMyFlavor ไม่แสดงเมื่อตัวแปรอื่น ที่เลือกไว้:

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

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

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

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

วันที่ ตัวแปร OtherFlavor ที่เลือกและโฟลเดอร์ androidTestMyFlavor ไม่ได้
            ทำงานอยู่ในมุมมองโปรเจ็กต์
รูปที่ 4 เลือก 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 เท่านั้น

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

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

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

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

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