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 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. Câu chuyện về bộ nhớ của Android đã thay đổi theo thời gian; đọ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 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ố các lệnh này chỉ được hỗ trợ trong Android 9 và cao hơn:

  • adb shell am instrument --user <userId> chạy một bài 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ể. Người nhận đả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 lệnh 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 (hay chính xác hơn là trình nền adbd) luôn chạy dưới dạng hệ thống user (mã nhận dạng người dùng = 0) bất kể người dùng hiện tại là người dùng nào. Do đó, thiết bị các đường dẫn phụ thuộc vào người dùng (chẳng hạn như /sdcard/) luôn phân giải là người dùng hệ thống. Xem bài viết Đườ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. Cách hay nhất là truy xuất mã nhận dạng người dùng bằng am get-current-user, sau đó là hãy sử dụng --user <userId> một cách rõ ràng cho mọi lệnh hỗ trợ lệnh này. 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). Điều này chỉ có thể thực hiện 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 minh thương mại (Tradefed) để đẩy hoặc kéo các tệp, trong trường hợp này, hãy sử dụng đường dẫn /sdcard/ trong cấu hình kiểm thử (ví dụ: xem mã nguồn cho pushFile trong NativeDevice.java).

Khi trình cung cấp nội dung đang chạy trong người dùng phụ, bạn có thể truy cập trình cung cấp đó bằng cách bằng lệnh adb shell content với user, uri và các thông 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 thân mến! 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ữ, có thể phân phát và lưu trữ các tệp khi cần. 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 tệp phương tiện vào phân vùng phương tiện của thẻ SD, hãy sử dụng API công khai MediaStore. 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 trình cung cấp nội dung hiện có có chức năng đọ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 của Liên đoàn Thương mại

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 trình chuẩn bị mục tiêu và quá trình dọn dẹp của chúng đượ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 thử nghiệm nhiều người dùng. Chiến dịch này theo dõi liệu thử nghiệm 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 cần loại bỏ từng người dùng). Ngoài ra, nếu user-cleanup được thiết lập, hệ thống sẽ tự động tìm cách dọn dẹp sau khi kiểm tra, trong khi vẫn cung cấp các lỗi hữu ích để thử nghiệm có thể được sửa.

<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 có thể sử dụng trình chuẩn bị kiểm thử nhiều người dùng để 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 loại người dùng mà bạn muốn đã tồn tại 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 quá trình 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 phía máy chủ khung thử nghiệm như Thử nghiệm do máy chủ lưu trữ của Tradefeed khung, Công cụ này cấp quyền truy cập vào ITestDevice, cho phép thao tác đối với người dùng nếu cần.

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ử.