Polecenia powłoki urządzenia

Podczas testowania VTS polecenia powłoki służą do wykonania pliku binarnego testu po stronie docelowej, pobrania/ustawienia właściwości, zmiennych środowiskowych i informacji o systemie oraz do uruchomienia/zatrzymania środowiska Androida. Polecenia powłoki urządzenia VTS można wykonywać za pomocą polecenia adb shell lub sterownika powłoki VTS działającego na urządzeniu (zalecane).

Użyj powłoki ADB

Testy wymagające wyłączenia portu USB lub ponownego uruchomienia urządzenia podczas testowania muszą korzystać z powłoki ADB, ponieważ sterownik powłoki VTS jest niedostępny bez stałego połączenia USB. Możesz wywołać powłokę ADB z obiektu AndroidDevice w skrypcie testowym Pythona. Przykłady:

  • Zdobądź obiekt urządzenia z Androidem:
    self.device = self.android_devices[0]
    
  • Wydaj pojedynczą komendę powłoki:
    result = self.device.adb.shell(‘ls')
    

Użyj sterownika powłoki VTS

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

Rysunek 1. Sterownik powłoki VTS.

Struktura VTS obsługuje testowanie na wielu urządzeniach, gdzie każde urządzenie z systemem Android jest reprezentowane jako obiekt AndroidDevice w podstawowym programie uruchamiającym. Domyślnie platforma VTS przesyła pliki binarne agenta VTS i sterownika powłoki VTS do każdego urządzenia z systemem Android i ustanawia połączenia TCP z agentami VTS na tych urządzeniach.

Aby wykonać polecenie powłoki, skrypt Pythona po stronie hosta wywołuje funkcję do obiektu ShellMirror wewnątrz obiektu AndroidDevice. Obiekt ShellMirror pakuje teksty poleceń powłoki do wiadomości protobuf i wysyła ją (poprzez kanał TCP) do agenta VTS na urządzeniu z systemem Android. Agent działający na urządzeniu przekazuje następnie polecenie powłoki do sterownika powłoki VTS za pośrednictwem gniazda Unix.

Gdy sterownik powłoki VTS otrzyma polecenie powłoki, wykonuje je za pośrednictwem Nohup w powłoce urządzenia, aby zapobiec zawieszeniu się. Stdout, stderr i kod powrotu są następnie pobierane z nohup i wysyłane z powrotem do agenta VTS. Na koniec agent odpowiada hostowi, zawijając wyniki polecenia w komunikat protobuf .

Zalety

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

  • Niezawodność. Sterownik powłoki VTS używa nohup do wykonywania poleceń przy ustawieniach domyślnych. Ponieważ testy VTS to głównie testy HAL i jądra niższego poziomu, nohup zapewnia, że ​​polecenia powłoki nie zawieszają się podczas wykonywania.
  • Wydajność . Chociaż polecenie adb shell buforuje niektóre wyniki (takie jak wyświetlanie listy plików w katalogu), powoduje obciążenie połączenia podczas wykonywania zadań, takich jak wykonywanie testowego pliku binarnego. Sterownik powłoki VTS utrzymuje aktywne połączenie przez cały test, więc jedynym obciążeniem jest komunikacja USB. W naszych testach użycie sterownika powłoki VTS do wykonania polecenia zawierającego 100 wywołań do pustego pliku binarnego gtest jest około 20 procent szybsze niż użycie adb shell ; rzeczywista różnica jest większa, ponieważ komunikacja powłoki VTS wymaga obszernego rejestrowania.
  • Utrzymanie stanu . Sterownik powłoki VTS utrzymuje sesję terminala dla każdej nazwy terminala (domyślna nazwa terminala to domyślna ). Zmienne środowiskowe ustawione w jednej sesji terminala są dostępne tylko dla kolejnych poleceń w tej samej sesji.
  • Możliwość przedłużenia . Komunikacja poleceń powłoki pomiędzy platformą VTS a sterownikiem urządzenia jest opakowana w protobuf, aby umożliwić potencjalną kompresję, komunikację zdalną, szyfrowanie itp. w przyszłości. Dostępne są również inne możliwości poprawy wydajności, w tym analizowanie wyników po stronie urządzenia, gdy obciążenie komunikacyjne staje się większe niż analizowanie ciągów wynikowych.

Niedogodności

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

  • Dodatkowe pliki binarne . Pliki agenta VTS należy przesłać na urządzenie i wyczyścić po wykonaniu testu.
  • Wymaga aktywnego połączenia . Jeśli połączenie TCP pomiędzy hostem a agentem zostanie utracone podczas testowania (z powodu odłączenia USB, zamknięcia portu, awarii urządzenia itp.), celowo lub nieumyślnie, polecenie powłoki nie może zostać przesłane do agenta VTS. Nawet przy automatycznym przełączeniu na adb shell wynik i stan polecenia przed rozłączeniem byłyby nieznane.

Przykłady

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

  • Zdobądź obiekt urządzenia z Androidem:
    self.device = self.android_devices[0]
    
  • Pobierz obiekt powłoki dla wybranego urządzenia:
    self.shell = self.device.shell
    
  • Wydaj pojedynczą komendę powłoki:
    results = self.shell.Execute(‘ls')
    
  • Wydaj listę poleceń powłoki:
    results = self.shell.Execute([‘cd /data/local/tmp', ‘ls'])
    

Obiekt wyniku polecenia

Obiektem zwracanym po wykonaniu polecenia powłoki jest słownik zawierający klucze stdouts , stderrs i return_codes . Niezależnie od tego, czy polecenie powłoki jest podane jako pojedynczy ciąg znaków, czy jako lista ciągów poleceń, każda wartość słownika wynikowego jest zawsze listą.

Aby zweryfikować kod powrotu listy poleceń, skrypt testowy musi sprawdzić indeksy. Przykład:

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

Alternatywnie skrypt może sprawdzić indeks każdego polecenia indywidualnie. Przykład:

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