Polecenia powłoki urządzenia

Podczas testowania VTS komendy powłoki służą do wykonywania testowego binarnego obiektu po stronie docelowej, uzyskiwania i ustawiania właściwości, zmiennych środowiskowych oraz informacji o systemie, a także do uruchamiania i zatrzymywania platformy Android. Polecenia powłoki urządzenia VTS możesz wykonywać za pomocą polecenia adb shell lub sterownika powłoki VTS działającego na urządzeniu (zalecane).

Używanie powłoki ADB

Testy, które wymagają wyłączenia portu USB lub ponownego uruchomienia urządzenia podczas testowania, muszą używać powłoki ADB, ponieważ sterownik powłoki VTS jest niedostępny bez stałego połączenia USB. W skrypcie testowym Pythona możesz wywołać powłokę ADB za pomocą obiektu AndroidDevice. Przykłady:

  • Pobieranie obiektu urządzenia z Androidem:
    self.device = self.android_devices[0]
    
  • Wykonanie pojedynczego polecenia powłoki:
    result = self.device.adb.shell(‘ls')
    

Używanie sterownika powłoki VTS

Sterownik powłoki VTS to binarny plik agenta, który działa na urządzeniu i wykonuje polecenia powłoki. Domyślnie VTS używa sterownika powłoki, jeśli jest on uruchomiony na urządzeniu, ponieważ ta metoda ma mniejsze opóźnienie niż użycie polecenia adb shell.

Rysunek 1. Sterownik powłoki VTS.

Platforma VTS obsługuje testowanie na wielu urządzeniach, w którym każde urządzenie z Androidem jest reprezentowane jako obiekt AndroidDevice w programie Base Runner. Domyślnie framework VTS przesyła binarne pliki binarne agenta VTS i powłoki VTS do każdego urządzenia z Androidem oraz nawiązuje połączenia TCP z usługami VTS na tych urządzeniach.

Aby wykonać polecenie powłoki, skrypt Pythona po stronie hosta wywołuje funkcję obiektu ShellMirror w obiekcie AndroidDevice. Obiekt ShellMirror pakuje teksty poleceń powłoki w wiadomość protobuf i wysyła ją (przez kanał TCP) do agenta VTS na urządzeniu z Androidem. Następnie agent działający na urządzeniu przekazuje polecenie powłoki do sterownika powłoki VTS za pomocą gniazda Unix.

Gdy sterownik powłoki VTS otrzyma polecenie powłoki, wykona je za pomocą nohup w powłoce urządzenia, aby zapobiec zawieszeniu. Następnie z nohup są pobierane dane standardowe, dane standardowe o błędach i kod zwracany, a następnie wysyłane z powrotem do agenta VTS. Na koniec agent odpowiada gospodarzowi, przekazując wyniki polecenia w wiadomości protobuf.

Zalety

Zalety korzystania ze sterownika powłoki VTS zamiast adb shell:

  • Niezawodność. Sterownik powłoki VTS używa opcji nohup do wykonywania poleceń w ustawieniach domyślnych. Testy VTS to głównie testy HAL i jądra na niższym poziomie, dlatego nohup zapewnia, że polecenia powłoki nie zawieszają się podczas wykonywania.
  • Wydajność. Chociaż polecenie adb shell przechowuje w pamięci podręcznej niektóre wyniki (np. listę plików w katalogu), podczas wykonywania zadań takich jak wykonanie testowego binarnego pliku ma dodatkowy narzut na połączenie. Sterownik powłoki VTS utrzymuje aktywne połączenie przez cały czas testu, więc jedynym obciążeniem jest komunikacja USB. Podczas testów stwierdziliśmy, że użycie modułu sterownika powłoki VTS do wykonania polecenia z 100 wywołaniami pustego pliku binarnego gtest jest o około 20% szybsze niż użycie poleceniaadb shell. Rzeczywista różnica jest większa, ponieważ komunikacja z powłoką VTS jest obszernie rejestrowana.
  • Stan. Sterownik powłoki VTS obsługuje sesję terminala dla każdej nazwy terminala (domyślna nazwa terminala to default). Zmienne środowiskowe ustawione w jednej sesji terminala są dostępne tylko dla kolejnych poleceń w tej samej sesji.
  • Możliwość rozbudowy. Komunikacja za pomocą poleceń powłoki między frameworkiem VTS a sterownikiem urządzenia jest owijana w protobuf, aby umożliwić przyszłe kompresowanie, zdalne sterowanie, szyfrowanie itp. Istnieją też inne możliwości poprawy wydajności, np. parsowanie wyników po stronie urządzenia, gdy nakład komunikacji staje się większy niż parsowanie ciągu znaków wyników.

Wady

Wady używania sterownika powłoki VTS zamiast adb shell:

  • dodatkowe pliki binarne, Pliki agenta VTS muszą zostać przesłane na urządzenie i usunięte po wykonaniu testu.
  • Wymaga aktywnego połączenia. Jeśli podczas testowania nastąpi utrata połączenia TCP między hostem a agentem (na przykład z powodu odłączenia kabla USB, wyłączenia portu, awarii urządzenia itp.), to celowo lub przypadkowo nie będzie można przekazać do agenta VTS polecenia powłoki. Nawet przy automatycznym przełączeniu na stan adb shell wynik i stan polecenia przed rozłączeniem byłyby nieznane.

Przykłady

Przykłady używania poleceń w powłoce w skrypcie testowym Pythona po stronie hosta VTS:

  • Pobieranie obiektu urządzenia z Androidem:
    self.device = self.android_devices[0]
    
  • Pobieranie obiektu powłoki dla wybranego urządzenia:
    self.shell = self.device.shell
    
  • Wykonanie pojedynczego polecenia powłoki:
    results = self.shell.Execute(‘ls')
    
  • Wyświetl listę poleceń powłoki:
    results = self.shell.Execute([‘cd /data/local/tmp', ‘ls'])
    

Obiekt z wynikiem polecenia

Obiekt zwracany przez wykonanie polecenia w powłoce to słownik zawierający klucze stdouts, stderrs i return_codes. Niezależnie od tego, czy polecenie powłoki jest podawane jako pojedynczy ciąg znaków, czy jako lista ciągów poleceń, każda wartość w słowniku wyników jest zawsze listą.

Aby zweryfikować kod zwracany przez listę poleceń, skrypt testowy musi sprawdzić indeksy. Przykład:

asserts.assertFalse(any(results[‘return_codes']), ‘some command failed.')

Może on też sprawdzać każdy indeks polecenia osobno. Przykład:

asserts.assertEqual(results[‘return_codes'][0], 0, ‘first command failed')
asserts.assertEqual(results[‘return_codes'][1], 0, ‘second command failed')