Kiểm thử nhiều người dùng

Trang này mô tả các khía cạnh quan trọng của việc kiểm thử nhiều người dùng trên nền tảng Android. Để biết thông tin về cách triển khai tính năng hỗ trợ nhiều người dùng, hãy xem phần Hỗ trợ nhiều người dùng.

Đường dẫn thiết bị

Bảng sau đây liệt kê một số đường dẫn thiết bị và cách giải quyết các đường dẫn đó. Tất cả giá trị trong cột Path (Đường dẫn) đều là bộ nhớ cát dành riêng cho người dùng. Chuyện về bộ nhớ của Android đã thay đổi theo thời gian; hãy đọc tài liệu về Bộ nhớ để biết thêm thông tin.

Đường dẫn Đường dẫn hệ thống (không bắt buộc) Mục đích
/data/user/{userId}/{app.path} /data/data Bộ nhớ ứng dụng
/storage/emulated/{userId} /sdcard Bộ nhớ trong dùng chung
/data/media/{userId} none Dữ liệu về nội dung nghe nhìn của người dùng (ví dụ: nhạc, video)
/data/system/users/{userId} none Cấu hình/trạng thái hệ thống trên mỗi người dùng

Chỉ các ứng dụng hệ thống mới có thể truy cập

Dưới đây là ví dụ về cách sử dụng đường dẫn dành riêng cho người dùng:

# to access user 10's private application data for app com.bar.foo:
$ adb shell ls /data/user/10/com.bar.foo/

hoạt động tương tác với adb giữa người dùng

Một số lệnh adb sẽ hữu ích khi xử lý nhiều người dùng. Một số lệnh trong số này chỉ được hỗ trợ trên Android 9 trở lên:

  • adb shell am instrument --user <userId> chạy một kiểm thử đo lường đối với một người dùng cụ thể. Theo mặc định, phương thức này sử dụng người dùng hiện tại.
  • adb install --user <userId> cài đặt một gói cho một người dùng cụ thể. Để đảm bảo rằng một gói được cài đặt cho tất cả người dùng, bạn phải gọi gói này cho mọi người dùng.
  • adb uninstall --user <userId> gỡ cài đặt một gói cho một người dùng cụ thể. Gọi mà không có cờ --user để gỡ cài đặt cho tất cả người dùng.
  • adb shell am get-current-user nhận mã nhận dạng người dùng hiện tại (nền trước).
  • adb shell pm list users nhận danh sách tất cả người dùng hiện tại.
  • adb shell pm create-user tạo một người dùng mới, trả về mã nhận dạng.
  • adb shell pm remove-user xoá một người dùng cụ thể theo mã nhận dạng.
  • adb shell pm disable --user <userId> tắt một gói cho một người dùng cụ thể.
  • adb shell pm enable --user <userId> bật một gói cho một người dùng cụ thể.
  • adb shell pm list packages --user <userId> liệt kê các gói (-e đối với gói đã bật, -d đối với gói đã tắt) cho một người dùng cụ thể. Theo mặc định, mục này luôn liệt kê cho người dùng hệ thống.

Thông tin sau đây giúp giải thích cách adb hoạt động với nhiều người dùng:

  • adb (hoặc chính xác hơn là trình nền adbd) luôn chạy dưới dạng người dùng hệ thống (mã nhận dạng người dùng = 0) bất kể người dùng nào hiện tại. Do đó, các đường dẫn thiết bị phụ thuộc vào người dùng (chẳng hạn như /sdcard/) luôn phân giải dưới dạng người dùng hệ thống. Hãy xem phần Đường dẫn thiết bị để biết thêm thông tin chi tiết.

  • Nếu bạn không chỉ định người dùng mặc định, thì mỗi lệnh con adb sẽ có một người dùng khác nhau. Phương pháp hay nhất là truy xuất mã nhận dạng người dùng bằng am get-current-user, sau đó sử dụng --user <userId> một cách rõ ràng cho bất kỳ lệnh nào hỗ trợ mã đó. Cờ người dùng rõ ràng không được hỗ trợ cho tất cả các lệnh cho đến Android 9.

  • Quyền truy cập vào các đường dẫn /sdcard của người dùng phụ sẽ bị từ chối kể từ Android 9. Hãy xem phần Trình cung cấp nội dung cho dữ liệu nhiều người dùng để biết thông tin chi tiết về cách truy xuất tệp trong quá trình kiểm thử.

Nhà cung cấp nội dung cho dữ liệu nhiều người dùng

