Viết chương trình kiểm thử đo lường

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

Trong một lớp học lập trình trước, bạn đã tìm hiểu cách tạo và chạy kiểm thử đơn vị. Lớp học lập trình này sẽ tập trung vào kiểm thử đo lường. Bạn sẽ có cơ hội tìm hiểu về hình thức kiểm thử này cũng như cách thức để viết chương trình kiểm thử tương ứng.

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

  • Bạn đã tạo một dự án trong Android Studio.
  • Bạn đã có kinh nghiệm lập trình trên Android Studio.
  • Bạn đã có kinh nghiệm xử lý dự án trong Android Studio.
  • Bạn đã viết chương trình kiểm thử đơn vị đơn giản trong Android Studio.

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

  • Thế nào là kiểm thử đo lường.
  • Cách chạy chương trình kiểm thử đo lường.
  • Cách viết chương trình kiểm thử đo lường.

Bạn cần có

  • Một máy tính đã cài đặt Android Studio.
  • Mã nguồn giải pháp cho ứng dụng Tip Time.

Tải mã nguồn ban đầu xuống cho lớp học lập trình này

Trong lớp học lập trình này, bạn sẽ thêm các kiểm thử đo lường vào ứng dụng Tip Time (Tính tiền boa) từ một mã nguồn giải pháp trước đó.

Để lấy mã nguồn cho lớp học lập trình này và mở trong Android Studio, hãy làm như sau.

Lấy mã

  1. Nhấp vào URL được cung cấp. Thao tác này sẽ mở trang GitHub của dự án trong trình duyệt.
  2. Kiểm tra để đảm bảo tên nhánh khớp với tên nhánh được chỉ định trong lớp học lập trình. Ví dụ: trong ảnh chụp màn hình sau đây, tên nhánh là main (chính).

8cf29fa81a862adb.png

  1. Trên trang GitHub cho dự án này, hãy nhấp vào nút Code (Mã nguồn), một cửa sổ bật lên sẽ hiện ra.

