Dự án: Ứng dụng Lemonade

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

Lớp học lập trình này giới thiệu một ứng dụng mới có tên Lemonade (Nước chanh) mà bạn sẽ tự xây dựng. Trong lớp học lập trình này, bạn sẽ được hướng dẫn từng bước hoàn thành dự án, bao gồm cả việc thiết lập và kiểm thử trong Android Studio.

Lớp học lập trình này khác với các lớp học khác trong khoá học này. Không giống các lớp học lập trình trước đây, lớp học lập trình này không nhằm mục đích hướng dẫn từng bước về cách xây dựng ứng dụng. Thay vào đó, lớp học hướng đến việc thiết lập một dự án mà bạn sẽ hoàn tất một cách độc lập, đồng thời đưa ra hướng dẫn về cách tự hoàn tất ứng dụng cũng như tự kiểm tra.

Thay vì đưa ra mã nguồn giải pháp, chúng tôi sẽ cung cấp một bộ công cụ kiểm thử trong ứng dụng mà bạn sẽ tải xuống. Bạn sẽ chạy các bài kiểm thử này trong Android Studio (chúng tôi sẽ hướng dẫn bạn cách thực hiện việc này sau trong lớp học lập trình) để xem mã nguồn của bạn có vượt qua được các bài kiểm thử hay không. Bạn có thể sẽ phải thử vài lần, kể cả các nhà phát triển chuyên nghiệp cũng hiếm khi vượt qua được ngay từ lượt kiểm thử đầu tiên! Sau khi mã nguồn của bạn vượt qua mọi bài kiểm thử, bạn có thể coi như dự án này đã hoàn tất.

Chúng tôi hiểu rằng có thể bạn muốn có mã nguồn giải pháp chỉ để kiểm tra lại. Chúng tôi cố ý không cung cấp mã nguồn giải pháp vì muốn bạn thực hành như một nhà phát triển chuyên nghiệp. Để làm được như vậy, có thể bạn sẽ phải vận dụng một số kỹ năng mà bạn chưa thực hành nhiều, chẳng hạn như:

  • Dùng Google để tra cứu các thuật ngữ, thông báo lỗi và các đoạn mã trong ứng dụng mà bạn thấy lạ;
  • Kiểm thử mã, đọc lỗi, sau đó điều chỉnh mã rồi kiểm thử lại;
  • Quay lại nội dung trước đó trong Bài 1 Android Basics (Kiến thức cơ bản về Android) để ôn lại kiến thức đã học;
  • So sánh mã mà bạn biết là mã hoạt động tốt (chẳng hạn như mã được cung cấp trong dự án hoặc mã giải pháp trước đây trong các ứng dụng khác ở Bài 1) với mã mà bạn đang viết.

Việc này thoạt nhìn có vẻ sẽ rất khó khăn, nhưng chúng tôi chắc chắn 100% rằng nếu bạn có thể hoàn thành Bài 1 thì bạn đã sẵn sàng cho dự án này. Hãy bình tĩnh và đừng bỏ cuộc. Bạn có thể làm được!

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

  • Dự án này dành cho những người dùng đã hoàn thành Bài 1 của khoá học Android Basics về Kotlin.

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

  • Bạn sẽ xây dựng một ứng dụng đơn giản có tên Lemonade bằng cách vận dụng các kỹ năng đã học trong Bài 1.

Bạn cần có

  • Một máy tính đã cài đặt Android Studio.

2. Tổng quan về ứng dụng

Chào mừng bạn đến với Dự án: Ứng dụng Lemonade!

Chúng tôi đã chiêu mộ bạn vào nhóm của chúng tôi để hiện thực hoá mục tiêu số hoá hoạt động pha nước chanh. Mục tiêu là tạo ra một ứng dụng đơn giản có tính tương tác dành cho thiết bị di động, cho phép bạn vắt chanh cho đến khi bạn có một cốc nước chanh. Hãy coi đây là một phép ẩn dụ hoặc có thể chỉ là một cách thú vị để giết thời gian!

Ứng dụng Lemonade sau khi hoàn thiện sẽ có một màn hình duy nhất. Trong lần đầu người dùng mở ứng dụng, ứng dụng sẽ chào đón bằng lời nhắc nhấn vào hình ảnh cây chanh để chọn một quả chanh.

1ce5b75b513d63c9.png