adb chạy dưới dạng người dùng hệ thống và dữ liệu được đưa vào hộp cát trong Android 9 trở lên, nên bạn phải sử dụng trình cung cấp nội dung để đẩy hoặc lấy mọi dữ liệu kiểm thử từ người dùng không phải hệ thống. Bạn không cần làm việc này nếu:

  • adbd đang chạy dưới dạng thư mục gốc (thông qua adb root). Bạn chỉ có thể thực hiện việc này bằng cách sử dụng bản dựng userdebug hoặc usereng.

  • Bạn đang sử dụng ITestDevice của Liên đoàn Thương mại (Tradefed's) để đẩy hoặc kéo các tệp, trong trường hợp đó, hãy sử dụng đường dẫn /sdcard/ trong cấu hình kiểm thử của bạn (ví dụ: xem mã nguồn cho pushFile trong NativeDevice.java).

Khi một trình cung cấp nội dung đang chạy trong người dùng phụ, bạn có thể truy cập vào trình cung cấp đó bằng cách sử dụng lệnh adb shell content với user, uri và các tham số khác được chỉ định.

Giải pháp cho nhà phát triển ứng dụng

Tương tác với các tệp kiểm thử bằng adb content và một thực thể của ContentProvider thay vì lệnh push hoặc pull.

  1. Tạo một thực thể của ContentProvider do ứng dụng lưu trữ. Thực thể này có thể phân phát và lưu trữ tệp khi cần. Sử dụng bộ nhớ trong của ứng dụng.
  2. Sử dụng các lệnh adb shell content read hoặc write để đẩy hoặc kéo tệp.

Giải pháp cho tệp đa phương tiện

Để đẩy các tệp nội dung nghe nhìn vào phân vùng nội dung nghe nhìn của thẻ SD, hãy sử dụng MediaStore API công khai. Ví dụ:

# push MVIMG_20190129_142956.jpg to /storage/emulated/10/Pictures
# step 1
$ adb shell content insert --user 10 --uri content://media/external/images/media/ --bind _display_name:s:foo.jpg

# step 2
$ adb shell content query --user 10 --projection _id --uri content://media/external/images/media/ --where "_display_name=\'foo.jpg\'"

# step 3
$ adb shell content write --user 10 --uri content://media/external/images/media/8022 < MVIMG_20190129_142956.jpg

Cài đặt trình cung cấp nội dung chung

Cài đặt và sử dụng một nhà cung cấp nội dung hiện có để đọc và ghi tệp vào đường dẫn /sdcard dành riêng cho người dùng.

Tạo TradefedContentProvider.apk từ nguồn bằng cách sử dụng make TradefedContentProvider:

```
# install content provider apk
$ adb install --user 10 -g TradefedContentProvider.apk

# pull some_file.txt
$ adb shell content read --user 10 --uri content://android.tradefed.contentprovider/sdcard/some_file.txt > local_file.txt

# push local_file.txt
$ adb shell content write --user 10 --uri content://android.tradefed.contentprovider/sdcard/some_file.txt < local_file.txt
```

Hỗ trợ nhiều người dùng trong Trade Federation

Tradefed là bộ kiểm thử Android chính thức. Phần này tóm tắt một số tính năng hỗ trợ tích hợp của Tradefed cho các trường hợp kiểm thử nhiều người dùng.

Trình kiểm tra trạng thái

Trình kiểm tra trạng thái hệ thống (SSC) được chạy trước các trình chuẩn bị mục tiêu và quy trình dọn dẹp sẽ được chạy sau các trình chuẩn bị đó.

UserChecker được xác định rõ ràng để hỗ trợ nhà phát triển khi kiểm thử nhiều người dùng. Phương thức này theo dõi xem một kiểm thử có thay đổi trạng thái của người dùng trên thiết bị hay không (ví dụ: tạo người dùng mà không xoá người dùng đó trong quá trình tháo dỡ). Ngoài ra, nếu bạn đặt user-cleanup, công cụ này sẽ tự động cố gắng dọn dẹp sau quá trình kiểm thử, mà vẫn cung cấp các lỗi hữu ích để có thể khắc phục quá trình kiểm thử.

<system_checker class="com.android.tradefed.suite.checker.UserChecker" >
    <option name="user-cleanup" value="true" />
</system_checker>

Người chuẩn bị mục tiêu

Trình chuẩn bị mục tiêu thường được dùng để thiết lập một thiết bị có cấu hình cụ thể. Trong trường hợp kiểm thử nhiều người dùng, bạn có thể sử dụng trình chuẩn bị để tạo người dùng thuộc một loại cụ thể cũng như chuyển sang người dùng khác.

Đối với các loại thiết bị không có người dùng phụ, bạn có thể sử dụng CreateUserPreparer để tạo và chuyển sang người dùng phụ trong AndroidTest.xml. Khi kết thúc kiểm thử, trình chuẩn bị sẽ chuyển về và xoá người dùng phụ.

<target_preparer
  class="com.google.android.tradefed.targetprep.CreateUserPreparer" >
</target_preparer>

Nếu kiểu người dùng mà bạn muốn đã có trên thiết bị, hãy sử dụng SwitchUserTargetPreparer để chuyển sang người dùng hiện có. Các giá trị phổ biến cho user-type bao gồm system hoặc secondary.

<target_preparer
  class="com.android.tradefed.targetprep.SwitchUserTargetPreparer">
    <option name="user-type" value="secondary" />
</target_preparer>

Kiểm thử do máy chủ điều khiển

Trong một số trường hợp, kiểm thử cần chuyển đổi người dùng trong phạm vi kiểm thử. Đừng chuyển đổi từ trong khung kiểm thử phía thiết bị, chẳng hạn như UI Automator, vì quá trình kiểm thử có thể bị tắt bất cứ lúc nào. Thay vào đó, hãy sử dụng khung kiểm thử phía máy chủ như Khung kiểm thử do máy chủ điều khiển của Tradefed. Khung này cấp quyền truy cập vào ITestDevice, cho phép người dùng thực hiện mọi thao tác cần thiết.

Sử dụng UserChecker (được mô tả trong phần Trình kiểm tra trạng thái) cho các kiểm thử do máy chủ điều khiển thay đổi trạng thái người dùng vì nó đảm bảo rằng kiểm thử sẽ dọn dẹp đúng cách sau khi kiểm thử.