กลยุทธ์ 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 (เรียกว่าเงา) เป็นทรัพยากร Dependency ของการทดสอบ 1 หน่วยได้ด้วย เช่น หากชั้นเรียนใช้ 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 ได้เนื่องจากความแม่นยำที่จำเป็นนั้นเกินพอแล้ว เช่น เมื่อการทดสอบการเขียนโค้ดยืนยันว่า UI มีการเปลี่ยนแปลงหลังจากคลิกปุ่ม

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

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

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

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

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

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