Chiến lược Robolectric

Robolectric là một khung nguồn mở do Google duy trì, cho phép bạn chạy kiểm thử trong môi trường Android được mô phỏng bên trong một máy ảo, mà không bị hao tổn và không ổn định như khi dùng trình mô phỏng. API này hỗ trợ tất cả phiên bản Android kể từ Lollipop (API cấp 21).

Nhiều dự án lớn sử dụng Robolectric để tăng tốc độ và độ tin cậy của các chương trình kiểm thử, đồng thời giảm chi phí liên quan đến việc chạy kiểm thử trên thiết bị thực hoặc trình mô phỏng. Điều này bao gồm hầu hết các ứng dụng của Google phụ thuộc nhiều vào Robolectric.

Robolectric không phải là một trình mô phỏng thay thế hoàn toàn vì không hỗ trợ tất cả các tính năng và API. Ví dụ: Robolectric không có màn hình như trình mô phỏng và một số API chỉ được hỗ trợ một phần. Tuy nhiên, trình mô phỏng này mô phỏng đủ các phần của Android để chạy các bài kiểm thử đơn vị và hầu hết các bài kiểm thử giao diện người dùng một cách đáng tin cậy.

Chiến lược kiểm thử

Bạn có thể sử dụng Robolectric để theo đuổi hai loại chiến lược kiểm thử: kiểm thử đơn vị và kiểm thử giao diện người dùng.

Kiểm thử đơn vị

Robolectric được tạo ra để hỗ trợ "kiểm thử đơn vị" trong các ứng dụng Android. Ví dụ: bạn có thể mô phỏng việc khởi chạy một Hoạt động và kiểm thử logic bên trong hoạt động đó, gọi tất cả các phương thức vòng đời.

Bạn cũng có thể sử dụng các bản sao của Robolectric (được gọi là bóng) làm phần phụ thuộc cho các bài kiểm thử đơn vị. Ví dụ: nếu lớp của bạn sử dụng một Gói hoặc bạn cần giả mạo kết nối Bluetooth.

Nhìn chung, nếu triển khai một cấu trúc có thể kiểm thử, bạn không cần phải sử dụng Robolectric để kiểm thử đơn vị vì mã của bạn phải có thể kiểm thử riêng biệt, không có phần phụ thuộc nào trên khung Android.

Kiểm thử giao diện người dùng

Robolectric cũng có thể chạy kiểm thử giao diện người dùng như kiểm thử Espresso hoặc Compose. Bạn có thể chuyển đổi kiểm thử đo lường sang Robolectric bằng cách di chuyển kiểm thử đó vào nhóm tài nguyên test và thiết lập các phần phụ thuộc Robolectric.

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

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

Mọi bài kiểm thử giao diện người dùng có trong nhóm tài nguyên test đều chạy bằng 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)))
     }
}

Hầu hết các chương trình kiểm thử giao diện người dùng không tương tác với khung và bạn có thể chạy các chương trình kiểm thử đó trên Robolectric. Bạn có thể chạy các chương trình kiểm thử hành vi trên Robolectric vì độ chân thực cần thiết cho việc này là quá đủ. Ví dụ: khi quy trình kiểm thử Compose xác minh rằng giao diện người dùng đã thay đổi sau khi nhấp vào một nút.

Bạn có thể chạy các kiểm thử giao diện người dùng khác bằng Robolectric, chẳng hạn như kiểm thử ảnh chụp màn hình. Tuy nhiên, độ trung thực sẽ thấp hơn vì các thiết bị hiển thị màn hình theo cách hơi khác nhau.

Bạn phải quyết định xem việc triển khai Robolectric có đủ tốt cho từng trường hợp sử dụng hay không, nhưng sau đây là một số đề xuất:

  • Sử dụng Robolectric để kiểm thử hành vi giao diện người dùng riêng biệt cho các thành phần, tính năng hoặc kiểm thử ứng dụng. Nhìn chung, các kiểm thử này kiểm tra hoạt động quản lý trạng thái và hành vi của giao diện người dùng, đồng thời không tương tác với các phần phụ thuộc bên ngoài.
  • Sử dụng Robolectric để chụp ảnh màn hình khi độ chính xác của pixel không quan trọng. Ví dụ: để kiểm thử cách một thành phần phản ứng với các kích thước phông chữ hoặc giao diện khác nhau.

Lưu ý: Robolectric có thể chụp ảnh màn hình theo cách gốc, nhưng bạn cần có thư viện bên thứ ba để kiểm thử ảnh chụp màn hình bằng thư viện đó.

Robolectric so với kiểm thử thiết bị

Tóm lại, Robolectric cung cấp đủ độ trung thực để chạy hầu hết các kiểm thử giao diện người dùng, nhưng một số trường hợp vẫn sẽ yêu cầu kiểm thử thiết bị, chẳng hạn như các trường hợp liên quan đến giao diện người dùng hệ thống như tràn viền hoặc hình trong hình, hoặc khi dựa vào các tính năng không được hỗ trợ, chẳng hạn như WebView.