Perintah Shell Perangkat

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

Menggunakan cangkang ADB

Pengujian yang memerlukan mematikan port USB atau mem-boot 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:

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

Menggunakan driver shell VTS

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

Gambar 1. Driver shell VTS.

Kerangka kerja VTS mendukung pengujian multi-perangkat di mana setiap perangkat Android direpresentasikan sebagai objek AndroidDevice di runner dasar. Secara default, kerangka kerja VTS mendorong agen VTS dan binari driver shell VTS ke setiap perangkat Android dan membuat koneksi TCP ke agen VTS di perangkat tersebut.

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

Ketika driver shell VTS menerima perintah shell, itu mengeksekusi perintah melalui nohup pada shell perangkat untuk mencegah hang. Stdout, stderr, dan kode pengembalian kemudian diambil dari nohup dan dikirim kembali ke agen VTS. Terakhir, agen membalas host dengan membungkus hasil perintah menjadi pesan protobuf .

Keuntungan

Keuntungan menggunakan driver shell VTS daripada adb shell meliputi:

  • Keandalan. Driver shell VTS menggunakan nohup untuk menjalankan perintah pada pengaturan default. Karena tes VTS sebagian besar adalah tes HAL dan kernel tingkat yang lebih rendah, nohup memastikan perintah shell tidak hang selama eksekusi.
  • Kinerja . Sementara perintah adb shell menyimpan beberapa hasil (seperti membuat daftar file dalam direktori), perintah ini memiliki overhead koneksi saat melakukan tugas seperti mengeksekusi 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 menjalankan 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 luas.
  • pemeliharaan negara . Driver shell VTS mempertahankan sesi terminal untuk setiap nama terminal (nama terminal default adalah default ). Variabel lingkungan yang diatur dalam satu sesi terminal hanya tersedia untuk perintah berikutnya dalam sesi yang sama.
  • Dapat diperpanjang . Komunikasi perintah Shell antara kerangka kerja VTS dan driver perangkat dibungkus dalam protobuf untuk mengaktifkan potensi kompresi, remoting, enkripsi, dll. di masa mendatang. Kemungkinan lain untuk meningkatkan kinerja juga tersedia, termasuk penguraian hasil sisi perangkat ketika overhead komunikasi menjadi lebih besar daripada penguraian string hasil.

Kekurangan

Kerugian menggunakan driver shell VTS daripada adb shell meliputi:

  • Biner tambahan . File agen VTS harus didorong ke perangkat dan dibersihkan setelah eksekusi pengujian.
  • Membutuhkan koneksi aktif . Jika koneksi TCP antara host dan agen hilang selama pengujian (karena pemutusan sambungan USB, penutupan port, kerusakan perangkat, dll.) baik secara sengaja atau tidak sengaja, perintah shell tidak dapat dikirimkan ke agen VTS. Bahkan dengan peralihan otomatis ke adb shell , hasil dan status perintah sebelum pemutusan tidak akan diketahui.

Contoh

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

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

Objek hasil perintah

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

Untuk memverifikasi kode pengembalian 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')