Trong chương này, bạn sẽ có cái nhìn tổng quan về testing Android, đồng thời tìm hiểu về cách tạo và chạy testing unit cục bộ trong Android Studio với JUnit.
Về testing
Mặc dù bạn có một ứng dụng biên dịch và chạy và trông theo cách bạn muốn trên các thiết bị khác nhau, bạn phải đảm bảo rằng ứng dụng sẽ hoạt động theo cách bạn mong đợi trong mọi tình huống, đặc biệt là khi ứng dụng phát triển và thay đổi. Ngay cả khi bạn cố gắng testing ứng dụng của mình theo cách thủ công mỗi khi bạn thực hiện thay đổi — tốt nhất là một khách hàng tiềm năng tẻ nhạt — bạn có thể bỏ lỡ điều gì đó hoặc không lường trước được những gì người dùng cuối có thể làm với ứng dụng khiến ứng dụng bị lỗi.
Viết và chạy các bài testing là một phần quan trọng của quá trình phát triển phần mềm. Phát triển theo hướng testing (TDD) là một triết lý phát triển phần mềm phổ biến đặt testing làm cốt lõi của tất cả quá trình phát triển phần mềm cho một ứng dụng hoặc dịch vụ.
testing mã có thể giúp bạn phát hiện sớm các vấn đề trong quá trình phát triển — khi chúng ít tốn kém nhất để giải quyết — và cải thiện độ chắc chắn của mã khi ứng dụng ngày càng lớn hơn và phức tạp hơn. Với các testing trong mã, bạn có thể thực hiện các phần nhỏ của ứng dụng một cách riêng biệt và theo cách có thể tự động hóa và lặp lại để testing hiệu quả hơn.
Mã bạn viết để testing ứng dụng của mình không có trong phiên bản sản xuất của ứng dụng; nó chỉ tồn tại trên máy phát triển, cùng với mã ứng dụng trong Android Studio.
Các bài viết liên quan:
Các loại testing
Android hỗ trợ một số loại testing và khung testing khác nhau. Hai hình thức testing cơ bản mà Android Studio hỗ trợ là testing unit cục bộ và testing công cụ.
Các bài testing unit cục bộ là các bài testing được biên dịch và chạy hoàn toàn trên máy cục bộ với Máy ảo Java (JVM). Sử dụng các bài testing unit cục bộ để testing các phần của ứng dụng (chẳng hạn như logic nội bộ) không cần quyền truy cập vào khung Android hoặc thiết bị hoặc trình mô phỏng hỗ trợ Android hoặc những phần mà bạn có thể tạo giả mạo (“giả” hoặc sơ khai ) các đối tượng giả vờ hoạt động giống như các đối tượng tương đương của khung.
Các bài testing công cụ là các bài testing chạy trên thiết bị hoặc trình mô phỏng hỗ trợ Android. Các bài testing này có quyền truy cập vào khung Android và thông tin về Công cụ như Ngữ cảnh của ứng dụng. Bạn có thể sử dụng các bài testing công cụ để testing unit, testing giao diện người dùng (UI) hoặc testing tích hợp, đảm bảo rằng các thành phần của ứng dụng tương tác chính xác với các ứng dụng khác. Thông thường nhất, bạn sử dụng các bài testing công cụ để testing giao diện người dùng, cho phép bạn testing xem ứng dụng có hoạt động chính xác hay không khi người dùng tương tác với ứng dụng hoặc nhập một đầu vào cụ thể.
Đối với hầu hết các hình thức testing giao diện người dùng, bạn sử dụng khung Espresso, cho phép bạn viết các bài testing giao diện người dùng tự động. Bạn sẽ tìm hiểu về các bài testing dụng cụ và Espresso trong một chương khác.
Unit Testing
Bài testing unit phải là bài testing cơ bản trong chiến lược testing ứng dụng. Bằng cách tạo và chạy các bài testing unit đối với mã, bạn có thể xác minh rằng logic của các vùng hoặc unit mã chức năng riêng lẻ là chính xác. Chạy testing unit sau mỗi lần xây dựng giúp bạn nắm bắt và khắc phục các sự cố do thay đổi mã gây ra cho ứng dụng.
Một bài testing unit thường thực hiện chức năng của unit mã nhỏ nhất có thể (có thể là một phương thức, lớp hoặc thành phần) theo cách có thể lặp lại. Tạo các bài testing unit khi bạn cần xác minh logic của mã cụ thể trong ứng dụng của mình. Ví dụ: nếu bạn testing unit một lớp, bài testing có thể testing xem lớp đó có ở trạng thái phù hợp hay không. Đối với một phương thức, bạn có thể testing hành vi của nó đối với các giá trị khác nhau của các tham số của nó, đặc biệt là null.
Thông thường, bạn testing unit mã một cách riêng biệt và máy testing chỉ thay đổi unit đó. Bạn có thể sử dụng một khung mô phỏng như Mockito để cách ly unit của mình khỏi các phụ thuộc của nó. Bạn cũng có thể viết các bài testing unit của mình cho Android trong JUnit 4, một khung testing unit phổ biến cho mã Java.
Thư viện hỗ trợ testing Android
Thư viện hỗ trợ testing Android cung cấp cơ sở hạ tầng và API để testing ứng dụng Android, bao gồm hỗ trợ cho JUnit 4. Với thư viện hỗ trợ testing, bạn có thể xây dựng và chạy mã testing cho ứng dụng của mình.
Bạn có thể đã cài đặt Thư viện hỗ trợ testing Android với Android Studio. Để testing Kho lưu trữ hỗ trợ Android, hãy làm theo các bước sau:
- Trong Android Studio, chọn Tools > Android > SDK Manager
- Nhấp vào SDK Tools và tìm Kho lưu trữ hỗ trợ.
- Nếu cần, hãy cập nhật hoặc cài đặt thư viện.
Các lớp Thư viện hỗ trợ testing Android nằm trong gói android.support.test. Ngoài ra còn có các API testing cũ hơn trong android.test. Trước tiên, bạn nên sử dụng các thư viện hỗ trợ, khi được lựa chọn giữa các thư viện hỗ trợ và các API cũ hơn, vì các thư viện hỗ trợ giúp xây dựng và phân phối các bài testing theo cách sạch sẽ và đáng tin cậy hơn là viết mã trực tiếp dựa trên chính API.
Thiết lập testing
Để chuẩn bị cho dự án để testing trong Android Studio, bạn cần:
- Tổ chức các bài testing trong một tập hợp nguồn.
- Định cấu hình project t’s Gradle phụ thuộc để bao gồm các API liên quan đến testing.
Android Studio source sets
Bộ nguồn là tập hợp mã trong dự án dành cho các mục tiêu xây dựng khác nhau hoặc các “hương vị” khác của ứng dụng. Khi Android Studio tạo dự án, nó sẽ tạo ba bộ nguồn cho bạn:
- Bộ main source set cho mã và tài nguyên của ứng dụng.
- Bộ nguồn (testing), dành cho các testing unit cục bộ của ứng dụng. Bộ nguồn hiển thị (testing) sau tên gói.
- Bộ nguồn (androidTest), dành cho các bài testing thiết bị Android. Bộ nguồn hiển thị (androidTest) sau tên gói.
- Bộ nguồn xuất hiện trong ngăn Android Studio Project> Android dưới tên gói cho ứng dụng. Bộ nguồn chính chỉ bao gồm tên gói. Bộ nguồn testing và androidTest có tên gói theo sau tương ứng là (testing) hoặc (androidTest). Bộ nguồn testing mặc định
Các bộ nguồn này tương ứng với các thư mục trong thư mục src cho dự án. Ví dụ: các tệp cho bộ nguồn testing được đặt trong src / test / java.
Định cấu hình Gradle cho các phụ thuộc testing
Để sử dụng các API testing unit, bạn có thể cần phải định cấu hình các phần phụ thuộc cho dự án của mình. Tệp xây dựng Gradle mặc định, được cung cấp bởi các mẫu Hoạt động, chẳng hạn như mẫu Hoạt động trống, bao gồm một số phần phụ thuộc này, nhưng bạn có thể cần thêm các phần phụ thuộc khác cho các tính năng testing bổ sung, chẳng hạn như các khuôn khổ so khớp hoặc mô phỏng.
Trong tệp build.gradle (Module: app) của dự án ứng dụng, phần phụ thuộc sau phải được bao gồm (nếu không, bạn nên thêm nó):
testImplementation ‘junit:junit:4.12’
Các phụ thuộc android Test Implementation được yêu cầu để testing giao diện người dùng với Espresso, được mô tả trong một chương khác:
androidTestImplementation ‘com.android.support.test:runner:1.0.1’
androidTestImplementation
‘com.android.support.test.espresso:espresso-core:3.0.1’
Lưu ý rằng số phiên bản cho các thư viện này có thể đã thay đổi. Nếu Android Studio báo cáo một thư viện mới hơn, hãy cập nhật số để phản ánh phiên bản hiện tại.
Bạn cũng có thể muốn thêm các phần phụ thuộc cho các trình so khớp Hamcrest tùy chọn và khung Mokito:
testCompile ‘org.hamcrest:hamcrest-library:1.3’
testCompile ‘org.mockito:mockito-core:1.10.19’
Sau khi chỉnh sửa tệp build.gradle (Module: app), bạn phải đồng bộ hóa dự án của mình để tiếp tục. Nhấp vào Đồng bộ hóa ngay trong Android Studio khi được nhắc.
Định cấu hình testing runner
Người chạy thử là một thư viện hoặc một bộ công cụ cho phép testing xảy ra và kết quả được in vào nhật ký. Dự án Android có quyền truy cập vào trình chạy testing JUnit cơ bản như một phần của các API JUnit4. Thư viện hỗ trợ testing Android bao gồm một trình chạy testing cho các bài testing dụng cụ và Espresso, AndroidJUnitRunner, cũng hỗ trợ JUnit 3 và 4.
testInstrumentationRunner “android.support.test.runner.AndroidJUnitRunner”
Chương này trình bày trình chạy mặc định cho các bài testing unit, được cung cấp bởi các mẫu Hoạt động, chẳng hạn như mẫu Hoạt động trống. Trong tệp build.gradle (Module: app) của dự án ứng dụng, trình chạy testing sau đây phải đã được bao gồm trong phần defaultConfig (nếu không, bạn nên thêm nó):
Tạo và chạy testing unit
Tạo các bài testing unit dưới dạng tệp Java chung bằng cách sử dụng các API JUnit 4 và lưu trữ các bài testing đó trong bộ nguồn (testing). Mỗi mẫu dự án Android Studio bao gồm bộ nguồn này và một tệp testing Java mẫu có tên là ExampleUnitTest.
Tạo một lớp testing mới
Để tạo tệp lớp testing mới, hãy thêm tệp Java vào bộ nguồn (testing) cho dự án. Các tệp lớp testing để testing unit thường được đặt tên cho lớp trong ứng dụng mà bạn đang testing, với “testing” được thêm vào. Ví dụ: nếu bạn có một lớp được gọi là Máy tính trong ứng dụng của mình, thì lớp cho các bài testing unit sẽ là Máy tính.
Để thêm tệp lớp testing mới, hãy làm theo các bước sau:
- Mở rộng thư mục java và thư mục cho bộ nguồn testing của ứng dụng. Các tệp lớp testing unit hiện có được hiển thị.
- Nhấp chuột phải (hoặc Control khi nhấp chuột) vào thư mục bộ nguồn testing và chọn New > Java Class.
- Đặt tên cho tệp và nhấp vào OK.
Viết bài testing
Sử dụng cú pháp JUnit 4 và chú thích để viết các bài testing. Ví dụ: lớp testing được hiển thị bên dưới bao gồm các chú thích sau:
Chú thích @RunWith cho biết người chạy thử sẽ được sử dụng cho các bài testing trong lớp này.
Chú thích @SmallTest chỉ ra rằng đây là một testing nhỏ (và nhanh).
Chú thích @Before đánh dấu một phương pháp là thiết lập cho testing.
Chú thích @Test đánh dấu một phương pháp là một testing thực tế.
Để biết thêm thông tin về chú thích JUnit, hãy xem Tham chiếu API JUnit 4.
@RunWith(JUnit4.class)
@SmallTest
public class CalculatorTest {
private Calculator mCalculator;
// Set up the environment for testing
@Before
public void setUp() {
mCalculator = new Calculator();
}
// test for simple addition
@Test
public void addTwoNumbers() {
double resultAdd = mCalculator.add(1d, 1d);
assertThat(resultAdd, is(equalTo(2d)));
}
}
Phương thức addTwoNumbers () là phương thức thực tế NS. Phần quan trọng của bài testing unit là xác nhận, được định nghĩa ở đây bằng phương thức khẳng định (). Các khẳng định là các biểu thức phải đánh giá và cho kết quả là giá trị true để testing vượt qua. Để biết thêm thông tin về các xác nhận, hãy xem tài liệu tham khảo JUnit cho lớp Assert.
JUnit 4 cung cấp một số phương thức khẳng định, nhưng khẳng định thì () là linh hoạt nhất, vì nó cho phép các phương thức so sánh có mục đích chung được gọi là đối sánh. Khung Hamcrest thường được sử dụng cho những người so khớp (“Hamcrest” là một phép đảo ngữ cho những người so khớp). Hamcrest bao gồm một số lượng lớn các phương pháp so sánh cũng như cho phép bạn viết bài của riêng mình. Để biết thêm thông tin về khung Hamcrest, hãy xem trang chủ Java Hamcrest.
Lưu ý rằng phương thức addTwoNumbers () trong ví dụ này chỉ bao gồm một xác nhận. Quy tắc chung cho các testing unit là cung cấp một phương pháp testing riêng biệt cho mọi khẳng định riêng lẻ. Việc nhóm nhiều xác nhận vào một phương pháp có thể khiến các bài testing khó gỡ lỗi hơn nếu chỉ một xác nhận không thành công và che khuất các bài testing thành công.
Chạy testing
Để chạy các bài testing unit cục bộ, hãy làm theo các bước sau:
- Để chạy một bài testing, hãy nhấp chuột phải (hoặc Control khi nhấp vào) phương pháp testing đó và chọn Run.
- Để testing tất cả các phương pháp trong một lớp testing, hãy bấm chuột phải (hoặc bấm Control khi bấm) vào tệp testing trong ngăn Android> Dự án và chọn Chạy.
- Để chạy tất cả các bài testing trong một thư mục, nhấp chuột phải (hoặc Control khi nhấp chuột) vào thư mục và chọn Chạy testing.
- Dự án xây dựng, nếu cần và chế độ xem testing xuất hiện ở cuối màn hình. Nếu tất cả các testing bạn đã chạy đều thành công, thanh tiến trình ở đầu chế độ xem sẽ chuyển sang màu xanh lục. Một thông báo trạng thái ở chân trang cũng báo cáo “Các bài testing đã đạt.”