Nguyên tắc cơ bản về việc kiểm thử ứng dụng Android

Trang này trình bày các nguyên lý cốt lõi về kiểm thử ứng dụng Android, bao gồm cả các phương pháp hay nhất về trọng tâm và lợi ích của những phương pháp đó.

Lợi ích của việc kiểm thử

Kiểm thử là một phần quan trọng trong quá trình phát triển ứng dụng. Bằng cách chạy các quy trình kiểm thử cho ứng dụng một cách nhất quán, bạn có thể xác minh độ chính xác, hành vi của chức năng và khả năng hữu dụng của ứng dụng trước khi phát hành công khai.

Bạn có thể kiểm thử ứng dụng theo cách thủ công bằng cách duyệt qua ứng dụng đó. Bạn có thể sử dụng nhiều thiết bị và trình mô phỏng, thay đổi ngôn ngữ hệ thống và cố gắng tạo mọi lỗi người dùng hoặc duyệt qua mọi luồng người dùng.

Tuy nhiên, việc kiểm thử thủ công có quy mô kém và có thể dễ dàng bỏ qua các hiện tượng hồi quy trong hành vi của ứng dụng. Kiểm thử tự động là việc sử dụng các công cụ thực hiện kiểm thử cho bạn. Phương pháp này nhanh hơn, lặp lại được nhiều hơn và thường cung cấp cho bạn phản hồi hữu ích hơn về ứng dụng của bạn trong quá trình phát triển.

Các loại kiểm thử trong Android

Ứng dụng di động rất phức tạp và phải hoạt động tốt trong nhiều môi trường. Do đó, có nhiều loại kiểm thử.

Tiêu đề

Ví dụ: có nhiều loại bài kiểm tra tuỳ thuộc vào môn học:

  • Kiểm thử chức năng: ứng dụng của tôi có thực hiện đúng chức năng không?
  • Kiểm thử hiệu suất: có nhanh chóng và hiệu quả không?
  • Kiểm thử khả năng hỗ trợ tiếp cận: ứng dụng có hoạt động tốt với các dịch vụ hỗ trợ tiếp cận không?
  • Kiểm thử khả năng tương thích: có hoạt động tốt trên mọi thiết bị và cấp độ API không?

Phạm vi

Các thử nghiệm cũng khác nhau tuỳ thuộc vào kích thước hoặc mức độ tách biệt:

  • Kiểm thử đơn vị hoặc kiểm thử nhỏ chỉ xác minh một phần rất nhỏ của ứng dụng, chẳng hạn như một phương thức hoặc lớp.
  • Các bài kiểm thử từ đầu đến cuối hoặc kiểm thử lớn xác minh các phần lớn hơn của ứng dụng cùng một lúc, chẳng hạn như toàn bộ màn hình hoặc luồng người dùng.
  • Kiểm thử trung bình nằm ở giữa và kiểm tra việc tích hợp giữa hai hoặc nhiều đơn vị.
Kiểm thử có thể là nhỏ, trung bình hoặc lớn.
Hình 1: Phạm vi kiểm thử trong một ứng dụng thông thường.

Có nhiều cách để phân loại kiểm thử. Tuy nhiên, điểm khác biệt quan trọng nhất đối với nhà phát triển ứng dụng là nơi chạy kiểm thử.

Kiểm thử đo lường so với kiểm thử cục bộ

Bạn có thể chạy kiểm thử trên thiết bị Android hoặc trên một máy tính khác:

  • Kiểm thử đo lường chạy trên một thiết bị Android, thực hoặc được mô phỏng. Ứng dụng được tạo và cài đặt cùng với một ứng dụng kiểm thử chèn các lệnh và đọc trạng thái. Kiểm thử đo lường thường là kiểm thử giao diện người dùng, khởi chạy một ứng dụng rồi tương tác với ứng dụng đó.
  • Kiểm thử cục bộ thực thi trên máy phát triển hoặc máy chủ, vì vậy, các kiểm thử này cũng được gọi là kiểm thử phía máy chủ. Các thành phần này thường nhỏ và nhanh, tách đối tượng đang kiểm thử với phần còn lại của ứng dụng.
Các bài kiểm thử có thể chạy ở dạng kiểm thử đo lường trên một thiết bị hoặc kiểm thử cục bộ trên máy phát triển của bạn.
Hình 2: Các loại kiểm thử khác nhau tuỳ thuộc vào vị trí chạy.

