Hoạt động đóng vai trò là vùng chứa cho mọi lượt tương tác của người dùng trong ứng dụng của bạn. Vì vậy, bạn cần kiểm thử cách hoạt động của ứng dụng trong các sự kiện ở cấp thiết bị, chẳng hạn như:
- Một ứng dụng khác (chẳng hạn như ứng dụng điện thoại của thiết bị) làm gián đoạn hoạt động của ứng dụng.
- Hệ thống huỷ và tạo lại hoạt động của bạn.
- Người dùng đặt hoạt động của bạn vào một môi trường cửa sổ mới, chẳng hạn như chế độ hình trong hình (PIP) hoặc chế độ nhiều cửa sổ.
Cụ thể, bạn cần đảm bảo rằng 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 của ứng dụng khi các hoạt động của ứng dụng chuyển đổi qua nhiều trạng thái trong vòng đời của chúng.
Kiểm thử hoạt động trong Compose
Khi kiểm thử một ứng dụng được xây dựng bằng Jetpack Compose, bạn thường sử dụng
createAndroidComposeRule để chạy hoạt động và tương tác với các thành phần giao diện người dùng.
Tuy nhiên, việc kiểm thử các sự kiện ở cấp thiết bị, chẳng hạn như thay đổi cấu hình hoặc hoạt động được đưa vào nền hoặc bị hệ thống huỷ, đòi hỏi bạn phải trực tiếp thao tác với vòng đời của hoạt động. Để làm việc này, bạn sẽ sử dụng
khung ActivityScenario cơ bản.
Quy tắc kiểm thử Compose sẽ tự động gói và quản lý tình huống này cho bạn. Trong suốt hướng dẫn này, bạn sẽ thấy mẫu sau đây được dùng để thu hẹp khoảng cách giữa hoạt động kiểm thử giao diện người dùng hiện đại và hoạt động quản lý vòng đời tiêu chuẩn:
@get:Rule
val composeTestRule = createAndroidComposeRule<MyActivity>()
@Test fun testEvent() {
val scenario = composeTestRule.activityRule.scenario
// ...
}
Điều khiển trạng thái của hoạt động
Một khía cạnh quan trọng của việc kiểm thử các hoạt động của ứng dụng là đặt các hoạt động của ứng dụng vào các trạng thái cụ thể. Để xác định phần "đã cho" này của hoạt động kiểm thử, hãy sử dụng
các thực thể 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ủa mình ở các trạng thái mô phỏng các sự kiện ở cấp thiết bị.
ActivityScenario là một API đa nền tảng mà bạn có thể sử dụng trong các hoạt động kiểm thử đơn vị cục bộ và hoạt động kiểm thử tích hợp trên thiết bị. Trên thiết bị thực hoặc thiết bị ảo, ActivityScenario cung cấp tính an toàn cho luồng, đồng bộ hoá các sự kiện giữa luồng đo lường của hoạt động 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 hoạt động đang được kiểm thử hoạt động khi bị huỷ hoặ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 quan đến API này.
Tạo một hoạt động
Để tạo hoạt động đang được kiểm thử, hãy thêm mã có 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à hiển thị với người dùng. Ở trạng thái này, bạn có thể thoải mái tương tác với các thành phần kết hợp của hoạt động
bằng cách sử dụng API kiểm thử Compose.
Google khuyên bạn nên gọi close trên hoạt động khi quá trình kiểm thử hoàn tất.
Thao tác này sẽ dọn dẹp các tài nguyên được liên kết và cải thiện độ ổn định của hoạt động kiểm thử. ActivityScenario triển khai Closeable, vì vậy, bạn có thể áp dụng tiện ích use để hoạt động tự động đóng.
Ngoài ra, bạn có thể sử dụng createAndroidComposeRule để tự động
chạy hoạt động trước mỗi hoạt động kiểm thử, xử lý quá trình dọn dẹp và cấp cho bạn quyền truy cập vào
cả phương thức kiểm thử giao diện người dùng Compose và ActivityScenario cơ bản. Ví dụ sau đây cho biết cách xác định một quy tắc và lấy một thực thể của tình huống từ quy tắc đó:
@RunWith(AndroidJUnit4::class)
class MyTestSuite {
@get:Rule
val composeTestRule = createAndroidComposeRule<MyActivity>()
@Test fun testEvent() {
val scenario = composeTestRule.activityRule.scenario
}
}
Chuyển hoạt động sang trạng thái mới
Để chuyển hoạt động sang trạng thái khác, chẳng hạn như CREATED hoặc STARTED, hãy gọi moveToState. Hành động này mô phỏng tình huống hoạt động của bạn bị dừng hoặc tạm dừng, tương ứng, vì hoạt động đó bị gián đoạn bởi một ứng dụng khác hoặc một hành động của hệ thống.
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 của activity 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 kiểm tra trạng thái của một hoạt động đang được kiểm thử nếu hoạt động đó chuyển hướng đến một hoạt động khác hoặc tự hoàn tất, như minh hoạ trong đoạn mã sau:
@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ị có ít tài nguyên, hệ thống có thể hủy bỏ một Hoạt động, yêu cầu ứng dụng của bạn tạo lại Hoạt động đó khi người dùng quay lại ứng dụng của bạn. Để mô phỏng các tình trạng 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ú thích 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 được liên kết với một hoạt động đã hoàn tất, hãy lấy giá trị của trường result trong đối tượng ActivityScenario. Khi sử dụng createAndroidComposeRule, bạn có thể dễ dàng kích hoạt hành động trên giao diện người dùng để hoàn tất hoạt động, như trong đoạn mã sau:
@RunWith(AndroidJUnit4::class)
class MyTestSuite {
@get:Rule
val composeTestRule = createAndroidComposeRule<MyActivity>()
@Test fun testResult() {
composeTestRule.onNodeWithTag("finish_button").performClick()
val scenario = composeTestRule.activityRule.scenario
val resultCode = scenario.result.resultCode
val resultData = scenario.result.resultData
}
}
Kích hoạt hành động trong hoạt động
Tất cả phương thức trong ActivityScenario đều là các lệnh gọi chặn, vì vậy, API yêu cầu bạn chạy các phương thức này trong luồng đo lường.
Để kích hoạt các hành động trong hoạt động đang được kiểm thử, hãy sử dụng API kiểm thử Compose để tương tác với các thành phần kết hợp:
@RunWith(AndroidJUnit4::class)
class MyTestSuite {
@get:Rule
val composeTestRule = createAndroidComposeRule<MyActivity>()
@Test fun testEvent() {
composeTestRule.onNodeWithText("Refresh").performClick()
}
}
Tuy nhiên, nếu cần gọi một phương thức cho chính hoạt động đó, bạn có thể thực hiện một cách an toàn bằng cách sử dụng onActivity:
@RunWith(AndroidJUnit4::class)
class MyTestSuite {
@Test fun testEvent() {
launchActivity<MyActivity>().use { scenario ->
scenario.onActivity { activity ->
activity.handleSwipeToRefresh()
}
}
}
}
Tài nguyên khác
Để biết thêm thông tin về hoạt động kiểm thử, hãy xem các tài nguyên bổ sung sau: