Viết kiểm thử tự động

1. Trước khi bắt đầu

Lớp học lập trình này hướng dẫn bạn về các kiểm thử tự động trong Android cũng như cách chúng cho phép bạn viết các ứng dụng mạnh mẽ và có thể mở rộng. Bạn cũng sẽ hiểu rõ hơn sự khác biệt giữa logic giao diện người dùng và logic nghiệp vụ cũng như cách kiểm tra cả hai. Cuối cùng, bạn sẽ tìm hiểu cách viết và chạy kiểm thử tự động trong Android Studio.

Điều kiện tiên quyết

  • Có thể viết một ứng dụng Android có các chức năng và thành phần kết hợp.

Kiến thức bạn sẽ học được

  • Hoạt động kiểm thử tự động trong Android là gì.
  • Tại sao kiểm thử tự động lại quan trọng.
  • Kiểm thử cục bộ là gì và được sử dụng cho mục đích gì.
  • Kiểm thử đo lường là gì và được sử dụng cho mục đích gì.
  • Cách viết bài kiểm thử cục bộ cho đoạn mã Android.
  • Cách viết bài kiểm thử đo lường cho ứng dụng Android.
  • Cách chạy kiểm thử tự động.

Sản phẩm bạn sẽ tạo ra

  • Một bài kiểm thử cục bộ
  • Một bài kiểm thử đo lường

Bạn cần

  • Phiên bản mới nhất của Android Studio
  • Mã nguồn giải pháp cho ứng dụng Tip Time (Tính tiền boa)

2. Lấy mã khởi động

Tải xuống mã

Ngoài ra, bạn có thể sao chép kho lưu trữ GitHub cho mã:

$ git clone https://github.com/google-developer-training/basic-android-kotlin-compose-training-tip-calculator.git
$ cd basic-android-kotlin-compose-training-tip-calculator
$ git checkout main

3. Kiểm thử tự động

Đối với phần mềm, kiểm thử là một phương thức có cấu trúc để kiểm tra phần mềm của bạn nhằm đảm bảo phần mềm hoạt động như mong đợi. Kiểm thử tự động là đoạn mã kiểm tra để đảm bảo rằng một đoạn mã khác mà bạn đã viết hoạt động chính xác.

Hoạt động 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 bài kiểm thử cho ứng dụng của mình theo cách nhất quán, bạn có thể xác minh độ chính xác, hành vi chức năng và khả năng hữu dụng của ứng dụng trước khi phát hành chính thức.

Việc kiểm thử cũng là cách để liên tục kiểm tra mã hiện có khi có các thay đổi.

Mặc dù việc kiểm thử thủ công hầu như luôn có vai trò quan trọng nhưng thường có thể được tự động hoá trong Android. Trong suốt khóa học còn lại, bạn tập trung vào kiểm thử tự động để kiểm tra mã nguồn của ứng dụng và các yêu cầu về chức năng của ứng dụng. Trong lớp học lập trình này, bạn sẽ tìm hiểu kiến thức cơ bản về việc kiểm thử trên Android. Trong các lớp học lập trình sau này, bạn sẽ tìm hiểu thêm các phương pháp kiểm thử ứng dụng Android nâng cao.

Khi đã quen với việc phát triển và kiểm thử ứng dụng Android, bạn nên thường xuyên luyện tập viết mã kiểm thử đi kèm mã ứng dụng. Việc tạo một bài kiểm thử mỗi khi tạo một tính năng mới trong ứng dụng sẽ giúp làm giảm khối lượng công việc sau này khi ứng dụng của bạn phát triển. Ngoài ra, điều này cũng giúp bạn thuận tiện trong việc đảm bảo ứng dụng hoạt động bình thường mà không mất quá nhiều thời gian để kiểm thử ứng dụng theo cách thủ công.

Kiểm thử tự động là một phần thiết yếu trong toàn bộ quá trình phát triển phần mềm; phát triển Android cũng không phải là ngoại lệ. Vì vậy, bây giờ chính là thời điểm tốt nhất để giới thiệu tính năng này cho bạn!

Tại sao kiểm thử tự động lại quan trọng

Lúc đầu có thể bạn cho rằng mình không thực sự cần chạy bài kiểm thử trong ứng dụng, nhưng bài kiểm thử là cần thiết cho các ứng dụng thuộc mọi quy mô và mức độ phức tạp.

Để phát triển cơ sở mã của mình, bạn cần kiểm thử các chức năng hiện có khi thêm các mảnh mới. Điều này chỉ có thể xảy ra nếu bạn đã có các phương thức kiểm thử hiện tại. Khi ứng dụng của bạn phát triển, việc kiểm thử thủ công sẽ tốn nhiều công sức hơn so với kiểm thử tự động. Hơn nữa, khi bắt đầu làm việc với các ứng dụng trong phiên bản chính thức, việc kiểm thử sẽ trở nên quan trọng khi bạn có lượng người dùng lớn hơn. Ví dụ: Bạn phải tính đến nhiều loại thiết bị chạy nhiều phiên bản Android khác nhau.

Cuối cùng, bạn có đạt đến ngưỡng nơi các bài kiểm thử tự động có thể chiếm phần lớn các tình huống sử dụng nhanh hơn đáng kể so với kiểm thử thủ công. Khi bạn chạy bài kiểm thử trước khi phát hành mã mới, bạn có thể thay đổi mã hiện tại để tránh phát hành ứng dụng có cách thức hoạt động ngoài mong muốn.

Hãy nhớ kiểm thử tự động là các bài kiểm thử được thực thi thông qua phần mềm, trái với kiểm thử thủ công qua tương tác trực tiếp với một thiết bị. Kiểm thử tự động và kiểm thử thủ công đóng vai trò quan trọng trong việc đảm bảo người dùng sản phẩm có được trải nghiệm thú vị. Tuy nhiên, kiểm thử tự động có thể chính xác hơn và có thể tối ưu hoá năng suất của nhóm bạn bởi vì không cần người chạy các phép kiểm thử và chúng có thể được thực thi nhanh hơn nhiều so với kiểm thử thủ công.

Loại kiểm thử tự động

Kiểm thử cục bộ

Kiểm thử cục bộ là một loại kiểm thử tự động dùng để kiểm thử trực tiếp một đoạn mã nhỏ để đảm bảo đoạn mã hoạt động đúng cách. Với các bài kiểm thử cục bộ, bạn có thể kiểm thử các hàm, lớp và thuộc tính. Kiểm thử cục bộ được thực thi trên máy trạm của bạn, tức là các bài kiểm thử này chạy trong môi trường phát triển mà không cần thiết bị hay trình mô phỏng. Nói theo cách đơn giản hơn, các bài kiểm thử cục bộ chạy trên máy tính của bạn. Chi phí cho các tài nguyên trong máy tính cũng rất thấp, nên chúng có thể chạy nhanh ngay cả khi chỉ có tài nguyên có hạn. Android Studio luôn sẵn sàng chạy các bài kiểm thử cục bộ một cách tự động.

Kiểm thử đo lường

Đối với quá trình phát triển Android, bài kiểm thử đo lường là một kiểm thử trên giao diện người dùng. Các bài kiểm thử đo lường cho phép bạn kiểm thử các phần của một ứng dụng chạy trên API Android, cũng như các API và dịch vụ của nền tảng đó.

Không giống như kiểm thử cục bộ, bài kiểm thử trên giao diện người dùng khởi chạy một ứng dụng hoặc một phần của ứng dụng, mô phỏng các hoạt động tương tác của người dùng và kiểm tra xem ứng dụng đó có phản ứng đúng cách hay không. Trong suốt khóa học này, các bài kiểm tra giao diện người dùng được chạy trên một thiết bị hoặc trình mô phỏng thực.

Khi bạn chạy kiểm thử đo lường trên Android, mã kiểm thử thực sự được tích hợp vào Gói ứng dụng Android (APK) riêng, giống như một ứng dụng Android thông thường. APK là một tệp nén chứa tất cả mã và tệp cần thiết để chạy ứng dụng trên thiết bị hoặc trình mô phỏng. Tệp APK kiểm thử được cài đặt trên thiết bị hoặc trình mô phỏng cùng với tệp APK ứng dụng thông thường. Sau đó, tệp APK kiểm thử sẽ chạy các bài kiểm thử đó dựa trên tệp APK ứng dụng.

4. Viết kiểm thử cục bộ

Chuẩn bị mã ứng dụng

Kiểm thử cục bộ trực tiếp kiểm thử các phương thức từ mã ứng dụng, vì vậy, các phương thức được kiểm thử phải có sẵn cho các lớp và phương thức kiểm thử. Kiểm thử cục bộ trong đoạn mã sau đây đảm bảo rằng phương thức calculateTip() hoạt động đúng, nhưng phương thức calculateTip() hiện là private và do đó không thể truy cập qua kiểm thử này. Xoá chỉ định private và đặt nó thành internal:

MainActivity.kt

internal fun calculateTip(amount: Double, tipPercent: Double = 15.0, roundUp: Boolean): String {
    var tip = tipPercent / 100 * amount
    if (roundUp) {
        tip = kotlin.math.ceil(tip)
    }
    return NumberFormat.getCurrencyInstance().format(tip)
}
  • Trong tệp MainActivity.kt trên dòng trước phương thức calculateTip(), hãy thêm chú thích @VisibleForTesting:
@VisibleForTesting
internal fun calculateTip(amount: Double, tipPercent: Double = 15.0, roundUp: Boolean): String {
    var tip = tipPercent / 100 * amount
    if (roundUp) {
        tip = kotlin.math.ceil(tip)
    }
    return NumberFormat.getCurrencyInstance().format(tip)
}

Thao tác này sẽ làm cho phương thức này công khai, nhưng chỉ cho những người khác biết rằng phương thức đó chỉ công khai cho mục đích kiểm thử.

Tạo thư mục kiểm thử

Trong các dự án Android, thư mục test là nơi viết các bài kiểm thử cục bộ.

Tạo thư mục kiểm thử:

  1. Trong thẻ Project (Dự án), hãy chuyển sang khung hiển thị Dự án.

b9fac49a80bc59f6.png

  1. Nhấp chuột phải vào thư mục src.

6cdf1a84fd2c0a25.png

  1. Chọn New (Mới).

dc9d7b82d65502a3.png

  1. Chọn Directory (Thư mục).

1c9115800a6f8e36.png

  1. Trong cửa sổ New Directory (Thư mục mới), chọn test/java.

56f5e2df9525a230.png

  1. Nhấn phím return hoặc enter trên bàn phím. Giờ đây, bạn có thể thấy thư mục test (kiểm thử) trong thẻ Project (Dự án).

60c6a44570332cab.png

Thư mục test (kiểm thử) cần cấu trúc gói giống với thư mục main chứa mã ứng dụng của bạn. Nói cách khác, giống như mã ứng dụng được viết trong gói main > java > com > example > tiptime, các bài kiểm thử cục bộ sẽ được viết trong test > java > com > example > tiptime.

Tạo cấu trúc gói này trong thư mục kiểm thử:

  1. Nhấp chuột phải vào thư mục test/java rồi chọn New > Package (Mới > Gói).

5814cfecbebd43e1.png

  1. Trong cửa sổ New Package (Gói mới), hãy nhập com.example.tiptime.

74fc5fbc7e051a4c.png

Tạo lớp kiểm thử

Gói kiểm thử đã sẵn sàng, đã đến lúc viết một số kiểm thử! Hãy bắt đầu bằng cách tạo lớp kiểm thử.

  1. Trong thẻ Project (Dự án), hãy nhấp vào app > src > test (ứng dụng > src > kiểm thử) rồi nhấp vào biểu tượng mũi tên mở rộng 7aeb5945d20f0dd0.png bên cạnh thư mục test.

màn hình hiển thị thư mục unitTest

  1. Nhấp chuột phải vào thư mục tiptime, rồi chọn New > Kotlin Class/File (Mới > Lớp/tệp Kotlin).

8c64ee6e43c62481.png

  1. Nhập tên lớp là TipCalculatorTests.

8c39d1d2ac201307.png

Viết bài kiểm thử

Như đã đề cập trước đó, kiểm thử cục bộ được dùng để kiểm thử những đoạn mã nhỏ trong ứng dụng. Chức năng chính của Ứng dụng Tip Time sẽ tính tiền boa, do đó, bạn nên kiểm thử cục bộ để đảm bảo rằng logic tính tiền boa hoạt động chính xác.

Để làm việc này, bạn cần gọi trực tiếp hàm calculateTip() như bạn đã làm trong mã ứng dụng. Sau đó, bạn đảm bảo rằng giá trị được hàm trả về khớp với giá trị dự kiến dựa trên các giá trị mà bạn đã chuyển vào hàm.

Có một vài điều bạn nên biết về cách viết kiểm thử tự động. Danh sách các khái niệm sau áp dụng cho kiểm thử cục bộ và kiểm thử đo lường. Các khái niệm này thoạt đầu có vẻ khó hiểu nhưng sau lớp học lập trình này, bạn sẽ cảm thấy dễ hiểu hơn.

  • Viết bài kiểm thử tự động dưới dạng các phương thức.
  • Chú thích phương thức chú thích @Test. Việc này giúp trình biên dịch biết rằng phương thức này là một phương thức kiểm thử và chạy phương thức đó cho phù hợp.
  • Hãy đảm bảo tên mô tả rõ ràng nội dung kiểm thử và kết quả dự kiến.
  • Phương thức kiểm thử không sử dụng logic như các phương thức ứng dụng thông thường. Họ không quan tâm đến cách triển khai tính năng. Họ kiểm tra nghiêm ngặt kết quả dự kiến cho một giá trị nhập vào nhất định. Điều này có nghĩa là phương thức kiểm thử chỉ thực thi một tập hợp các lệnh để xác nhận rằng giao diện người dùng hoặc logic của một ứng dụng hoạt động đúng cách. Bạn chưa cần phải hiểu điều này có nghĩa là gì vì bạn nhìn thấy tên này sẽ trông như thế nào sau này, nhưng hãy nhớ rằng mã kiểm thử có thể trông khá khác với mã ứng dụng mà bạn đã quen thuộc.
  • Kiểm thử thường kết thúc bằng xác nhận, dùng để đảm bảo đáp ứng một điều kiện nhất định. Xác nhận có dạng lệnh gọi phương thức xác nhận tên. Ví dụ: lời khẳng định assertTrue() thường được dùng trong kiểm thử Android. Tuyên bố xác nhận được dùng trong hầu hết các kiểm thử, nhưng hiếm khi dùng trong mã ứng dụng thực tế.

Viết kiểm thử:

  1. Tạo một phương thức để kiểm thử phép tính 20% tiền boa cho số tiền là 10 USD trên hoá đơn. Kết quả dự kiến cho phép tính đó là 2 USD.
import org.junit.Test

class TipCalculatorTests {

   @Test
   fun calculateTip_20PercentNoRoundup() {

   }
}

Bạn cần nhớ rằng phương thức calculateTip() của tệp MainActivity.kt trong mã ứng dụng này yêu cầu 3 tham số. Số tiền trên hoá đơn, tỷ lệ phần trăm tiền boa và một cờ cho biết có làm tròn kết quả hay không.

fun calculateTip(amount: Double, tipPercent: Double, roundUp: Boolean)

