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 của bạn, vì vậy bạn cần kiểm thử cách các hoạt động của ứng dụng hoạt động ở cấp thiết bị các sự kiện như sau:

  • Một ứng dụng khác, chẳng hạn như ứng dụng dành cho điện thoại của thiết bị, làm gián đoạn hoạt động trong ứ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ể, bạn phải đảm bảo hoạt động của bạn hoạt động chính xác trong các sự kiện được mô tả trong Hoạt động Lifecycle.

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

Thúc đẩy trạng thái của một hoạt động

Một khía cạnh chính của việc kiểm thử hoạt động của ứng dụng bao gồm việc đặt hoạt động ở các tiểu bang cụ thể. Để định nghĩa điều này trong quá trình kiểm thử, hãy sử dụng các bản sao của ActivityScenario, thuộc 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 bạn ở những trạng thái mô phỏng sự kiện ở cấp thiết bị.

ActivityScenario là API đa nền tảng mà bạn có thể sử dụng trong kiểm thử đơn vị cục bộ cũng như các thử nghiệm 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 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 trong hoạt động kiểm thử khi mã bị huỷ hoặc được tạo. Phần này trình bày các kỹ thuật phổ biến nhất các trường hợp sử dụng 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ã xuất hiện 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 đổi 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à đang hiển thị cho 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 phần tử View sử dụng quy trình kiểm thử giao diện người dùng Espresso.

Bạn nên gọi close trên hoạt động khi kiểm thử hoàn tất. Thao tác này sẽ dọn dẹp các tài nguyên liên quan và cải thiện độ ổn định của các bài kiểm thử. ActivityScenario triển khai Closeable, vì vậy, bạn có thể áp dụng phần mở rộng use hoặc try-with-resources trong 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 tra và ActivityScenario.close khi phân tách thử nghiệm. Ví dụ sau đây minh hoạ cách xác định một quy tắc và lấy một giá trị của một tình huống từ nó:

@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 trong đó hoạt động của bạn đã dừng hoặc tạm dừng tương ứng do bị gián đoạn bởi một ứng dụng khác hoặc 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 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. Điều này đặc biệt hữu ích để kiểm tra trạng thái của một hoạt động đang được kiểm thử xem hoạt động đó có chuyển hướng đến một hoạt động khác hoặc tự kết thúc, như được minh hoạ trong mã sau snippet:

@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 một 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 các đ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à bất kỳ đối tượng nào được chú thích bằng @NonConfigurationInstance. Các đối tượng này sẽ 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

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

@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 các hành động 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 này yêu cầu bạn để chạy chúng 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 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ể làm như vậ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()
            }
        }
    }
}