Testowanie wielu użytkowników

Na tej stronie opisujemy ważne aspekty testowania na platformie Android z udziałem wielu użytkowników. Informacje o wdrażaniu obsługi wielu użytkowników znajdziesz w artykule Obsługa wielu użytkowników.

Ścieżki urządzeń

W tabeli poniżej znajdziesz kilka ścieżek urządzeń i sposoby ich rozwiązywania. Wszystkie wartości w kolumnie Ścieżka to piaskownica pamięci masowej użytkownika. Sposób przechowywania danych na Androidzie zmieniał się z czasem. Więcej informacji znajdziesz w dokumentacji Pamięć.

Ścieżka Ścieżka systemowa (opcjonalnie) Cel
/data/user/{userId}/{app.path} /data/data Pamięć aplikacji
/storage/emulated/{userId} /sdcard Wewnętrzna pamięć współdzielona
/data/media/{userId} brak dane multimedialne użytkownika (np. muzyka, filmy);
/data/system/users/{userId} brak Konfiguracja/stan systemu dla każdego użytkownika

Dostępne tylko dla aplikacji systemowych

Oto przykład użycia ścieżki dostosowanej do użytkownika:

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

interakcje z reklamami między użytkownikami

Podczas pracy z wieloma użytkownikami przydatnych jest kilka poleceń adb. Niektóre z tych poleceń są obsługiwane tylko na Androidzie 9 i nowszych:

  • adb shell am instrument --user <userId> przeprowadza test z instrumentacją na konkretnym użytkowniku. Domyślnie używany jest bieżący użytkownik.
  • adb install --user <userId> instaluje pakiet dla konkretnego użytkownika. Aby mieć pewność, że pakiet zostanie zainstalowany dla wszystkich użytkowników, musisz wywołać tę funkcję w przypadku każdego z nich.
  • adb uninstall --user <userId> odinstalowuje pakiet dla konkretnego użytkownika. Wywołaj bez flagi --user, aby odinstalować aplikację u wszystkich użytkowników.
  • adb shell am get-current-user pobiera identyfikator bieżącego użytkownika (na pierwszym planie).
  • adb shell pm list users otrzymuje listę wszystkich obecnych użytkowników.
  • adb shell pm create-user tworzy nowego użytkownika i zwraca jego identyfikator.
  • adb shell pm remove-user usuwa określonego użytkownika według identyfikatora.
  • adb shell pm disable --user <userId> wyłącza pakiet dla konkretnego użytkownika.
  • adb shell pm enable --user <userId> włącza pakiet dla konkretnego użytkownika.
  • adb shell pm list packages --user <userId> wyświetla pakiety (-e – włączone, -d – wyłączone) dla konkretnego użytkownika. Domyślnie zawsze wyświetla listę użytkownika systemu.

Poniższe informacje pomogą Ci zrozumieć, jak adb działa w przypadku wielu użytkowników:

  • adb (a dokładniej demon adbd) zawsze działa jako użytkownik systemowy (identyfikator użytkownika = 0) niezależnie od tego, który użytkownik jest aktualnie zalogowany. Ścieżki urządzeń zależne od użytkownika (np. /sdcard/) są zawsze rozpoznawane jako użytkownik systemu. Więcej informacji znajdziesz w sekcji Ścieżki urządzeń.

  • Jeśli nie podasz domyślnego użytkownika, każdy podkomenda adb będzie miała innego użytkownika. Sprawdzoną metodą jest pobieranie identyfikatora użytkownika za pomocą funkcji am get-current-user, a następnie jawne używanie funkcji --user <userId> w przypadku każdego polecenia, które ją obsługuje. Jawne flagi użytkownika nie były obsługiwane w przypadku wszystkich poleceń do Androida 9.

  • Dostęp do ścieżek /sdcard użytkowników dodatkowych jest odmawiany od Androida 9. Szczegółowe informacje o tym, jak pobierać pliki podczas testowania, znajdziesz w artykule Dostawca treści dla danych wielu użytkowników.

Dostawca treści dla danych wielu użytkowników