Khi nhấn vào cây chanh, người dùng sẽ thấy một quả chanh. Họ có thể nhấn để "vắt" quả chanh này với số lần không xác định trước (số lần vắt cần thiết sẽ được tạo ngẫu nhiên) trước khi chuyển sang màn hình tiếp theo.

fb63b41d58a83af7.png

Khi người dùng đã nhấn vắt quả chanh đủ số lần, họ sẽ thấy hình ảnh một chiếc cốc để "uống" nước chanh.

f8882c1688a0e3e7.png

Sau khi người dùng nhấp vào để uống nước chanh, chiếc cốc sẽ cạn và người dùng có thể nhấn lại vào hình ảnh để quay lại màn hình đầu tiên rồi chọn một quả chanh khác trên cây.

951918f0c2d0464.png

Ứng dụng này được xây dựng với trọng tâm là tính đơn giản và sắp xếp theo một hoạt động duy nhất. Các trạng thái của ứng dụng (cho dù người dùng chọn một quả chanh, vắt chanh, uống nước chanh và cuối cùng là cốc cạn) đều được thể hiện bằng một thứ có tên là máy trạng thái (state machine). Đây có vẻ là một thuật ngữ lý thuyết thú vị, nhưng đơn giản có thể hiểu đây là trạng thái của ứng dụng (tức là văn bản và hình ảnh mà người dùng nhìn thấy) được xác định bằng một biến có chứa trạng thái của ứng dụng (select, squeeze, v.v.). Trạng thái của ứng dụng được cập nhật, cùng với mọi biến cần thiết khác. Sau đó, giao diện người dùng sẽ được định cấu hình (thiết lập hình ảnh và văn bản) riêng biệt sau khi tất cả nội dung cập nhật được thực hiện.

Chúng tôi đã xác định cho bạn tất cả biến cho trạng thái của ứng dụng. Công việc của bạn là xây dựng bố cục của ứng dụng và triển khai logic sao cho giao diện người dùng chuyển đổi giữa từng trạng thái như dự kiến.

Kiểm thử mã nguồn của bạn

Đối với ứng dụng Lemonade (và các dự án sắp tới), bạn sẽ được cung cấp một số mã nguồn kiểm thử tự động mà bạn có thể sử dụng để xác minh liệu mã của mình có hoạt động như mong đợi hay không.

Chính xác thì kiểm thử tự động là gì? Trong quá trình phát triển phần mềm, bạn có thể coi "kiểm thử" là mã giúp xác minh rằng mã khác đang hoạt động. Quá trình này được thực hiện bằng cách kiểm tra kết quả (chẳng hạn như nội dung của các thành phần giao diện người dùng trên màn hình) để xem kết quả có hợp lý hay không dựa trên dữ liệu đầu vào, được gọi là "trường hợp kiểm thử". Dự án ban đầu cho ứng dụng Lemonade bao gồm một vài mã nguồn kiểm thử mà bạn có thể chạy để đảm bảo bạn đã triển khai logic đúng cách. Chúng ta sẽ thảo luận chi tiết hơn về mã nguồn kiểm thử trong các phần sau. Bây giờ, đã đến lúc bạn tải mã khởi đầu xuống rồi bắt đầu tạo ứng dụng Lemonade.

3. Bắt đầu

Tải mã dự án xuống

Lưu ý tên thư mục là android-basics-kotlin-lemonade-app. Chọn thư mục này khi bạn mở dự án trong Android Studio.

