Bài 1:
Khái niệm cơ bản về
kiểm thử ứng dụng Android
TEST VÀ TRIỂN KHAI ỨNG
DỤNG ANDROID - Bài 1
Nội dung bài học
• Các phần cần kiểm thử trong Android
• Các loại kiểm thử
• Android testing framework
• Tạo project kiểm thử
• Chạy project kiểm thử
2
Cần kiểm thử gì trong ứng dụng Android?
Lý tưởng nhất là kiểm thử mọi dòng code trong ứng dụng
Tuy nhiên, trong thực tế không cần thiết kiểm thử mọi
phương thức, ví dụ không cần kiểm thử các getter và setter
được Java Compiler sinh ra
Bên cạnh việc kiểm thử các hàm, một số khía cạnh khác
của ứng dụng Android mà chúng ta cần cân nhắc kiểm thử
Sự kiện vòng đời ứng dụng
Thao tác database và filesystem
Kiểm thử trên các loại thiết bị khác nhau
Sự kiện vòng đời ứng dụng Android
Bạn nên kiểm thử các sự kiện vòng đời của Activity để đảm
bảo các sự kiện được sử dụng hợp lý và đúng đắn
Nếu Activity của bạn lưu thông tin trạng thái của nó trong
sự kiện onPause() hoặc onDestroy() sau đó khôi phục
trong onCreate(Bundle savedInstanceState), bạn nên
kiểm tra trạng thái được lưu trữ và khôi phục chính xác
Sự kiện thay đổi cấu hình (configuration-changed event)
nên được kiểm thử. Sự kiện này được kích hoạt khi quay
thiết bị Android
Thao tác cơ sở dữ liệu và file hệ thống
Các thao tác cơ sở dữ liệu và file hệ thống nên được kiểm
thử
Các thao tác này nên được kiểm thử trong mức hệ thống
cấp thấp, hoặc cấp cao thông qua Content Provider, hoặc
kiểm thử từ chính ứng dụng
Kiểm thử trên nhiều loại thiết bị
Trước khi bàn giao phần mềm hoặc cập nhật ứng dụng lên
Google Play, bạn phải kiểm thử phần mềm trên các loại
thiết bị khác nhau để phát hiện các bất thường và đưa ra
các giải pháp thích hợp
Bạn nên kiểm thử các phần sau:
Network capabilities
Screen densities
Screen resolutions
Screen sizes
Availability of sensors
Keyboard
GPS
External storage
Các loại kiểm thử
Kiểm thử có thể xảy ra ở mọi giai đoạn trong phát triển
phần mềm
Tuy nhiên, bạn nên kiểm thử ở các giai đoạn đầu tiên, thậm
chí có thể trước khi tập hợp đầy đủ yêu cầu và trước khi
tiến hành viết mã
Có một số kiểu kiểm thử phụ thuộc vào đối tượng bị kiểm
thử. Đối với mọi loại kiểm thử, một test nên kiểm tra điều
kiện và trả về kết quả đánh giá là giá trị kiểu Boolean miêu
tả kiểm thử thành công hay thất bại
Kiểm thử đơn vị (unit test)
Kiểm thử đơn vị được viết bởi lập trình viên
Phải phân tách thành phần được kiểm thử và có thể kiểm
thử lặp đi lặp lại.
Bạn nên sử dụng mock object để phân cách unit từ
dependency của nó để giám sát tương tác, và có thể lặp lại
kiểm thử nhiều lần
Ví dụ: bạn kiểm thử thao tác xóa dữ liệu từ cơ sở dữ liệu,
bạn không muốn dữ liệu được xóa thật và dữ liệu không
được tìm thấy trong lần kiểm thử tiếp theo
JUnit là chuẩn kiểm thử đơn vị cho Android. Junit là
framework mã nguồn mở với mục đích tự động hóa kiểm
thử, được viết bởi Erich Gamma và Kent Beck
Ví dụ về kiểm thử đơn vị (unit test)
Các thành phần của test case
Test fixture định nghĩa baseline để chạy kiểm thử và được
chia sẻ bởi tất cả test case, đóng vai trò quan trọng trong
thiết kế test. Thông thường, nó là tập hợp các biến, theo
chuẩn đặt tên của Android, có tên bắt đầu bằng chữ m, ví
dụ mActivity
Phương thức setUp(): khởi tạo fixture. Ghi đè nếu bạn
muốn tạo đối tượng và khởi tạo các trường được sử dụng
bởi test. Phương thức setUp xuất hiện trước tất cả các test
Phương thức tearDown(): hoàn thành fixture. Ghi đè nếu
bạn muốn giải phóng khởi tạo các test. Phương thức
tearDown được gọi sau tất cả các test
Các test thực tế
Tất cả phương thức công khai (public method) với tên bắt
đầu bằng test được xem như là một test
Ví dụ: testValues(), testConversionError(),
testConversionToString() là các tên test hợp lệ
Trong khi thi hành các điều kiện kiểm thử, giá trị trả về của
phương thức nên được so sánh với giá trị mong đợi
Junit cung cấp các phương thức assert* để so sánh giá trị
mong muốn với kết quả thực tế và sau khi chạy sẽ ném ra
một ngoại lệ nếu điều kiện không thỏa mãn
Các test thực tế
Các phương thức có thể được nạp chồng hỗ trợ nhiều
tham số khác nhau, bao gồm:
assertEquals()
assertFalse()
assertNotNull()
assertNotSame()
assertNull()
assertSame()
assertTrue()
fail()
Android testing framework
Là một phần của môi trường phát triển ứng dụng
Cung cấp công cụ mạnh mẽ để kiểm thử mọi khía cạnh của
ứng dụng
Các đặc trưng chính của Android testing framework
Android test suite dựa trên JUnit
Sử dụng JUnit thuần túy để kiểm thử các lớp mà không
dùng Android API
Sử dụng Android JUnit Extension để kiểm thử các thành
phần Android
Các đặc trưng chính của Android testing framework
Android JUnit extension cung cấp các lớp test case hướng
thành phần.
Các lớp này cung cấp các phương thức để tạo mock object
và phương thức giúp bạn điều khiển vòng đời của một
thành phần
Test suite được chứa trong các gói kiểm thử, tương tự như
các gói ứng dụng chính do đó không cần học công cụ mới
hoặc kỹ thuật để thiết kế hoặc xây dựng test
Các đặc trưng chính của Android testing framework
Công cụ SDK để xây dựng test case và tiến hành kiểm thử
có sẵn trong Eclipse ADT, và cung cấp dạng command line
cho các IDE khác
SDK cũng cung cấp monkeyrunner, API cho kiểm thử thiết
bị sử dụng các chương trình Python và UI/Application
Exerciser Monkey, công cụ command line dùng để stresstesting UI bằng cách gửi sự kiện ngẫu nhiên tới thiết bị
Các đặc trưng chính của Android testing framework
Cấu trúc kiểm thử (test structure)
Test project được tổ chức dưới dạng cấu trúc chuẩn của
test, lớp test case, test package
Android testing dựa trên Junit, các phương thức kiểm thử
được tổ chức trong một lớp gọi là các test case (hoặc test
suite)
Mỗi test là một test độc lập của một module độc lập
Cấu trúc kiểm thử (test structure)
Trong JUnit, bạn sử dụng test runner để thi hành lớp test
Trong Android, bạn sử dụng test tool để nạp các gói test
(test package), sau đó các công cụ này thi hành test runner
cụ thể cho Android
Test project
Các lợi ích của Android tool khi tạo test project bao gồm:
Tự động thiết lập gói kiểm thử sử dụng
InstrumentationTestRunner như là test runner
Bạn phải sử dụng InstrumentationTestRunner (hoặc lớp
con) để chạy JUnit test
Sử dụng tên thích hợp cho test package. Nếu ứng dụng
phải kiểm thử có tên gói là com.mydomain.myapp thì
công cụ Android sẽ thiết lập tên gói kiểm thử là
com.mydomain.myapp.test
Tự động tạo build file, manifest file, cấu trúc thư mục của
test project
Mock object
Mock object bắt chước đối tượng được sử dụng thật thay
vì gọi các đối tượng thật để kích hoạt kiểm thử đơn vị
trong môi trường cách ly
Android testing framework cung cấp một số mock object
giúp cho việc viết kiểm thử
Một số lớp trong gói android.test.mock
MockApplication
MockContentProvider
MockContentResolver
MockContext
MockCursor
MockDialogInterface
MockPackageManager
MockResources
O
DEM
Giới thiệu Android testing Project
Kiểm thử giao diện (UI test)
Chỉ main thread có thể thay đổi UI trong Android
Chú giải @UIThreadTest được sử dụng cho kiểm thử đặc
biệt chạy trên thread có khả năng thay đổi UI
Nếu bạn muốn chạy test trên UI thread, bạn nên sử dụng
phương thức Activity.runOnUiThread(Runable r) cung
cấp Runnable tương ứng chứa chỉ dẫn test
Lớp TouchUtils trợ giúp tạo UI test cho phép sinh ra các sự
kiện gửi tới View, như:
click
drag
long click
scroll
tap
touch
Eclipse hỗ trợ Junit
Eclipse và Android ADT plugin hỗ
trợ Junit đầy đủ và cho phép tạo
Android testing project
Ví dụ: Eclipse chạy 18 test trong
20.008 giây, 0 Errors và 0 Failures
Nếu có lỗi Failure Trace sẽ hiển thị
thông tin
Các IDE khác
Các IDE khác như ItelliJ và NetBean cung cấp các plugin
tích hợp môi trường phát triển Android nhưng không hỗ
trợ Junit một cách chính thức
Nếu bạn không sử dụng IDE, bạn có thể chạy các test sử
dụng ant ()