กลยุทธ์ Robolectric

Robolectric เป็นเฟรมเวิร์กโอเพนซอร์สที่ Google ดูแลรักษา ซึ่งช่วยให้คุณทำการทดสอบในสภาพแวดล้อม Android ที่จำลองภายใน JVM ได้โดยไม่ต้องเสียเวลาและไม่ต้องกังวลกับข้อบกพร่องของเอีมูเลเตอร์ โดยรองรับ Android ทุกเวอร์ชันตั้งแต่ Lollipop (API ระดับ 21) ขึ้นไป

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

Robolectric ไม่ได้เป็นตัวทดแทนโปรแกรมจำลองอย่างสมบูรณ์เนื่องจากไม่รองรับฟีเจอร์และ API บางรายการ เช่น Robolectric ไม่มีหน้าจอเหมือนโปรแกรมจำลอง และรองรับ API บางรายการเพียงบางส่วน อย่างไรก็ตาม โปรแกรมจำลองจะจําลองส่วนต่างๆ ของ Android ได้มากพอที่จะทําการทดสอบหน่วยและการทดสอบ UI ส่วนใหญ่ได้อย่างน่าเชื่อถือ

กลยุทธ์การทดสอบ

กลยุทธ์การทดสอบที่คุณใช้ Robolectric ได้มีอยู่ 2 ประเภท ได้แก่ การทดสอบหน่วยและการทดสอบ UI

การทดสอบ 1 หน่วย

Robolectric สร้างขึ้นเพื่อเปิดใช้ "การทดสอบหน่วย" ในแอป Android เช่น คุณอาจจำลองการเปิดใช้งานกิจกรรมและทดสอบตรรกะภายในกิจกรรมนั้น โดยเรียกใช้เมธอดวงจรชีวิตของกิจกรรมทั้งหมด

นอกจากนี้ คุณยังใช้การจำลองของ Robolectric (เรียกว่า "เงา") เป็นทรัพยากรที่ต้องพึ่งพาสําหรับการทดสอบหน่วยได้ด้วย เช่น หากชั้นเรียนใช้ Bundle หรือคุณต้องจำลองการเชื่อมต่อบลูทูธ

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

การทดสอบ UI

Robolectric ยังเรียกใช้การทดสอบ UI เช่น การทดสอบ Espresso หรือ Compose ได้ด้วย คุณสามารถแปลงการทดสอบที่มีการวัดคุมเป็น Robolectric ได้โดยย้ายการทดสอบไปยังtestชุดแหล่งที่มา แล้วตั้งค่าการพึ่งพา Robolectric

android {
  testOptions {
    unitTests {
      isIncludeAndroidResources = true
    }
  }
}

dependencies {
  testImplementation("junit:junit:4.13.2")
  testImplementation("org.robolectric:robolectric:4.13")
}

การทดสอบ UI ที่อยู่ในชุดแหล่งที่มา test จะทํางานด้วย Robolectric

import androidx.test.espresso.Espresso.onView

@RunWith(AndroidJUnit4::class)
class AddContactActivityTest {
    @Test
    fun inputTextShouldBeRetainedAfterActivityRecreation() {
        // GIVEN
        val contactName = "Test User"
        val scenario = ActivityScenario.launchActivity<AddContactActivity>()

        // WHEN
        // Enter contact name
        onView(withId(R.id.contact_name_text))
            .perform(typeText(contactName))
        // Destroy and recreate Activity
        scenario.recreate()

        // THEN
        // Check contact name was preserved.
        onView(withId(R.id.contact_name_text))
            .check(matches(withText(contactName)))
     }
}

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

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

คุณต้องตัดสินใจว่าการใช้งาน Robolectric นั้นดีพอสำหรับกรณีการใช้งานแต่ละรายการหรือไม่ แต่คำแนะนำบางส่วนมีดังนี้

  • ใช้ Robolectric สำหรับการทดสอบลักษณะการทํางานของ UI แบบแยกส่วนสําหรับการทดสอบคอมโพเนนต์ ฟีเจอร์ หรือแอปพลิเคชัน โดยทั่วไป การทดสอบเหล่านี้จะตรวจสอบการจัดการสถานะและลักษณะการทํางานของ UI และไม่โต้ตอบกับทรัพยากรภายนอก
  • ใช้ Robolectric เพื่อจับภาพหน้าจอเมื่อความแม่นยำของพิกเซลไม่สำคัญ เช่น เพื่อทดสอบว่าคอมโพเนนต์ตอบสนองต่อขนาดแบบอักษรหรือธีมต่างๆ อย่างไร

หมายเหตุ: Robolectric สามารถจับภาพหน้าจอได้โดยตรง แต่คุณต้องใช้ไลบรารีของบุคคลที่สามเพื่อทำการทดสอบภาพหน้าจอด้วย

Robolectric กับการทดสอบอุปกรณ์

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