Để lấy mã nguồn cho lớp học lập trình này và mở đoạn mã đó trong Android Studio, hãy thực hiện các bước 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 một 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ã), 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 (thường nằm 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ở thì chuyển sang chọn tuỳ chọn File (Tệp) > Open (Mở) trong 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 (thường 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ư mong đợi.

Hãy dành chút thời gian để làm quen với dự án ban đầu. Bạn nên đặc biệt chú ý đến tệp MainActivity.kt.

4181c13884715771.png

Trong MainActivity.kt, bạn sẽ tìm thấy một số biến được dùng để thể hiện trạng thái hiện tại của ứng dụng. Bạn sẽ sử dụng các biến này trong một bước sau để tạo ra tính tương tác cho ứng dụng. Mặc dù số lượng mã ở đây có vẻ quá nhiều, nhưng bạn sẽ chỉ cần sửa đổi những mã được đánh dấu TODO. Bạn có thể xem nội dung hướng dẫn cụ thể trên các trang sau đây.

Bạn cũng sẽ nhận thấy dự án này còn bao gồm một gói khác, com.example.lemonade (androidTest).

a0c593c77b323c15.png

Trong đó có các bài kiểm thử tự động mà bạn sẽ sử dụng để xác minh xem liệu chức năng mình triển khai trong MainActivity.kt đã chính xác hay chưa. Như đã nói trên, vấn đề này sẽ được nhắc đến trong phần sau. Giờ đây, khi bạn đã sẵn sàng bắt đầu xây dựng ứng dụng, hãy bắt đầu với giao diện người dùng.

4. Xây dựng giao diện người dùng

Ứng dụng Lemonade chỉ yêu cầu bố cục cơ bản; bạn chỉ cần hai chế độ xem để triển khai tất cả chức năng của ứng dụng này.

  1. Một TextView đưa ra hướng dẫn cho người dùng.
  2. Một ImageView hiển thị hình ảnh đồ hoạ theo trạng thái hiện tại của ứng dụng (ví dụ: một quả chanh để vắt).

Bạn sẽ xây dựng bố cục này trong activity_main.xml.

554c5e1ae9ec2e42.png

Vận dụng kiến thức về trình chỉnh sửa bố cục, mục tiêu của bạn là tạo ra một bố cục tương tự như hình ảnh dưới đây, có cả hai khung hiển thị ở giữa màn hình và TextView ở trên ImageView.

54581304e678827c.png

5. Tạo ra tính tương tác cho ứng dụng

Khi bố cục đã hoàn chỉnh, hãy mở MainActivity.kt. Đây là nơi bạn sẽ triển khai toàn bộ logic của ứng dụng. Bạn sẽ nhận thấy đã có khá nhiều mã. Cũng có nhiều nhận xét được đánh dấu là // TODO: (ví dụ bên dưới). Đây là những nhiệm vụ bạn cần hoàn tất.

b6c5858a42dec80.png

Có ba việc cơ bản mà bạn cần triển khai để ứng dụng nước chanh hoạt động.

  1. Định cấu hình ImageView lemonImage để phản hồi hoạt động đầu vào của người dùng.
  2. Triển khai clickLemonImage() để cập nhật trạng thái của ứng dụng.
  3. Triển khai setViewElements() để cập nhật giao diện người dùng dựa trên trạng thái hiện tại của ứng dụng.

Chúng ta hãy cùng xem lần lượt từng nhiệm vụ.

Bước 1: Định cấu hình ImageView

Thao tác nhấn vào chế độ xem hình ảnh sẽ di chuyển ứng dụng từ trạng thái này sang trạng thái khác. Ở cuối onCreate(), hãy để ý việc phải thiết lập 2 trình nghe.

  1. setOnClickListener() sẽ cập nhật trạng thái của ứng dụng. Phương thức để thực hiện việc này là clickLemonImage().
  2. setOnLongClickListener() phản hồi những sự kiện người dùng nhấn và giữ một hình ảnh (tức là khi người dùng nhấn vào hình ảnh nhưng không nhả ngón tay ra ngay lập tức). Đối với các sự kiện nhấn và giữ, một tiện ích (còn gọi là thanh thông báo nhanh) sẽ xuất hiện ở cuối màn hình cho người dùng biết số lần họ đã vắt chanh. Phương thức thực hiện là showSnackbar().

b07b78c6b607e94d.png

Trong bước tiếp theo, bạn sẽ triển khai logic để thay đổi trạng thái của ứng dụng.

Bước 2: Triển khai clickLemonImage()

Sau khi hoàn tất bước trước đó, phương thức clickLemonImage() sẽ được gọi mỗi lần người dùng nhấn vào hình ảnh. Phương thức này chịu trách nhiệm chuyển ứng dụng từ trạng thái hiện tại sang trạng thái tiếp theo và cập nhật mọi biến nếu cần. Có 4 trạng thái khả dĩ là: SELECT, SQUEEZE, DRINKRESTART; trạng thái hiện tại được thể hiện bằng biến lemonadeState. Phương thức này cần làm gì đó riêng biệt cho từng trạng thái.

  1. SELECT: Chuyển sang trạng thái SQUEEZE, thiết lập lemonSize (số lần vắt cần thiết) bằng cách gọi phương thức pick() và đặt giá trị squeezeCount (số lần người dùng đã vắt chanh) về 0.
  2. SQUEEZE: Tăng squeezeCount thêm 1 và giảm lemonSize đi 1. Hãy nhớ rằng số lần vắt chanh cần thiết để ứng dụng chuyển đổi trạng thái có thể khác nhau. Chỉ chuyển sang trạng thái DRINK khi lemonSize mới bằng 0. Nếu không, ứng dụng sẽ vẫn duy trì trạng thái SQUEEZE.
  3. DRINK: Chuyển sang trạng thái RESTART rồi đặt lemonSize thành -1.
  4. RESTART: Chuyển về trạng thái SELECT.

Sau khi bạn đã xử lý tất cả thông tin cập nhật và chuyển đổi giữa các trạng thái, hãy nhớ gọi setViewElements() để cập nhật giao diện người dùng dựa trên trạng thái mới.

Bước 3: Triển khai setViewElements()

Phương thức setViewElements() chịu trách nhiệm cập nhật giao diện người dùng dựa trên trạng thái của ứng dụng. Văn bản và hình ảnh phải được cập nhật bằng các giá trị dưới đây để khớp với lemonadeState.

SELECT:

  • Văn bản: Click to select a lemon!
  • Hình ảnh: R.drawable.lemon_tree

SQUEEZE:

  • Văn bản: Click to juice the lemon!
  • Hình ảnh: R.drawable.lemon_squeeze

DRINK:

  • Văn bản: Click to drink your lemonade!
  • Hình ảnh: R.drawable.lemon_drink

RESTART:

  • Văn bản: Click to start again!
  • Hình ảnh: R.drawable.lemon_restart

Cách sử dụng tài nguyên chuỗi

Trong Android, hầu hết mọi thứ đều là tài nguyên. Việc xác định những tài nguyên mà sau này bạn có thể truy cập trong ứng dụng là một phần quan trọng trong quá trình phát triển Android.

Tài nguyên được dùng trong mọi việc từ xác định màu sắc, hình ảnh, bố cục, trình đơn và giá trị chuỗi. Lợi ích của việc này là không mã hoá cứng bất cứ thứ gì. Mọi thứ được xác định trong những tệp tài nguyên như vậy và sau đó có thể được tham chiếu trong mã của ứng dụng. Đơn giản nhất trong những tài nguyên này (và cũng thông dụng nhất) là việc tận dụng tài nguyên chuỗi cho văn bản linh hoạt hoặc văn bản được bản địa hoá.

Các chuỗi hoặc văn bản tĩnh có thể được lưu trữ trong một tệp riêng gọi là strings.xml trong thư mục con values thuộc thư mục res.

b65ed762eea87f2f.png

Đối với mọi đoạn văn bản mà bạn muốn hiển thị trong ứng dụng (chẳng hạn như nhãn của một nút hoặc văn bản bên trong một TextView), trước tiên, bạn nên xác định văn bản đó trong tệp res/values/strings.xml. Mỗi mục là một khoá (đại diện cho mã nhận dạng văn bản) và một giá trị (chính là văn bản). Ví dụ: nếu bạn muốn một nút hiện chữ "Submit" (Gửi), hãy thêm tài nguyên chuỗi sau vào res/values/strings.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="hello">Hello!</string>
    <string name="submit_label">Submit</string>
</resources>

Để trực tiếp truy cập vào tài nguyên trong mã nguồn của mình, bạn chỉ cần sử dụng phương thức getResources.getString() hoặc getString() để truy cập vào giá trị dựa vào mã nhận dạng tài nguyên R.string.submit_label.:

val submitText = getResources().getString(R.string.submit_label)

Để trực tiếp thiết lập văn bản trong tài nguyên chuỗi thành TextView, bạn có thể gọi setText() trên đối tượng TextView rồi truyền mã nhận dạng tài nguyên.

val infoTextView: TextView = findViewById(R.id.info_textview)

infoTextView.setText(R.string.info_text)

Tài nguyên chuỗi cũng có thể chứa các ký tự đặc biệt để định dạng văn bản. Ví dụ: Bạn có thể có một tài nguyên chuỗi cho phép bạn chèn một đoạn văn bản khác vào chuỗi đó.

<string name="ingredient_tablespoon">%1$d tbsp of %2$s</string>

Trong phần mã, bạn có thể truy cập và định dạng tài nguyên chuỗi bằng cách truyền đối số.

getResources().getString(R.string.ingredient_tablespoon, 2, "cocoa powder")

Khi khai báo tài nguyên chuỗi, mỗi đối số được đánh số theo thứ tự xuất hiện (1, 2, v.v.) và có một chữ cái để xác định loại (d cho số thập phân, s cho chuỗi, v.v.). Hệ thống có thể truyền đối số thuộc đúng loại vào lệnh gọi đến getString().

2 tbsp of cocoa powder

Để tìm hiểu thêm, hãy tham khảo tài liệu về tài nguyên chuỗi.

6. Chạy ứng dụng

Sau khi tạo giao diện người dùng của ứng dụng và triển khai hoạt động chính, đã đến lúc xem thành quả của bạn. Chạy ứng dụng bằng cách sử dụng trình đơn Run (Chạy) > Run 'app' (Chạy "ứng dụng"), khi đó trình mô phỏng sẽ chạy.

1bb3bc95726dde79.png

Lúc này ứng dụng phải có khả năng tương tác hoàn chỉnh và bạn có thể nhấn vào chế độ xem hình ảnh để chuyển đổi giữa các trạng thái.

42feefe9ebcf879c.png

Trong khi quả chanh xuất hiện trên màn hình, bạn cũng có thể thử nhấn và giữ ImageView để thấy thanh thông báo nhanh ở dưới cùng cho biết tổng số lần vắt chanh đã thực hiện. Hãy dành chút thời gian để chạy ứng dụng vài lần qua mọi trạng thái. Sau đó, hãy dành thời gian tự tưởng thưởng vì những nỗ lực của bạn!

7. Hướng dẫn kiểm thử

Kiểm thử ứng dụng

Bạn đã hoàn tất quá trình triển khai ứng dụng Lemonade, nhưng trong hoạt động phát triển phần mềm chuyên nghiệp, hiếm khi việc viết mã là bước cuối cùng. Ngoài mã nguồn xử lý ứng dụng, ứng dụng đạt mức chất lượng chuyên nghiệp cũng cần có mã nguồn kiểm thử. Đây là loại mã nguồn được chạy để xác minh rằng mã nguồn xử lý chạy đúng như dự kiến và việc thay đổi mã nguồn sẽ không tạo ra lỗi mới. Quy trình này được gọi là kiểm thử tự động. Mặc dù việc đào tạo về kiểm thử tự động nằm ngoài phạm vi của dự án này, nhưng trong ứng dụng Lemonade cũng có một số mã nguồn kiểm thử để giúp bạn xác minh rằng bạn đã triển khai dự án đúng cách. Bạn có thể coi đây là một cách để tự chấm điểm, xem liệu bạn đã vượt qua mọi yêu cầu của dự án hay chưa cũng như xem liệu còn thay đổi nào cần thiết không.

Chính xác thì "kiểm thử" là gì? Kiểm thử đơn giản là những đoạn mã được đưa vào dự án Android Studio để chạy một phần mã nguồn của ứng dụng và có thể "pass" (đạt) hoặc "fail" (không đạt) tuỳ thuộc vào việc mã của ứng dụng có hoạt động như mong đợi hay không.

Vậy bạn có thể tìm và chạy mã nguồn kiểm thử của ứng dụng ở đâu? Bạn có thể tìm thấy mã nguồn kiểm thử cho ứng dụng Lemonade trong mục tiêu (target) kiểm thử. Mục tiêu (target) chỉ là một thuật ngữ trong phát triển phần mềm về một tập hợp các lớp được gói lại với nhau. Ví dụ: ứng dụng Lemonade tồn tại trong một mục tiêu có tên là "app" trong khi mã nguồn kiểm thử tồn tại trong một mục tiêu có tên là "LemonadeTests". Mặc dù mục tiêu LemonadeTests có thể truy cập vào mã của mục tiêu app nhưng chúng hoàn toàn riêng biệt và mã nguồn của ứng dụng thì không chứa bất kỳ mã nguồn kiểm thử nào.

55f884303707e1c3.png

Khi xem các tệp ở chế độ xem "Android", tên gói mục tiêu kiểm thử sẽ giống với tên gói của ứng dụng nhưng có (androidTest) trong ngoặc đơn.

Ngoài ra, còn có một vài thuật ngữ chính mà bạn cần biết khi đề cập đến mã nguồn kiểm thử.

  • Test Suite (Bộ kiểm thử) – mục tiêu bao gồm tất cả các trường hợp kiểm thử.
  • Test Case (Trường hợp kiểm thử) – một lớp bao gồm các mã nguồn kiểm thử riêng lẻ cho chức năng có liên quan (ứng dụng Lemonade chỉ có một trường hợp kiểm thử nhưng các ứng dụng lớn hơn thường có nhiều trường hợp hơn).
  • Test (Kiểm thử) – Một hàm nhằm kiểm thử một nội dung cụ thể.

Một trường hợp kiểm thử có thể có nhiều hàm kiểm thử và bộ kiểm thử của dự án có thể có nhiều trường hợp kiểm thử.

Chạy kiểm thử

Để chạy kiểm thử, bạn có thể làm theo một trong những cách sau:

Với trường hợp kiểm thử đơn lẻ, mở một lớp trường hợp kiểm thử và nhấp vào mũi tên xanh lá ở phía bên trái phần khai báo lớp. Sau đó, chọn tuỳ chọn Run (Chạy) trên trình đơn. Thao tác này sẽ chạy tất cả các bài kiểm thử trong trường hợp kiểm thử.

6c7b133regex38ce87.png

Thông thường, bạn chỉ cần chạy một kiểm thử duy nhất, chẳng hạn như khi chỉ có một kiểm thử không đạt còn các kiểm thử khác đều đạt. Bạn có thể chạy một kiểm thử duy nhất tương tự như cách thực hiện trên toàn bộ trường hợp kiểm thử. Hãy dùng mũi tên màu xanh lục rồi chọn tuỳ chọn Run (Chạy).

59690e06230bf1e4.png

Nếu có nhiều trường hợp kiểm thử, bạn cũng có thể chạy toàn bộ bộ kiểm thử. Cũng giống như khi chạy ứng dụng, bạn có thể tìm thấy tuỳ chọn này trên trình đơn Run (Chạy).

ed1e07d2488ac446.png

Vui lòng lưu ý Android Studio sẽ mặc định chuyển đến mục tiêu cuối cùng mà bạn đã chạy (ứng dụng, mục tiêu kiểm thử, v.v.). Do đó, nếu trình đơn vẫn hiển thị Run > Run 'app' (Chạy > Chạy "ứng dụng"), thì bạn có thể chạy mục tiêu kiểm thử này bằng cách chọn Run > Run (Chạy > Chạy).

13bd962d134241aa.png

Sau đó, hãy chọn mục tiêu kiểm thử trong trình đơn bật lên.

903c7ed01fa7cebf.png

Kết quả chạy các lượt kiểm thử sẽ xuất hiện trên thẻ Run (Chạy). Trong ngăn bên trái, bạn sẽ thấy danh sách các lượt kiểm thử không đạt (nếu có). Các lượt kiểm thử không đạt được đánh dấu bằng dấu chấm than màu đỏ bên cạnh tên chức năng. Các lượt kiểm thử đạt sẽ được đánh dấu bằng dấu kiểm màu xanh lục.

37c73c4a656622af.png

Nếu kiểm thử không đạt, thì văn bản đầu ra sẽ cung cấp thông tin giúp bạn khắc phục vấn đề khiến kiểm thử không đạt.

92f3c8219c03651d.png

Ví dụ: trong thông báo lỗi ở trên, quy trình kiểm thử đang kiểm tra xem TextView có đang sử dụng một tài nguyên chuỗi cụ thể hay không. Tuy nhiên, quy trình kiểm thử không thành công. Văn bản sau "Expected" (Dự kiến) và "Got" (Đã nhận) không khớp, có nghĩa là giá trị mà kiểm thử dự kiến không khớp với giá trị từ ứng dụng đang chạy. Trong ví dụ này, chuỗi được dùng trong TextView không phải là squeeze_count trên thực tế như dự kiến của kiểm thử.

8. Không bắt buộc: Chia sẻ ứng dụng!

Sau khi bạn đã xong việc thưởng thức thật nhiều cốc nước chanh, hãy chụp ảnh màn hình yêu thích của bạn rồi chia sẻ màn hình đó lên Twitter để giới thiệu những điều bạn đã học được. Hãy gắn thẻ @AndroidDev rồi thêm hashtag #AndroidBasics.