1debcf330fd04c7b.png

  1. Trong cửa sổ bật lên, nhấp vào nút Download ZIP (Tải tệp ZIP xuống) để lưu dự án vào máy tính. Chờ quá trình tải xuống hoàn tất.
  2. Xác định vị trí của tệp trên máy tính (có thể trong thư mục Downloads (Tệp đã tải xuống).
  3. Nhấp đúp vào tệp ZIP để giải nén. Thao tác này sẽ tạo một thư mục mới chứa các tệp dự án.

Mở dự án trong Android Studio

  1. Khởi động Android Studio.
  2. Trong cửa sổ Welcome to Android Studio (Chào mừng bạn đến với Android Studio), hãy nhấp vào Open (Mở).

d8e9dbdeafe9038a.png

Lưu ý: Nếu Android Studio đã mở sẵn thì hãy chuyển sang chọn tuỳ chọn File (Tệp) > Open (Mở) trên trình đơn.

8d1fda7396afe8e5.png

  1. Trong trình duyệt tệp, hãy chuyển đến vị trí của thư mục dự án chưa giải nén (có thể nằm trong thư mục Downloads (Tệp đã tải xuống)).
  2. Nhấp đúp vào thư mục dự án đó.
  3. Chờ Android Studio mở dự án.
  4. Nhấp vào nút Run (Chạy) 8de56cba7583251f.png để tạo và chạy ứng dụng. Đảm bảo rằng ứng dụng được xây dựng như dự kiến.

2. Tổng quan về ứng dụng ban đầu

Ứng dụng Tip Time (Tính tiền boa) bao gồm một màn hình cho thấy một ô nhập liệu văn bản để người dùng nhập số tiền thanh toán, các nút chọn để chọn tỷ lệ phần trăm tiền boa và một nút lệnh tính tiền boa.

3. Tạo thư mục kiểm thử đo lường

Mã nguồn ban đầu cho lớp học lập trình này có đầy đủ chức năng, trừ chức năng kiểm thử và thư mục kiểm thử. Trước khi viết bất cứ chương trình kiểm thử nào, chúng ta cần thêm một thư mục dành cho các kiểm thử đo lường. Sau khi tải mã nguồn ban đầu xuống, hãy thực hiện các bước sau để thêm một lớp cho các kiểm thử đo lường của bạn.

  1. Cách dễ nhất để thực hiện việc này là chuyển từ chế độ xem Android sang chế độ xem Project (Dự án). Trong ngăn dự án ở trên cùng bên trái, hãy nhấp vào trình đơn Android thả xuống rồi chọn Project (Dự án).

20055afdc5d38e69.png

  1. Bây giờ, chế độ xem dự án của bạn sẽ có dạng như sau:

7e933e8dd546458e.png

  1. Nhấp vào trình đơn thả xuống đầu tiên, sau đó kéo xuống app -> src.

65dd6a80920623ef.png

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

73b014c84f89b0f0.png

  1. Bạn sẽ thấy cửa sổ này xuất hiện:

921d8a0df6310383.png

  1. Chọn androidTest/java.

c4b99c44611ae609.png

  1. Bây giờ, bạn sẽ thấy thư mục androidTest trong cấu trúc thư mục dự án.

5f6643d80a7ef0f8.png

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

8f8a590b7bdc01b3.png

  1. Khi đó bạn sẽ thấy cửa sổ này xuất hiện:

4d154746de968ccf.png

  1. Trong cửa sổ này, hãy nhập văn bản dưới đây rồi nhấn phím Return:
com.example.tiptime
  1. Cửa sổ dự án của bạn sẽ có dạng như sau:

7bb036a4bc3be441.png

  1. Cuối cùng, hãy nhấp chuột phải vào com.example.tiptime rồi chọn New (Mới) -> Kotlin Class/File (Lớp/Tệp Kotlin).

26ff162c120e18d1.png

  1. Trong cửa sổ thu được, hãy nhập CalculatorTests, chọn Class (Lớp) trong trình đơn thả xuống rồi nhấn phím Return.

4. Viết kiểm thử đo lường đầu tiên

Đã đến lúc bạn viết chương trình kiểm thử đo lường. Các bước sau đây sẽ kiểm thử chức năng tính 20% tiền boa.

  1. Mở tệp bạn vừa tạo, tệp này sẽ có dạng như sau:
package com.example.tiptime

class CalculatorTests {
}
  1. Kiểm thử đo lường cần đến công cụ ToolsationTestRunner, công cụ này giúp thực hiện kiểm thử trên một thiết bị hoặc trình mô phỏng. Có một số trình chạy đo lường khác, nhưng đối với kiểm thử này, chúng ta sẽ sử dụng trình chạy kiểm thử AndroidJUnit4. Để xác định trình chạy kiểm thử, chúng ta cần chú thích lớp này như sau:
@RunWith(AndroidJUnit4::class)
class CalculatorTests {
}

Trong trường hợp này, bạn cần thêm các lệnh nhập sau:

import androidx.test.ext.junit.runners.AndroidJUnit4
import org.junit.runner.RunWith

Mọi thứ đều đã được thiết lập xong để bạn bắt đầu viết logic kiểm thử.

  1. Ứng dụng Tip Time (Tính tiền boa) gồm một hoạt động duy nhất là MainActivity. Để tương tác với hoạt động này, trước hết, trường hợp kiểm thử của bạn phải khởi chạy hoạt động này. Hãy thêm nội dung sau đây vào lớp CalculatorTests.
@get:Rule()
val activity = ActivityScenarioRule(MainActivity::class.java)

ActivityScenarioRule thuộc Thư viện kiểm thử AndroidX (AndroidX Test library). Phương thức này yêu cầu thiết bị khởi chạy một hoạt động do nhà phát triển chỉ định. Bạn cần chú thích phương thức này bằng @get:Rule. Lệnh này chỉ định rằng quy tắc tiếp theo (trong trường hợp này là khởi chạy một hoạt động) nên thực thi trước khi thực hiện mọi kiểm thử trong lớp. Quy tắc kiểm thử là một công cụ không thể thiếu cho việc kiểm thử và dù sao thì bạn cũng sẽ học cách tự viết.

  1. Tiếp theo, bạn cần viết logic kiểm thử. Tạo một hàm có tên là calculate_20_percent_tip() rồi chú thích hàm này bằng @Test.
@Test
fun calculate_20_percent_tip() {
}

Espresso

Khóa học này chủ yếu sẽ sử dụng Espresso cho việc kiểm thử đo lường. Espresso là một thư viện có sẵn cho các dự án được tạo bằng Android Studio. Thư viện này cho phép bạn tương tác với thành phần giao diện người dùng thông qua mã nguồn.

Đến nay, có thể bạn đã nhận thấy Android Studio hỗ trợ rất nhiều tính năng tự động hoàn thành. Một trong những khó khăn khi làm việc với Espresso là các phương thức sẽ không tự động hoàn thành nếu chưa nhập thư viện này. Việc này có thể gây khó khăn khi sử dụng các phương thức trong Espresso nếu không nghiên cứu tài liệu. Xuyên suốt các bài học, chúng tôi sẽ cung cấp cho bạn các phương thức cần thiết để hoàn thành các chương trình kiểm thử.

Trước tiên, bạn cần viết mã để nhập số tiền thanh toán trong ô nhập liệu văn bản Cost of Service (Phí dịch vụ). Chuyển đến app -> src -> main -> res -> layout -> activity_main.xml, gán mã nhận dạng của TextInputEditTextcost_of_service_edit_text. Sao chép tên mã nhận dạng. Chúng ta sẽ sử dụng thông tin này sau trong quá trình kiểm thử.

a113fb63b50f7674.png

Triển khai hàm kiểm thử

Bây giờ, bạn có thể viết logic kiểm thử trong hàm calculate_20_percent_tip() trong lớp kiểm thử.

  1. Bước đầu tiên là sử dụng hàm onView() để tìm một thành phần giao diện người dùng để tương tác, trong trường hợp này là TextInputEditText. Hàm onView() có tham số là đối tượng ViewMatcher. Về cơ bản, ViewMatcher là một thành phần giao diện người dùng phù hợp với một tiêu chí cụ thể nào đó. Trong trường hợp này ViewMatcher là một thành phần giao diện có mã nhận dạng là R.id.cost_of_service_edit_text.

Hàm withId() trả về ViewMatcher (một thành phần giao diện người dùng có mã nhận dạng là mã được truyền vào). onView() trả về một ViewInteraction. Đây là đối tượng chúng ta có thể tương tác như thể chúng ta đang kiểm soát thiết bị. Để nhập văn bản, hãy gọi perform() trên ViewInteraction. Sau đó, perform() sẽ lấy đối tượng ViewAction. Có một số phương thức trả về ViewAction nhưng hiện tại chúng ta sẽ sử dụng phương thức typeText(). Trong activity_main.xml, chúng ta có thể thấy mức tính tiền boa mặc định là 20%. Do vậy, hiện tại bạn không cần chỉ ra mức tính tiền boa cần chọn.

onView(withId(R.id.cost_of_service_edit_text))
    .perform(typeText("50.00"))
onView(withId(R.id.cost_of_service_edit_text))
    .perform(typeText("50.00"))
    .perform(ViewActions.closeSoftKeyboard())
  1. Bây giờ, trường văn bản đã được nhập và bạn cần nhấp vào nút lệnh Calculate (Tính tiền) trong chương trình kiểm thử. Mã nguồn cho thao tác này sẽ tương tự như mã nguồn dùng cho thao tác nhập dữ liệu văn bản ở trên. Do thành phần giao diện người dùng bây giờ là nút lệnh nên tên mã nhận dạng truyền vào hàm withText() sẽ khác. Tuy nhiên, điểm khác biệt duy nhất trong cách tiếp cận này thể hiện ở ViewAction; trong đó hàm click() sẽ được dùng thay cho typeText().
onView(withId(R.id.calculate_button))
    .perform(click())
  1. Cuối cùng, bạn cần xác nhận xem số tiền boa đã hiện chính xác hay chưa. Chúng ta dự kiến số tiền boa sẽ là 10 đô la. Đối với kiểm thử này, hãy đảm bảo rằng TextView có mã nhận dạng tip_result sẽ chứa giá trị tiền boa dự kiến dưới dạng chuỗi.
onView(withId(R.id.tip_result))
    .check(matches(withText(containsString("$10.00"))))

Chọn các lệnh nhập sau đây khi được nhắc:

import androidx.test.espresso.assertion.ViewAssertions.matches
import org.hamcrest.Matchers.containsString

Ở đây, bạn sử dụng một tương tác khác có tên check(), với tham số là ViewAssertion. Bạn có thể xem ViewAssertion là một đối tượng xác nhận Espresso đặc biệt dùng cho thành phần giao diện người dùng. Đối tượng này xác nhận nội dung của TextView trùng khớp với chuỗi văn bản "$10.00".

Trước khi chạy chương trình kiểm thử này, hãy đảm bảo các lệnh nhập và mã nguồn của bạn được viết chính xác như dưới đây (không có vấn đề gì nếu thứ tự lệnh nhập của bạn khác với mã nguồn này):

package com.example.tiptime

import androidx.test.espresso.Espresso.onView
import androidx.test.espresso.action.ViewActions.click
import androidx.test.espresso.action.ViewActions.typeText
import androidx.test.espresso.assertion.ViewAssertions.matches
import androidx.test.espresso.matcher.ViewMatchers.withId
import androidx.test.espresso.matcher.ViewMatchers.withText
import androidx.test.ext.junit.rules.ActivityScenarioRule
import androidx.test.ext.junit.runners.AndroidJUnit4
import org.hamcrest.Matchers.containsString
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith

@RunWith(AndroidJUnit4::class)
class CalculatorTests {

   @get:Rule()
   val activity = ActivityScenarioRule(MainActivity::class.java)

   @Test
   fun calculate_20_percent_tip() {
       onView(withId(R.id.cost_of_service_edit_text))
           .perform(typeText("50.00"))

       onView(withId(R.id.calculate_button)).perform(click())

       onView(withId(R.id.tip_result))
           .check(matches(withText(containsString("$10.00"))))
   }
}

Nếu bạn đang sử dụng trình mô phỏng, hãy chắc chắn rằng bạn có thể nhìn thấy đồng thời cả trình mô phỏng và cửa sổ Android Studio. Chạy chương trình kiểm thử tương tự như cách bạn chạy kiểm thử đơn vị (bằng cách nhấp chuột phải vào nút mũi tên màu đỏ/xanh lục ở bên trái của hàm này rồi chọn tuỳ chọn đầu tiên) và xem điều gì sẽ xảy ra!

36684dfa8a17a2c9.gif

Bạn có thể thấy rằng chương trình kiểm thử được thực thi như thể ai đó đang tương tác với ứng dụng!

5. Mở rộng Bộ kiểm thử của bạn

Xin chúc mừng! Bạn đã hoàn thành chương trình kiểm thử đo lường đầu tiên!

Nếu muốn thử thách chính mình, bạn có thể mở rộng bộ kiểm thử bằng cách thêm các hàm kiểm thử cho các mức phần trăm tiền boa khác. Bạn có thể sử dụng cùng một định dạng hàm như đã viết ở trên, chỉ cần thay đổi phần mã nguồn để chọn các mức phần trăm khác và thay đổi giá trị truyền vào containsString() cho từng kết quả dự kiến. Hãy nhớ rằng bạn còn có tuỳ chọn làm tròn. Bạn có thể bật/tắt nút chuyển làm tròn tiền boa bằng cách tìm thành phần này theo mã nhận dạng, như đã minh hoạ cho onView(withId()) rồi nhấp vào thành phần này.

6. Mã nguồn giải pháp

7. Tóm tắt

  • Android Studio sẽ tạo các lớp kiểm thử cần thiết khi tạo dự án. Tuy nhiên, nếu nhận thấy một dự án không có lớp kiểm thử nào, bạn có thể tự tạo các lớp này.
  • Quy tắc kiểm thử sẽ chạy trước mỗi lượt kiểm thử trong một lớp kiểm thử.
  • Espresso là một thành phần cơ bản trong kiểm thử đo lường. Thư viện này cho phép tương tác với thành phần giao diện người dùng thông qua mã nguồn.

Đây là một bài học dài, hãy tự tưởng thưởng vì thành quả của bạn!

8. Tìm hiểu thêm