Perintah shell perangkat

Selama pengujian VTS, perintah shell digunakan untuk mengeksekusi biner pengujian sisi target, untuk mendapatkan/menetapkan properti, variabel lingkungan, dan informasi sistem, serta untuk memulai/menghentikan framework Android. Anda dapat menjalankan perintah shell perangkat VTS menggunakan perintah adb shell atau driver shell VTS yang berjalan di perangkat (direkomendasikan).

Menggunakan shell ADB

Pengujian yang memerlukan penonaktifan port USB atau memulai ulang perangkat selama pengujian harus menggunakan shell ADB karena driver shell VTS tidak tersedia tanpa koneksi USB yang persisten. Anda dapat memanggil shell ADB dari objek AndroidDevice dalam skrip pengujian Python. Contoh:

  • Mendapatkan objek perangkat Android:
    self.device = self.android_devices[0]
    
  • Berikan satu perintah shell:
    result = self.device.adb.shell(‘ls')
    

Menggunakan driver shell VTS

Driver shell VTS adalah biner agen yang berjalan di perangkat dan menjalankan perintah shell. Secara default, VTS menggunakan driver shell jika driver berjalan di perangkat karena metode ini memiliki latensi yang lebih rendah daripada menggunakan perintah adb shell.

Gambar 1. Driver shell VTS.

Framework VTS mendukung pengujian multiperangkat dengan setiap perangkat Android direpresentasikan sebagai objek AndroidDevice di runner dasar. Secara default, framework VTS akan mendorong agen VTS dan biner driver shell VTS ke setiap perangkat Android dan membuat koneksi TCP ke agen VTS di perangkat tersebut.

Untuk mengeksekusi perintah shell, skrip Python sisi host membuat panggilan fungsi ke objek ShellMirror di dalam objek AndroidDevice. Objek ShellMirror memaketkan teks perintah shell ke dalam pesan protobuf dan mengirimkannya (melalui saluran TCP) ke agen VTS di perangkat Android. Agen yang berjalan di perangkat kemudian meneruskan perintah shell ke driver shell VTS melalui soket Unix.

Saat menerima perintah shell, driver shell VTS akan mengeksekusi perintah melalui nohup di shell perangkat untuk mencegah error. Stdout, stderr, dan kode return kemudian diambil dari nohup dan dikirim kembali ke agen VTS. Terakhir, agen akan membalas host dengan menggabungkan hasil perintah ke dalam pesan protobuf.

Kelebihan

Keuntungan menggunakan driver shell VTS, bukan adb shell, meliputi:

  • Keandalan. Driver shell VTS menggunakan nohup untuk mengeksekusi perintah pada setelan default. Karena pengujian VTS sebagian besar adalah pengujian kernel dan HAL level rendah, nohup memastikan perintah shell tidak berhenti berfungsi selama eksekusi.
  • Performa. Meskipun perintah adb shell menyimpan cache beberapa hasil (seperti mencantumkan file dalam direktori), perintah ini memiliki overhead koneksi saat melakukan tugas seperti menjalankan biner pengujian. Driver shell VTS mempertahankan koneksi aktif selama pengujian sehingga satu-satunya overhead adalah komunikasi USB. Dalam pengujian kami, menggunakan driver shell VTS untuk mengeksekusi perintah dengan 100 panggilan ke biner gtest kosong sekitar 20 persen lebih cepat daripada menggunakan adb shell; perbedaan sebenarnya lebih besar karena komunikasi shell VTS memiliki logging yang ekstensif.
  • Pemeliharaan status. Driver shell VTS mempertahankan sesi terminal untuk setiap nama terminal (nama terminal default adalah default). Variabel lingkungan yang ditetapkan dalam satu sesi terminal hanya tersedia untuk perintah berikutnya dalam sesi yang sama.
  • Dapat diperluas. Komunikasi perintah shell antara framework VTS dan driver perangkat digabungkan dalam protobuf untuk memungkinkan potensi kompresi, remote, enkripsi, dll. di masa mendatang. Kemungkinan lain untuk meningkatkan performa juga tersedia, termasuk penguraian hasil sisi perangkat saat overhead komunikasi menjadi lebih besar daripada penguraian string hasil.

Kekurangan

Kekurangan menggunakan driver shell VTS, bukan adb shell, meliputi:

  • Biner tambahan. File agen VTS harus dikirim ke perangkat dan dibersihkan setelah eksekusi pengujian.
  • Memerlukan koneksi aktif. Jika koneksi TCP antara host dan agen terputus selama pengujian (karena pemutusan koneksi USB, penonaktifan port, error perangkat, dll.) baik secara sengaja maupun tidak sengaja, perintah shell tidak dapat dikirim ke agen VTS. Meskipun dengan pengalihan otomatis ke adb shell, hasil dan status perintah sebelum pemutusan koneksi tidak akan diketahui.

Contoh

Contoh penggunaan perintah shell dalam skrip pengujian Python sisi host VTS:

  • Mendapatkan objek perangkat Android:
    self.device = self.android_devices[0]
    
  • Dapatkan objek shell untuk perangkat yang dipilih:
    self.shell = self.device.shell
    
  • Berikan satu perintah shell:
    results = self.shell.Execute(‘ls')
    
  • Berikan daftar perintah shell:
    results = self.shell.Execute([‘cd /data/local/tmp', ‘ls'])
    

Objek hasil perintah

Objek yang ditampilkan dari eksekusi perintah shell adalah kamus yang berisi kunci stdouts, stderrs, dan return_codes. Terlepas dari apakah perintah shell diberikan sebagai string tunggal atau daftar string perintah, setiap nilai kamus hasil selalu berupa daftar.

Untuk memverifikasi kode yang ditampilkan dari daftar perintah, skrip pengujian harus memeriksa indeks. Contoh:

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

Atau, skrip dapat memeriksa setiap indeks perintah satu per satu. Contoh:

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