Khi đến lúc gọi phương thức này từ hoạt động kiểm thử, các tham số này cần được truyền giống như cách chúng đã được truyền khi phương thức được gọi trong mã ứng dụng.

  1. Trong phương thức calculateTip_20PercentNoRoundup(), hãy tạo 2 biến không đổi: biến amount được đặt thành giá trị 10.00 và biến tipPercent được đặt thành giá trị 20.00.
val amount = 10.00
val tipPercent = 20.00
  1. Trong mã ứng dụng, ở tệp MainActivity.kt, hãy quan sát mã sau, số tiền boa sẽ được định dạng dựa trên ngôn ngữ của thiết bị.

MainActivity.kt

...
NumberFormat.getCurrencyInstance().format(tip)
...

Bạn phải sử dụng cùng một định dạng khi xác minh số tiền boa dự kiến trong bài kiểm thử.

  1. Tạo biến expectedTip được đặt thành NumberFormat.getCurrencyInstance().format(2).

Biến expectedTip được so sánh với kết quả của phương thức calculateTip() sau này. Đây là cách kiểm thử đảm bảo rằng phương thức hoạt động đúng cách. Ở bước cuối cùng, bạn đặt biến amount thành giá trị 10.00 và biến tipPercent thành giá trị 20.00. 20% của 10 là 2, do đó biến expectedTip được đặt thành đơn vị tiền tệ được định dạng với giá trị là 2. Hãy nhớ rằng phương thức calculateTip() trả về một giá trị String được định dạng.

  1. Gọi phương thức calculateTip() có các biến amounttipPercent, đồng thời chuyển đối số false cho bản tin tóm tắt.

Bạn không cần tính đến việc làm tròn trong trường hợp này vì kết quả dự kiến không tính đến việc làm tròn.

  1. Lưu trữ kết quả của lệnh gọi phương thức trong một biến actualTip không đổi.

Cho đến thời điểm này, việc viết kiểm thử này không khác nhiều so với việc viết một phương thức thông thường trong mã ứng dụng. Tuy nhiên, giờ đây khi mà bạn có giá trị được trả về từ phương pháp mà bạn muốn kiểm thử, bạn phải xác định xem giá trị đó có phải là giá trị chính xác hay không bằng một câu nhận định.

Đưa ra khẳng định thường là mục tiêu cuối cùng của kiểm thử tự động và đây không phải là mục tiêu thường thấy trong mã ứng dụng. Trong trường hợp này, bạn nên đảm bảo rằng biến actualTip bằng với biến expectedTip. Bạn có thể sử dụng phương thức assertEquals() từ thư viện JUnit để thực hiện việc này.

Phương thức assertEquals() nhận 2 tham số: một giá trị dự kiến và một giá trị thực tế. Nếu các giá trị này bằng nhau, thì câu nhận định và kiểm thử sẽ thành công. Nếu các giá trị này không bằng nhau, thì câu nhận định và kiểm thử sẽ không thành công.

  1. Gọi phương thức assertEquals() này, sau đó chuyển các biến expectedTipactualTip làm thông số:
import org.junit.Assert.assertEquals
import org.junit.Test
import java.text.NumberFormat

class TipCalculatorTests {

    @Test
    fun calculateTip_20PercentNoRoundup() {
        val amount = 10.00
        val tipPercent = 20.00
        val expectedTip = NumberFormat.getCurrencyInstance().format(2)
        val actualTip = calculateTip(amount = amount, tipPercent = tipPercent, false)
        assertEquals(expectedTip, actualTip)
    }
}

Chạy kiểm thử

Giờ là lúc bạn có thể chạy kiểm thử!

Bạn có thể nhận thấy các mũi tên xuất hiện trong máng xối cùng với số dòng của tên lớp và hàm kiểm thử. Bạn có thể nhấp vào các mũi tên này để chạy kiểm thử. Khi nhấp vào mũi tên bên cạnh một phương thức, bạn chỉ chạy phương thức kiểm thử đó. Nếu có nhiều phương thức kiểm thử trong một lớp, thì bạn có thể nhấp vào mũi tên bên cạnh lớp để chạy tất cả các phương thức kiểm thử trong lớp đó.

