Tài nguyên không đồng bộ biểu thị một hoạt động không đồng bộ mà kết quả ảnh hưởng đến các thao tác tiếp theo trong kiểm thử giao diện người dùng. Bằng cách đăng ký tài nguyên không đồng bộ với Espresso, bạn có thể xác thực các hoạt động không đồng bộ này theo cách đáng tin cậy hơn khi kiểm thử ứng dụng của bạn.
Xác định khi nào cần tài nguyên không tải
Espresso cung cấp một tập hợp
khả năng đồng bộ hoá. Chiến dịch này
của khung này, tuy nhiên, chỉ áp dụng cho các hoạt động đăng
thông báo trên MessageQueue
, chẳng hạn như lớp con của
View
đang vẽ nội dung trên màn hình.
Vì Espresso không nhận biết bất kỳ thao tác không đồng bộ nào khác, bao gồm cả những lượt chạy trên luồng trong nền, Espresso không thể đồng bộ hoá được đảm bảo trong các trường hợp đó. Để giúp Espresso nhận biết được các thao tác diễn ra trong thời gian dài, bạn phải đăng ký từng thao tác dưới dạng tài nguyên không hoạt động.
Nếu bạn không sử dụng tài nguyên không hoạt động khi kiểm thử kết quả của ứng dụng không đồng bộ, bạn có thể phải sử dụng một trong làm theo các giải pháp không phù hợp để cải thiện thử nghiệm độ tin cậy:
- Thêm lệnh gọi vào
Thread.sleep()
. Khi thêm độ trễ nhân tạo vào thử nghiệm của bạn, thì bộ thử nghiệm sẽ mất nhiều thời gian hơn hoàn tất việc thực thi và đôi khi thử nghiệm của bạn vẫn có thể không thành công khi được thực thi trên trên các thiết bị chậm hơn. Ngoài ra, độ trễ này không điều chỉnh được theo tỷ lệ phù hợp, vì có thể ứng dụng của bạn phải thực hiện công việc không đồng bộ tốn nhiều thời gian hơn trong bản phát hành sau này. - Triển khai trình bao bọc thử lại,trong đó sử dụng vòng lặp để liên tục kiểm tra xem ứng dụng của bạn vẫn đang thực hiện công việc không đồng bộ cho đến khi hết thời gian chờ. Ngay cả khi bạn chỉ định số lần thử lại tối đa trong các lần kiểm thử của mình, mỗi lần thực thi lại đều tiêu tốn tài nguyên hệ thống, đặc biệt là CPU.
- Sử dụng các bản sao của
CountDownLatch
, cho phép một hoặc nhiều luồng đợi cho đến khi một số lượng thao tác cụ thể được thực hiện được thực thi trong một chuỗi khác đã hoàn tất. Những đối tượng này yêu cầu bạn chỉ định một khoảng thời gian chờ; nếu không, ứng dụng của bạn có thể bị chặn vô thời hạn. Chốt cũng làm tăng độ phức tạp không cần thiết cho mã, khiến việc bảo trì trở nên khó khăn hơn.
Espresso giúp bạn loại bỏ những giải pháp không đáng tin cậy này khỏi quy trình kiểm thử và thay vào đó, hãy đăng ký công việc không đồng bộ của ứng dụng dưới dạng tài nguyên không hoạt động.
Các trường hợp sử dụng phổ biến
Khi thực hiện các thao tác tương tự như các ví dụ sau trong chương trình kiểm thử, hãy cân nhắc sử dụng một tài nguyên không đồng bộ:
- Tải dữ liệu từ Internet hoặc một nguồn dữ liệu cục bộ.
- Thiết lập kết nối bằng cơ sở dữ liệu và lệnh gọi lại.
- Quản lý dịch vụ, bằng cách sử dụng dịch vụ hệ thống hoặc phiên bản của
IntentService
. - Thực hiện logic nghiệp vụ phức tạp, chẳng hạn như các phép biến đổi bitmap.
Điều đặc biệt quan trọng là đăng ký các tài nguyên không hoạt động khi các hoạt động này cập nhật giao diện người dùng mà các bài kiểm thử của bạn sẽ xác thực.
Ví dụ về cách triển khai tài nguyên không đồng bộ
Danh sách sau đây mô tả một số ví dụ về cách triển khai tài nguyên không đồng bộ mà bạn có thể tích hợp vào ứng dụng:
CountingIdlingResource
- Duy trì bộ đếm các tác vụ đang hoạt động. Khi bộ đếm bằng 0, hàm được liên kết
tài nguyên sẽ được coi là không hoạt động. Chức năng này gần giống với chức năng
Semaphore
. Trong hầu hết các trường hợp, việc triển khai này đủ để quản lý công việc không đồng bộ của ứng dụng trong quá trình kiểm thử. UriIdlingResource
- Tương tự với
CountingIdlingResource
, nhưng bộ đếm cần phải bằng 0 trong một khoảng thời gian cụ thể trước khi tài nguyên sẽ được coi là không hoạt động. Thời gian chờ bổ sung này mất liên tiếp các yêu cầu mạng mà trong đó ứng dụng trong chuỗi của bạn có thể tạo một ngay sau khi nhận được phản hồi cho một yêu cầu trước đó. IdlingThreadPoolExecutor
- Cách triển khai tuỳ chỉnh của
ThreadPoolExecutor
theo dõi tổng số tác vụ đang chạy trong chuỗi đã tạo hồ bơi. Lớp này sử dụng mộtCountingIdlingResource
đến duy trì bộ đếm tác vụ đang hoạt động. IdlingScheduledThreadPoolExecutor
- Cách triển khai tuỳ chỉnh của
ScheduledThreadPoolExecutor
. Chiến dịch này cung cấp cùng một Bạn có thể sử dụng chức năng và khả năng của mình làmIdlingThreadPoolExecutor
mà còn có thể theo dõi các công việc đã được lên lịch biểu cho tương lai hoặc được lên lịch thực thi định kỳ.
Tạo tài nguyên rảnh của riêng bạn
Khi sử dụng tài nguyên không đồng bộ trong kiểm thử của ứng dụng, bạn có thể cần cung cấp quản lý hoặc ghi nhật ký tài nguyên tuỳ chỉnh. Trong những trường hợp đó, việc triển khai được liệt kê trong phần trước có thể chưa đầy đủ. Nếu trường hợp đó xảy ra, bạn có thể hãy mở rộng một trong những cách triển khai tài nguyên không đồng bộ này hoặc tự tạo.
Nếu bạn triển khai chức năng tài nguyên không đồng bộ của riêng mình, hãy giữ những mà bạn cần lưu ý, đặc biệt là phương pháp đầu tiên:
- Gọi lượt chuyển đổi sang trạng thái rảnh bên ngoài quy trình kiểm tra trạng thái rảnh.
- Sau khi ứng dụng của bạn chuyển sang trạng thái rảnh, hãy gọi
onTransitionToIdle()
ngoài bất kỳ triển khai nào củaisIdleNow()
. Bằng cách đó, Espresso không mất một giây để kiểm tra không cần thiết để xác định xem một tài nguyên đang rảnh.
Đoạn mã sau minh hoạ nội dung đề xuất này:
Kotlin
fun isIdle() { // DON'T call callback.onTransitionToIdle() here! } fun backgroundWorkDone() { // Background work finished. callback.onTransitionToIdle() // Good. Tells Espresso that the app is idle. // Don't do any post-processing work beyond this point. Espresso now // considers your app to be idle and moves on to the next test action. }
Java
public void isIdle() { // DON'T call callback.onTransitionToIdle() here! } public void backgroundWorkDone() { // Background work finished. callback.onTransitionToIdle() // Good. Tells Espresso that the app is idle. // Don't do any post-processing work beyond this point. Espresso now // considers your app to be idle and moves on to the next test action. }
- Đăng ký tài nguyên không đồng bộ trước khi bạn cần đến chúng.
Các lợi ích về việc đồng bộ hoá liên quan đến tài nguyên không hoạt động chỉ có hiệu lực sau khi Espresso gọi tài nguyên đó lần đầu tiên Phương thức
isIdleNow()
.Danh sách sau đây trình bày một vài ví dụ về tài sản này:
- Nếu bạn đăng ký tài nguyên không hoạt động trong một phương thức được chú thích bằng
@Before
, tài nguyên không đồng bộ sẽ có hiệu lực trong dòng đầu tiên của mỗi lần kiểm thử. - Nếu bạn đăng ký tài nguyên không hoạt động trong kiểm thử, tài nguyên không hoạt động sẽ có hiệu lực trong thao tác tiếp theo dựa trên Espresso. Hành vi này vẫn xảy ra ngay cả khi hành động tiếp theo nằm trong cùng một thử nghiệm như câu lệnh đăng ký tài nguyên không đồng bộ.
- Nếu bạn đăng ký tài nguyên không hoạt động trong một phương thức được chú thích bằng
- Huỷ đăng ký tài nguyên không hoạt động sau khi sử dụng xong.
Để tiết kiệm tài nguyên hệ thống, bạn nên huỷ đăng ký tài nguyên không hoạt động ngay khi có thể khi bạn không cần chúng nữa. Ví dụ: nếu bạn đăng ký một tài nguyên không hoạt động trong phương thức được chú thích bằng
@Before
, bạn nên huỷ đăng ký tài nguyên này trong phương thức tương ứng được chú thích bằng@After
.- Sử dụng sổ đăng ký không hoạt động để đăng ký và huỷ đăng ký tài nguyên không hoạt động.
Bằng cách sử dụng vùng chứa này cho tài nguyên rảnh của ứng dụng, bạn có thể đăng ký và huỷ đăng ký tài nguyên không hoạt động nhiều lần khi cần mà vẫn duy trì được tính nhất quán hành vi.
- Chỉ duy trì trạng thái đơn giản của ứng dụng trong các tài nguyên không hoạt động.
Ví dụ: các tài nguyên không đồng bộ mà bạn triển khai và đăng ký không nên chứa thông tin tham chiếu đến đối tượng
View
.
Đăng ký tài nguyên không đồng bộ
Espresso cung cấp một lớp vùng chứa để bạn có thể đặt trạng thái rảnh của ứng dụng
của chúng tôi. Lớp này, được gọi là
IdlingRegistry
là một
Cấu phần phần mềm độc lập giúp giảm mức hao tổn tối thiểu cho ứng dụng. Lớp
cho phép bạn thực hiện các bước sau để cải thiện
khả năng bảo trì:
- Tạo tham chiếu đến
IdlingRegistry
, thay vì tài nguyên rảnh mà tệp đó chứa trong các lần kiểm thử của ứng dụng. - Duy trì sự khác biệt trong tập hợp tài nguyên không hoạt động mà bạn sử dụng từng biến thể bản dựng.
- Xác định tài nguyên rảnh trong các dịch vụ của ứng dụng, thay vì trong giao diện người dùng tham chiếu đến các dịch vụ đó.
Tích hợp tài nguyên rảnh vào ứng dụng
Mặc dù bạn có thể thêm tài nguyên rảnh vào ứng dụng theo nhiều cách, nhưng một nói riêng sẽ duy trì tính đóng gói cho ứng dụng mà vẫn cho phép bạn chỉ định một thao tác cụ thể mà một tài nguyên không hoạt động nhất định biểu thị.
Phương pháp đề xuất
Khi thêm tài nguyên không đồng bộ vào ứng dụng của mình, bạn rất nên đặt logic tài nguyên không hoạt động trong chính ứng dụng và chỉ thực hiện việc đăng ký và trong kiểm thử của bạn.
Mặc dù bạn tạo ra một tình huống bất thường là sử dụng giao diện chỉ thử nghiệm trong bằng cách làm theo phương pháp này, bạn có thể bao bọc tài nguyên không hoạt động mà bạn đã có, giúp duy trì kích thước APK và số lượng phương thức của ứng dụng.
Phương pháp thay thế
Nếu bạn không muốn có logic tài nguyên không đồng bộ trong quá trình phát hành chính thức của ứng dụng bạn có thể sử dụng một số chiến lược tích hợp khả thi khác:
- Tạo các biến thể bản dựng, chẳng hạn như sản phẩm phiên bản và chỉ sử dụng tài nguyên không hoạt động trong bản gỡ lỗi của ứng dụng.
- Sử dụng một khung chèn phần phụ thuộc như Dagger để chèn trạng thái rảnh của ứng dụng biểu đồ phần phụ thuộc tài nguyên vào kiểm thử của bạn. Nếu bạn đang sử dụng Dagger 2, Việc chèn dữ liệu sẽ bắt nguồn từ một thành phần phụ.
Triển khai một tài nguyên không đồng bộ trong các kiểm thử của ứng dụng và hiển thị phần đó của quá trình triển khai ứng dụng cần được đồng bộ hoá trong các kiểm thử.
Thận trọng: Mặc dù quyết định thiết kế này có vẻ tạo một tham chiếu độc lập đến các tài nguyên không đồng bộ, nó cũng phá vỡ đóng gói trong tất cả trừ ứng dụng đơn giản nhất.
Tài nguyên khác
Để biết thêm thông tin về cách sử dụng Espresso trong quy trình kiểm thử Android, hãy tham khảo các tài nguyên sau đây.
Mẫu
- IdlingResourceSample: Đồng bộ hoá với các công việc ở chế độ nền.