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