d1d3291589b08b74.png

Chạy kiểm thử:

  • Nhấp vào các mũi tên bên cạnh phần khai báo lớp rồi nhấp vào Run ‘TipCalculatorTests' (Chạy "TipCalculatorTests").

301a67db81194d1a.png

Bạn sẽ thấy những mục sau:

  • Trong rãnh, các mũi tên sẽ được thay thế bằng dấu kiểm màu xanh lục và hình tam giác dc22757efa3bff97.png. Điều này chỉ ra rằng đoạn mã đã vượt qua bài kiểm thử.

ecf625f23f30a1bb.png

  • Ở cuối ngăn Run (Chạy), bạn sẽ thấy một số kết quả.

màn hình hiển thị các kiểm nghiệm đã thành công

  • Chỉ báo cho biết kiểm thử đã thành công.

5. Viết bài kiểm thử đo lường

Tạo thư mục đo lường

Thư mục đo lường được tạo theo cách tương tự như thư mục kiểm thử cục bộ.

  1. Nhấp chuột phải vào thư mục src rồi chọn New > Directory (Mới > Thư mục).

màn hình hiển thị đã chọn lựa chọn trên trình đơn trong thư mục

  1. Trong cửa sổ New Directory (Thư mục mới), hãy chọn androidTest/java.

49b436219213c56d.png

  1. Nhấn phím return hoặc enter trên bàn phím. Giờ đây, bạn có thể thấy thư mục androidTest trong thẻ Project (Dự án).

màn hình hiển thị đã chọn thư mục kiểm thử android

Cũng giống như các thư mục maintest có cùng cấu trúc gói, thư mục androidTest phải chứa cấu trúc gói tương tự đó.

  1. Nhấp chuột phải vào thư mục androidTest/java rồi chọn Mới > Gói.
  2. Trong cửa sổ New Package (Gói mới), hãy nhập com.example.tiptime.
  3. Nhấn phím return hoặc enter trên bàn phím. Giờ đây, bạn có thể xem cấu trúc gói hoàn chỉnh của thư mục androidTest trong thẻ Dự án.

Tạo lớp kiểm thử

Trong các dự án Android, thư mục kiểm thử đo lường được chỉ định là thư mục androidTest.

Để tạo một kiểm thử đo lường, bạn cần lặp lại cùng một quy trình bạn đã sử dụng để tạo kiểm thử cục bộ, nhưng lần này hãy tạo kiểm thử trong thư mục androidTest.

Tạo lớp kiểm thử:

  1. Chuyển đến thư mục androidTest trong ngăn dự án.

a627f92d40041107.png

  1. Nhấp vào mũi tên mở rộng a30374584d86ddb6.png bên cạnh mỗi thư mục cho đến khi bạn thấy thư mục tiptime.

7653ebbc899a26a.png

  1. Nhấp chuột phải vào thư mục tiptime rồi chọn New > Kotlin Class/File (Mới > Lớp/tệp Kotlin).

69b2c4bcf72c7b1a.png

  1. Nhập tên lớp là TipUITests.

8685533c87fbbea0.png

Viết bài kiểm thử

Mã kiểm thử đo lường khá khác so với mã kiểm thử cục bộ.

Các kiểm thử đo lường sẽ kiểm tra một phiên bản thực tế của ứng dụng và giao diện người dùng của ứng dụng, vì vậy, bạn phải đặt nội dung giao diện người dùng, tương tự như cách đặt nội dung trong phương thức onCreate() của tệp MainActivity.kt khi bạn viết mã cho ứng dụng Tip Time. Bạn cần thực hiện việc này trước khi viết tất cả các kiểm thử đo lường dành cho các ứng dụng được tích hợp Compose.