Không phải tất cả kiểm thử đơn vị đều là kiểm thử cục bộ và không phải tất cả kiểm thử toàn diện đều chạy trên một thiết bị. Ví dụ:

  • Kiểm thử cục bộ lớn: Bạn có thể sử dụng trình mô phỏng Android chạy cục bộ, chẳng hạn như Robolectric.
  • Kiểm thử đo lường nhỏ: Bạn có thể xác minh rằng mã của mình hoạt động tốt với một tính năng khung, chẳng hạn như cơ sở dữ liệu SQLite. Bạn có thể chạy bài kiểm thử này trên nhiều thiết bị để kiểm tra trạng thái tích hợp với nhiều phiên bản SQLite.

Ví dụ

Các đoạn mã sau minh hoạ cách tương tác với giao diện người dùng trong kiểm thử giao diện người dùng được đo lường để nhấp vào một phần tử và xác minh rằng một phần tử khác được hiển thị.

Espresso

// When the Continue button is clicked
onView(withText("Continue"))
    .perform(click())

// Then the Welcome screen is displayed
onView(withText("Welcome"))
    .check(matches(isDisplayed()))

Giao diện người dùng Compose

// When the Continue button is clicked
composeTestRule.onNodeWithText("Continue").performClick()

// Then the Welcome screen is displayed
composeTestRule.onNodeWithText("Welcome").assertIsDisplayed()

Đoạn mã này cho thấy một phần của kiểm thử đơn vị cho ViewModel (kiểm thử cục bộ, phía máy chủ):

// Given an instance of MyViewModel
val viewModel = MyViewModel(myFakeDataRepository)

// When data is loaded
viewModel.loadData()

// Then it should be exposing data
assertTrue(viewModel.data != null)

Cấu trúc có thể kiểm thử

Với cấu trúc ứng dụng có thể kiểm thử, mã sẽ tuân theo một cấu trúc cho phép bạn dễ dàng kiểm thử riêng lẻ các phần của ứng dụng. Cấu trúc có thể kiểm thử có các ưu điểm khác, chẳng hạn như dễ đọc, dễ bảo trì, dễ mở rộng và có thể sử dụng lại.

Một cấu trúc không thể kiểm thử tạo ra kết quả sau:

  • Quy trình kiểm thử lớn hơn, chậm hơn, không ổn định hơn. Các lớp không thể kiểm thử đơn vị có thể phải được kiểm thử tích hợp hoặc kiểm thử giao diện người dùng quy mô lớn hơn.
  • Ít cơ hội để thử nghiệm nhiều tình huống. Các lần kiểm thử lớn hơn sẽ chậm hơn, vì vậy, việc kiểm thử tất cả các trạng thái có thể xảy ra của một ứng dụng có thể không thực tế.

Để tìm hiểu thêm về các nguyên tắc cấu trúc, hãy xem hướng dẫn về cấu trúc ứng dụng.

Các phương pháp tách

Nếu bạn có thể trích xuất một phần của hàm, lớp hoặc mô-đun từ phần còn lại, việc kiểm thử sẽ dễ dàng và hiệu quả hơn. Phương pháp này được gọi là phân tách và là khái niệm quan trọng nhất đối với cấu trúc có thể kiểm thử.

Sau đây là các kỹ thuật phân tách phổ biến:

  • Phân tách ứng dụng thành các lớp như Bản trình bày, Miền và Dữ liệu. Bạn cũng có thể chia một ứng dụng thành các mô-đun, mỗi mô-đun cho một tính năng.
  • Tránh thêm logic vào các thực thể có nhiều phần phụ thuộc, chẳng hạn như hoạt động và mảnh. Sử dụng các lớp này làm điểm truy cập cho khung và di chuyển logic giao diện người dùng và kinh doanh đến nơi khác, chẳng hạn như đến Thành phần kết hợp, ViewModel hoặc lớp miền.
  • Tránh các phần phụ thuộc khung trực tiếp trong các lớp chứa logic nghiệp vụ. Ví dụ: không sử dụng Ngữ cảnh Android trong ViewModel.
  • Giúp dễ dàng thay thế các phần phụ thuộc. Ví dụ: sử dụng giao diện thay vì cách triển khai cụ thể. Sử dụng tính năng Chèn phần phụ thuộc ngay cả khi bạn không sử dụng khung DI.

Các bước tiếp theo

Giờ đây, khi đã biết lý do bạn nên kiểm thử và hai loại kiểm thử chính, bạn có thể đọc bài viết Nội dung cần kiểm thử hoặc tìm hiểu về Chiến lược kiểm thử

Ngoài ra, nếu bạn muốn tạo kiểm thử đầu tiên và học bằng cách thực hành, hãy tham khảo Lớp học lập trình về kiểm thử.