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