Trong trường hợp kiểm thử ứng dụng Tip Time, bạn tiếp tục viết hướng dẫn để tương tác với các thành phần trong giao diện người dùng để quy trình tính tiền boa được kiểm thử thông qua giao diện người dùng. Ban đầu, bạn có thể thấy khái niệm về bài kiểm thử đo lường có tính trừu tượng, nhưng đừng lo lắng! Quy trình này được đề cập trong các bước sau đây.

Viết kiểm thử:

  1. Tạo biến composeTestRule sẽ được đặt thành kết quả của phương thức createComposeRule() và chú thích biến bằng chú thích Rule:
import androidx.compose.ui.test.junit4.createComposeRule
import org.junit.Rule

class TipUITests {

   @get:Rule
   val composeTestRule = createComposeRule()
}
  1. Tạo một phương thức calculate_20_percent_tip() và chú thích bằng phương thức chú thích @Test:
import org.junit.Test

@Test
fun calculate_20_percent_tip() {
}

Trình biên dịch biết rằng các phương thức được chú thích bằng chú thích @Test trong thư mục androidTest tham chiếu đến các kiểm thử đo lường và các phương thức được chú thích bằng chú thích @Test trong thư mục test tham chiếu đến các kiểm thử cục bộ.

  1. Trong phần nội dung hàm, hãy gọi hàm composeTestRule.setContent(). Thao tác này sẽ đặt nội dung trên giao diện người dùng của composeTestRule.
  2. Trong phần nội dung hàm lambda của hàm, hãy gọi hàm TipTimeTheme() bằng phần nội dung lambda đã gọi hàm TipTimeLayout().
import com.example.tiptime.ui.theme.TipTimeTheme

@Test
fun calculate_20_percent_tip() {
    composeTestRule.setContent {
        TipTimeTheme {
           TipTimeLayout()
        }
    }
}

Khi bạn hoàn tất, mã phải giống với mã được viết để đặt nội dung trong phương thức onCreate() trong tệp MainActivity.kt. Giờ đây, nội dung giao diện người dùng đã được thiết lập, bạn có thể viết hướng dẫn để tương tác với các phần tử trên giao diện người dùng của ứng dụng. Trong ứng dụng này, bạn cần kiểm tra để đảm bảo rằng ứng dụng hiển thị đúng giá trị tiền boa dựa trên số tiền trên hoá đơn và giá đầu vào theo tỷ lệ phần trăm tiền boa.

  1. Các phần tử trên giao diện người dùng có thể truy cập được dưới dạng nút thông qua composeTestRule. Một cách phổ biến để làm việc này là truy cập một nút chứa văn bản cụ thể bằng phương thức onNodeWithText(). Dùng phương thức onNodeWithText() để truy cập vào thành phần kết hợp TextField cho số tiền trên hoá đơn:
import androidx.compose.ui.test.onNodeWithText

@Test
fun calculate_20_percent_tip() {
    composeTestRule.setContent {
        TipTimeTheme {
            TipTimeLayout()
        }
    }
    composeTestRule.onNodeWithText("Bill Amount")
}

Tiếp theo, bạn có thể gọi phương thức performTextInput() và truyền văn bản mà bạn muốn nhập để điền vào thành phần kết hợp TextField.

  1. Điền vào 10 số tiền trên hoá đơn có giá trị là TextField:
import androidx.compose.ui.test.performTextInput

@Test
fun calculate_20_percent_tip() {
    composeTestRule.setContent {
        TipTimeTheme {
            TipTimeLayout()
        }
    }
    composeTestRule.onNodeWithText("Bill Amount")
.performTextInput("10")
}
  1. Dùng cùng một phương pháp để điền vào OutlinedTextField tỷ lệ phần trăm tiền boa có giá trị là 20:
@Test
fun calculate_20_percent_tip() {
    composeTestRule.setContent {
        TipTimeTheme {
            TipTimeLayout()
        }
    }
   composeTestRule.onNodeWithText("Bill Amount")
.performTextInput("10")
   composeTestRule.onNodeWithText("Tip Percentage").performTextInput("20")
}