Ponieważ adb działa jako użytkownik systemu, a dane są odizolowane w Androidzie 9 i nowszych wersjach, do przesyłania lub pobierania danych testowych od użytkownika innego niż systemowy musisz używać dostawców treści. Nie jest to konieczne, jeśli:

  • adbd działa jako użytkownik root (za pomocą adb root), co jest możliwe tylko w przypadku kompilacji userdebug lub usereng.

  • Do przesyłania plików używasz Trade Federation (Tradefed)ITestDevice. W takim przypadku w konfiguracji testu używaj ścieżek /sdcard/ (np. zobacz kod źródłowy pushFileNativeDevice.java).

Gdy dostawca treści działa na koncie dodatkowego użytkownika, możesz uzyskać do niego dostęp za pomocą polecenia adb shell content z odpowiednimi parametrami user, uri i innymi.

Obejście problemu dla deweloperów aplikacji

Do interakcji z plikami testowymi używaj adb content i instancji ContentProvider zamiast polecenia push lub pull.

  1. Utwórz instancję ContentProvider hostowaną przez aplikację, która może obsługiwać i przechowywać pliki w razie potrzeby. korzystać z pamięci wewnętrznej aplikacji;
  2. Użyj poleceń adb shell content read lub write, aby wypchnąć lub pobrać pliki.

Obejście problemu z plikami multimedialnymi

Aby przesłać pliki multimedialne do partycji multimedialnej na karcie SD, użyj publicznych interfejsów API MediaStore. Na przykład:

# 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

Instalowanie ogólnego dostawcy treści

Zainstaluj i używaj istniejącego dostawcy treści, który odczytuje i zapisuje pliki w ścieżce /sdcard przypisanej do użytkownika.

Skompiluj bibliotekę TradefedContentProvider.apk ze źródła za pomocą polecenia 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
```

Obsługa wielu użytkowników w Trade Federation

Tradefed to oficjalne jarzmo testowe Androida. W tej sekcji znajdziesz podsumowanie wbudowanej obsługi scenariuszy testów wielodostępnych w Tradefed.

Sprawdzanie stanu

Sprawdzanie stanu systemu jest przeprowadzane przed przygotowaniem miejsca docelowego, a czyszczenie jest przeprowadzane po przygotowaniu miejsca docelowego.

UserChecker jest zdefiniowany w sposób jawny, aby ułatwić programistom testowanie wielu użytkowników. Śledzi, czy test zmienił stan użytkowników na urządzeniu (np. utworzył użytkowników bez usuwania ich w fazie końcowej). Jeśli ustawiona jest wartość user-cleanup, po zakończeniu testu automatycznie następuje próba wyczyszczenia, ale nadal wyświetlane są przydatne błędy, dzięki czemu można naprawić test.

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

Przygotowywanie danych docelowych

Przygotowywanie urządzeń docelowych służy zwykle do konfigurowania urządzenia w określony sposób. W przypadku testów z udziałem wielu użytkowników osoby przygotowujące mogą tworzyć użytkowników określonego typu, a także przełączać się na innych użytkowników.

W przypadku urządzeń, które nie mają użytkownika dodatkowego, możesz użyć CreateUserPreparer, aby utworzyć użytkownika dodatkowego i przełączyć się na niego w AndroidTest.xml. Po zakończeniu testu osoba przygotowująca wraca do poprzedniego użytkownika i usuwa użytkownika dodatkowego.

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

Jeśli typ użytkownika, którego chcesz użyć, jest już na urządzeniu, użyj SwitchUserTargetPreparer, aby przełączyć się na istniejącego użytkownika. Typowe wartości w przypadku parametru user-type to system lub secondary.

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

Testy sterowane przez hosta

W niektórych przypadkach test musi przełączać użytkowników w ramach testu. Nie przełączaj się w ramach platformy testowej po stronie urządzenia, np. UI Automator, ponieważ proces testowania może zostać w każdej chwili zakończony. Zamiast tego użyj platformy testowej po stronie hosta, takiej jak platforma testowa oparta na hoście Tradefed, która daje dostęp do ITestDevice, co umożliwia dowolną manipulację użytkownika.

W przypadku testów sterowanych przez hosta, które zmieniają stan użytkownika, używaj UserChecker (opisano w sekcji Sprawdzanie stanu), ponieważ zapewnia to prawidłowe czyszczenie po zakończeniu testu.