Testowanie wielu użytkowników

Na tej stronie opisano ważne aspekty testowania wielu użytkowników na Platforma Androida. 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 sposobów ich rozwiązywania. Wszystkie wartości w kolumnie Ścieżka odnoszą się do miejsca na dane w piaskownicy zależnej od użytkownika. Sposób wykorzystania miejsca na dane w Androidzie zmienia się z czasem. przeczytaj Miejsce na dane.

Ścieżka Ścieżka systemowa (opcjonalna) Cel
/data/user/{userId}/{app.path} /data/data Pamięć aplikacji
/storage/emulated/{userId} /sdcard Udostępniona pamięć wewnętrzna
/data/media/{userId} brak dane multimedialne użytkownika (np. muzyka, filmy);
/data/system/users/{userId} brak Konfiguracja/stan systemu na użytkownika

Dostępne tylko dla aplikacji systemowych

Oto przykład użycia ścieżki dla konkretnego 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 ADB między użytkownikami

W przypadku kontaktu z wieloma użytkownikami przydaje się kilka poleceń adb. Niektóre z tych poleceń są obsługiwane tylko w Androidzie 9 i nowszych:

  • adb shell am instrument --user <userId> przeprowadza test z instrumentacją przeciwko konkretnemu użytkownikowi. Domyślnie jest używany bieżący użytkownik.
  • adb install --user <userId> instaluje pakiet dla konkretnego użytkownika. Aby mieć pewność, że pakiet jest zainstalowany dla wszystkich użytkowników, musisz wywołać tę funkcję dla każdego z nich.
  • adb uninstall --user <userId> odinstalowuje pakiet dla określonego użytkownika. Wywołaj bez flagi --user, aby odinstalować aplikację dla wszystkich użytkowników.
  • adb shell am get-current-user pobiera identyfikator bieżącego (pierwszego) użytkownika.
  • adb shell pm list users pobiera listę wszystkich istniejących 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 w przypadku określonego użytkownika.
  • adb shell pm enable --user <userId> włącza pakiet dla określonego użytkownika.
  • adb shell pm list packages --user <userId> wyświetla listę pakietów (-e dla włączona, -d – wyłączona) dla określonego użytkownika. Domyślnie jest tak zawsze dla użytkownika systemowego.

Poniżej znajdziesz informacje o tym, jak działa adb w przypadku wielu użytkowników:

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

  • Jeśli nie określisz domyślnego użytkownika, każda komenda podrzędna 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życie funkcji --user <userId> w przypadku dowolnego polecenia, które ją obsługuje. Dopiero od Androida 9 flagi użytkownika nie były obsługiwane w przypadku wszystkich poleceń.

  • Odmowa dostępu do /sdcard ścieżek użytkowników pomocniczych od Android 9. Szczegółowe informacje o pobieraniu plików podczas testowania znajdziesz w artykule Dane wielu użytkowników – dostawca treści.

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

Ponieważ w Androidzie 9 lub nowszym adb działa jako użytkownik systemu, a dane znajdują się w piaskownicy, musisz korzystać z dostawców treści, aby przekazywać pobrać żadnych danych testowych od użytkownika niesystemowego. Nie jest to konieczne, jeśli:

  • Działanie adbd jest uruchomione jako użytkownik root (przez adb root), co jest możliwe tylko przy użyciu Kompilacje: userdebug lub usereng.

  • Używasz federacji handlowej (Tradefed's). ITestDevice aby je wypchnąć lub pobrać. W takim przypadku użyj w teście ścieżek /sdcard/ config (zobacz kod źródłowy elementu pushFile w NativeDevice.java).

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

Obejście dla deweloperów aplikacji

Wejdź w interakcję z plikami testowymi, używając funkcji adb content i instancji ContentProvider zamiast polecenia push lub pull.

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

Sposób obejścia problemu w przypadku plików multimedialnych

Aby przekazać pliki multimedialne na partycję multimediów na karcie SD, użyj publicznego MediaStore API. 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żyj istniejącego dostawcy treści, który odczytuje i zapisze pliki na ścieżce /sdcard określonej dla danego użytkownika.

Utwórz TradefedContentProvider.apk na podstawie źródła za pomocą 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 przez federację handlową

Tradefed to oficjalne narzędzie do testowania Androida. W tej sekcji znajdziesz podsumowanie niektórych wbudowanych obsługę scenariuszy testowania z udziałem wielu użytkowników

Sprawdzanie stanu

Sprawdzający stan systemu (SSC) są wykonywane przed docelowymi modułami przygotowującymi, a ich czyszczenie jest wykonywane po tych modułach.

UserChecker jest zdefiniowany w sposób jawny, aby ułatwić programistom testowanie z udziałem wielu użytkowników. Śledzi czy test zmienił stan użytkowników na urządzeniu (np. utworzonych użytkowników bez usuwania ich podczas demontażu). Ponadto, jeśli user-cleanup jest skonfigurowany, po zakończeniu testu automatycznie podejmuje próbę wyczyszczenia, podając przydatne błędy, które umożliwiają naprawienie testu.

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

Przygotowujący cel

Przygotowanie do kierowania jest zwykle wykorzystywane do konfiguracji urządzenia konfiguracji. W przypadku testów z udziałem wielu użytkowników osoby przygotowujące mogą służyć do tworzenia użytkowników określonego typu oraz przełączania się między nimi.

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

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

Jeśli wybrany typ użytkownika już istnieje na urządzeniu, kliknij SwitchUserTargetPreparer, aby przełączyć się na tego użytkownika. Typowe wartości w polu 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łączyć użytkowników w ramach testu. Nie przełączaj się z ramy testowej po stronie urządzenia, takiej jak UI Automator, ponieważ proces testowania może zostać przerwany w dowolnym momencie. Zamiast tego użyj danych po stronie hosta platformę testową, taką jak test oparty na hostowaniu firmy Tradefed platformy, który daje dostęp do ITestDevice, co pozwala na dowolną manipulację.

Używaj UserChecker (opisanego w funkcji sprawdzania stanu) w przypadku testów sterowanych przez hosta, które zmieniają stan użytkownika, ponieważ zapewnia to prawidłowe wyczyszczenie po teście.