Sau khi điền tất cả các thành phần kết hợp TextField, tiền boa sẽ hiển thị trong thành phần kết hợp Text ở cuối màn hình trong ứng dụng.

Giờ đây, khi đã hướng dẫn kiểm thử điền các thành phần tổng hợp TextField này, bạn phải đảm bảo rằng thành phần tổng hợp Text hiển thị tiền boa đúng cùng với câu nhận định.

Trong các kiểm thử đo lường bằng Compose, tính năng xác nhận có thể được gọi trực tiếp trên các thành phần giao diện người dùng. Có một số câu nhận định nhưng trong trường hợp này, bạn nên sử dụng phương thức assertExists(). Thành phần kết hợp Text hiển thị số tiền boa dự kiến sẽ hiển thị: Tip Amount: $2.00.

  1. Đưa ra khẳng định rằng nút có văn bản đó tồn tại:
import java.text.NumberFormat

@Test
fun calculate_20_percent_tip() {
    composeTestRule.setContent {
        TipTimeTheme {
            Surface (modifier = Modifier.fillMaxSize()){
                TipTimeLayout()
            }
        }
    }
   composeTestRule.onNodeWithText("Bill Amount")
      .performTextInput("10")
   composeTestRule.onNodeWithText("Tip Percentage").performTextInput("20")
   val expectedTip = NumberFormat.getCurrencyInstance().format(2)
   composeTestRule.onNodeWithText("Tip Amount: $expectedTip").assertExists(
      "No node with this text was found."
   )
}

Chạy kiểm thử

Quy trình chạy kiểm thử đo lường cũng giống như quy trình kiểm thử cục bộ. Bạn nhấp vào các mũi tên trong rãnh bên cạnh mỗi khai báo để chạy từng kiểm thử hoặc toàn bộ lớp kiểm thử.

b435bcafc02c94ef.png

  • Nhấp vào các mũi tên bên cạnh phần khai báo lớp. Bạn có thể xem các kiểm thử chạy trên thiết bị hoặc trình mô phỏng của mình. Khi quá trình kiểm thử kết thúc, bạn sẽ thấy kết quả như trong hình ảnh này:

f878f82d3469e877.png

6. Lấy mã giải pháp

Ngoài ra, bạn có thể sao chép kho lưu trữ GitHub cho mã:

$ git clone https://github.com/google-developer-training/basic-android-kotlin-compose-training-tip-calculator.git
$ cd basic-android-kotlin-compose-training-tip-calculator
$ git checkout test_solution

7. Kết luận

Xin chúc mừng! Bạn đã viết những bài kiểm thử tự động đầu tiên của mình trong Android. Kiểm thử là một thành phần quan trọng để kiểm soát chất lượng phần mềm. Trong quá trình phát triển các ứng dụng Android, hãy nhớ viết nội dung kiểm thử song song với các tính năng của ứng dụng để đảm bảo rằng ứng dụng của bạn hoạt động chính xác trong quá trình phát triển.

Tóm tắt

  • Kiểm thử tự động là gì.
  • Tại sao kiểm thử tự động lại quan trọng.
  • Sự khác biệt giữa kiểm thử cục bộ và kiểm thử đo lường
  • Các phương pháp cơ bản hay nhất để viết kiểm thử tự động.
  • Nơi tìm và đặt các lớp kiểm tra cục bộ và dụng cụ trong một dự án Android.
  • Cách tạo phương thức kiểm thử.
  • Cách tạo lớp kiểm thử cục bộ và lớp kiểm thử đo lường
  • Cách đưa ra khẳng định trong các kiểm thử cục bộ và kiểm thử đo lường.
  • Cách sử dụng quy tắc kiểm thử.
  • Cách sử dụng ComposeTestRule để chạy ứng dụng với một bài kiểm thử.
  • Cách tương tác với thành phần kết hợp trong bài kiểm thử đo lường.
  • Cách chạy bài kiểm thử.