Kiểm thử hoạt động của ứng dụng

Hoạt động đóng vai trò là vùng chứa cho mọi tương tác của người dùng trong ứng dụng. Vì vậy, bạn cần kiểm thử cách hoạt động của ứng dụng hoạt động trong các sự kiện cấp thiết bị, chẳng hạn như sau:

  • Một ứng dụng khác (chẳng hạn như ứng dụng điện thoại trên thiết bị) làm gián đoạn hoạt động của ứng dụng đó.
  • Hệ thống sẽ huỷ rồi tạo lại hoạt động của bạn.
  • Người dùng đặt hoạt động của bạn trong một môi trường cửa sổ mới, chẳng hạn như hình trong hình (PIP) hoặc nhiều cửa sổ.

Cụ thể, điều quan trọng là phải đảm bảo hoạt động của bạn hoạt động chính xác để phản hồi các sự kiện được mô tả trong Vòng đời hoạt động.

Hướng dẫn này mô tả cách đánh giá khả năng duy trì tính toàn vẹn của dữ liệu và trải nghiệm người dùng tốt khi hoạt động của ứng dụng chuyển đổi qua nhiều trạng thái trong vòng đời của ứng dụng.

Điều khiển trạng thái của hoạt động

Một khía cạnh chính trong quá trình kiểm thử hoạt động của ứng dụng là việc đặt hoạt động của ứng dụng ở các trạng thái cụ thể. Để xác định phần "cho" này trong các kiểm thử của bạn, hãy sử dụng các bản sao của ActivityScenario, một phần của thư viện Kiểm thử AndroidX. Khi sử dụng lớp này, bạn có thể đặt hoạt động ở các trạng thái mô phỏng các sự kiện ở cấp thiết bị.

ActivityScenario là một API nhiều nền tảng mà bạn có thể sử dụng trong kiểm thử đơn vị cục bộ cũng như kiểm thử tích hợp trên thiết bị. Trên thiết bị thực hoặc ảo, ActivityScenario mang lại sự an toàn cho luồng, đồng bộ hoá các sự kiện giữa luồng đo lường của kiểm thử và luồng chạy hoạt động đang được kiểm thử.

API này đặc biệt phù hợp để đánh giá cách một hoạt động đang kiểm thử hoạt động khi hoạt động đó bị huỷ hoặc được tạo. Phần này trình bày các trường hợp sử dụng phổ biến nhất liên kết với API này.

Tạo hoạt động

Để tạo hoạt động đang được kiểm thử, hãy thêm mã được hiển thị trong đoạn mã sau:

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @Test fun testEvent() {
       launchActivity<MyActivity>().use {
       }
    }
}

Sau khi tạo hoạt động, ActivityScenario sẽ chuyển hoạt động sang trạng thái RESUMED. Trạng thái này cho biết hoạt động của bạn đang chạy và người dùng có thể nhìn thấy hoạt động của bạn. Ở trạng thái này, bạn có thể thoải mái tương tác với các phần tử View của hoạt động bằng cách sử dụng tính năng kiểm thử giao diện người dùng Espresso.

Bạn nên gọi close cho hoạt động khi quá trình kiểm thử hoàn tất. Việc này sẽ xoá các tài nguyên liên quan và cải thiện độ ổn định cho chương trình kiểm thử của bạn. ActivityScenario triển khai Closeable, vì vậy, bạn có thể áp dụng tiện ích use hoặc try-with-resources bằng ngôn ngữ lập trình Java để hoạt động tự động đóng.

Ngoài ra, bạn có thể sử dụng ActivityScenarioRule để tự động gọi ActivityScenario.launch trước mỗi lần kiểm thử và ActivityScenario.close khi phân tích quá trình kiểm thử. Ví dụ sau đây cho thấy cách xác định một quy tắc và nhận một bản sao của tình huống từ quy tắc đó:

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @get:Rule var activityScenarioRule = activityScenarioRule<MyActivity>()

    @Test fun testEvent() {
        val scenario = activityScenarioRule.scenario
    }
}

Chuyển hoạt động sang trạng thái mới

Để chuyển hoạt động sang một trạng thái khác, chẳng hạn như CREATED hoặc STARTED, hãy gọi moveToState(). Thao tác này mô phỏng một tình huống tương ứng khi hoạt động của bạn bị dừng hoặc tạm dừng do bị một ứng dụng khác hoặc một thao tác của hệ thống làm gián đoạn.

Ví dụ về cách sử dụng moveToState() xuất hiện trong đoạn mã sau:

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @Test fun testEvent() {
        launchActivity<MyActivity>().use { scenario ->
            scenario.moveToState(State.CREATED)
        }
    }
}

Xác định trạng thái hoạt động hiện tại

Để xác định trạng thái hiện tại của một hoạt động đang được kiểm thử, hãy lấy giá trị của trường state trong đối tượng ActivityScenario. Bạn nên đặc biệt hữu ích khi kiểm tra trạng thái của một hoạt động đang được kiểm thử xem liệu hoạt động đó có chuyển hướng đến một hoạt động khác hay tự kết thúc, như được minh hoạ trong đoạn mã sau đây:

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @Test fun testEvent() {
        launchActivity<MyActivity>().use { scenario ->
            scenario.onActivity { activity ->
              startActivity(Intent(activity, MyOtherActivity::class.java))
            }

            val originalActivityState = scenario.state
        }
    }
}

Tạo lại hoạt động

Khi thiết bị sắp hết tài nguyên, hệ thống có thể huỷ bỏ một hoạt động, yêu cầu ứng dụng tạo lại hoạt động đó khi người dùng quay lại ứng dụng. Để mô phỏng những điều kiện này, hãy gọi recreate():

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @Test fun testEvent() {
        launchActivity<MyActivity>().use { scenario ->
            scenario.recreate()
        }
    }
}

Lớp ActivityScenario duy trì trạng thái thực thể đã lưu của hoạt động và mọi đối tượng được chú giải bằng @NonConfigurationInstance. Các đối tượng này tải vào thực thể mới của hoạt động đang được kiểm thử.

Truy xuất kết quả hoạt động

Để lấy mã kết quả hoặc dữ liệu liên kết với một hoạt động đã hoàn thành, hãy lấy giá trị của trường result trong đối tượng ActivityScenario, như minh hoạ trong đoạn mã sau đây:

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @Test fun testResult() {
        launchActivity<MyActivity>().use {
            onView(withId(R.id.finish_button)).perform(click())

            // Activity under test is now finished.

            val resultCode = scenario.result.resultCode
            val resultData = scenario.result.resultData
        }
    }
}

Kích hoạt thao tác trong hoạt động

Tất cả các phương thức trong ActivityScenario đều đang chặn lệnh gọi, vì vậy, API yêu cầu bạn chạy các phương thức đó trong luồng đo lường.

Để kích hoạt các thao tác trong hoạt động đang được kiểm thử, hãy sử dụng trình so khớp khung hiển thị Espresso để tương tác với các phần tử trong khung hiển thị của bạn:

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @Test fun testEvent() {
        launchActivity<MyActivity>().use {
            onView(withId(R.id.refresh)).perform(click())
        }
    }
}

Tuy nhiên, nếu cần gọi một phương thức trên chính hoạt động đó, bạn có thể thực hiện việc này một cách an toàn bằng cách triển khai ActivityAction:

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @Test fun testEvent() {
        launchActivity<MyActivity>().use { scenario ->
            scenario.onActivity { activity ->
              activity.handleSwipeToRefresh()
            }
        }
    }
}