Cihaz kabuğu komutları

VTS testi sırasında, kabuk komutları hedef taraftaki bir test ikili dosyasını yürütmek, özellikleri, ortam değişkenlerini ve sistem bilgilerini almak/ayarlamak ve Android çerçevesini başlatmak/durdurmak için kullanılır. VTS aygıt kabuğu komutlarını adb shell komutunu veya aygıtta çalışan VTS kabuk sürücüsünü (önerilen) kullanarak çalıştırabilirsiniz.

ADB kabuğunu kullan

Test sırasında USB bağlantı noktasının kapatılmasını veya cihazın yeniden başlatılmasını gerektiren testlerde, VTS kabuk sürücüsü kalıcı bir USB bağlantısı olmadan kullanılamadığından ADB kabuğu kullanılmalıdır. ADB kabuğunu Python test betiğindeki AndroidDevice nesnesinden çağırabilirsiniz. Örnekler:

  • Bir Android cihaz nesnesi alın:
    self.device = self.android_devices[0]
    
  • Tek bir kabuk komutu verin:
    result = self.device.adb.shell(‘ls')
    

VTS kabuk sürücüsünü kullanın

VTS kabuk sürücüsü, cihazda çalışan ve kabuk komutlarını yürüten bir aracı ikili dosyasıdır. Varsayılan olarak VTS, sürücü aygıtta çalışıyorsa kabuk sürücüsünü kullanır çünkü bu yöntem adb shell komutunu kullanmaktan daha az gecikmeye sahiptir.

Şekil 1. VTS kabuk sürücüsü.

VTS çerçevesi, her Android cihazının temel çalıştırıcıda bir AndroidDevice nesnesi olarak temsil edildiği çoklu cihaz testini destekler. Varsayılan olarak VTS çerçevesi, VTS aracısını ve VTS kabuk sürücüsü ikili dosyalarını her Android cihazına gönderir ve bu cihazlardaki VTS aracılarına TCP bağlantıları kurar.

Bir kabuk komutunu yürütmek için, ana bilgisayar tarafındaki Python betiği, AndroidDevice nesnesinin içindeki ShellMirror nesnesine bir işlev çağrısı yapar. ShellMirror nesnesi, kabuk komut metinlerini bir protobuf mesajına paketler ve bunu (TCP kanalı aracılığıyla) Android cihazındaki VTS aracısına gönderir. Cihazda çalışan aracı daha sonra kabuk komutunu Unix soketi aracılığıyla VTS kabuk sürücüsüne iletir.

VTS kabuk sürücüsü bir kabuk komutu aldığında, takılmayı önlemek için komutu aygıt kabuğundaki nohup aracılığıyla yürütür. Stdout, stderr ve dönüş kodu daha sonra nohup alınır ve VTS aracısına geri gönderilir. Son olarak aracı, komut sonuçlarını/sonuçlarını bir protobuf mesajına sararak ana bilgisayara yanıt verir.

Avantajları

adb shell yerine VTS kabuk sürücüsünü kullanmanın avantajları şunlardır:

  • Güvenilirlik. VTS kabuk sürücüsü, komutları varsayılan ayarlarda yürütmek için nohup kullanır. VTS testleri çoğunlukla daha düşük seviyeli HAL ve çekirdek testleri olduğundan nohup , kabuk komutlarının yürütme sırasında takılmamasını sağlar.
  • Verim . adb shell komutu bazı sonuçları (bir dizindeki dosyaları listelemek gibi) önbelleğe alırken, bir test ikili dosyasının yürütülmesi gibi görevleri gerçekleştirirken bir bağlantı ek yüküne sahiptir. VTS kabuk sürücüsü test boyunca aktif bağlantıyı sürdürür, böylece tek ek yük USB iletişimi olur. Testlerimizde, boş bir gtest ikili dosyasına 100 çağrı içeren bir komutu yürütmek için VTS kabuk sürücüsünü kullanmak adb shell kullanmaktan yaklaşık yüzde 20 daha hızlıdır; VTS kabuk iletişiminin kapsamlı günlüğe kaydetme özelliği olduğundan gerçek fark daha büyüktür.
  • Devleti korumak . VTS kabuk sürücüsü, her terminal adı için bir terminal oturumu tutar (varsayılan terminal adı varsayılandır ). Bir terminal oturumunda ayarlanan ortam değişkenleri yalnızca aynı oturumdaki sonraki komutlar için kullanılabilir.
  • Uzatılabilir . VTS çerçevesi ile aygıt sürücüsü arasındaki kabuk komut iletişimleri, gelecekte olası sıkıştırma, uzaktan iletişim, şifreleme vb. olanaklarını sağlamak için protobuf'a sarılmıştır. İletişim yükünün sonuç dizesi ayrıştırmasından daha büyük hale gelmesi durumunda cihaz tarafı sonuç ayrıştırma da dahil olmak üzere, performansı artırmaya yönelik başka olasılıklar da mevcuttur.

Dezavantajları

adb shell yerine VTS kabuk sürücüsünü kullanmanın dezavantajları şunlardır:

  • Ek ikili dosyalar VTS aracısı dosyaları cihaza gönderilmeli ve test yürütüldükten sonra temizlenmelidir.
  • Aktif bağlantı gerektirir . Test sırasında ana makine ile aracı arasındaki TCP bağlantısı kasıtlı veya kasıtsız olarak kesilirse (USB bağlantısının kesilmesi, bağlantı noktasının kapatılması, cihazın çökmesi vb. nedeniyle), VTS aracısına bir kabuk komutu iletilemez. adb shell otomatik geçiş yapılsa bile, bağlantı kesilmeden önce komutun sonucu ve durumu bilinemez.

Örnekler

VTS ana bilgisayar tarafı Python test komut dosyasında kabuk komutlarını kullanma örnekleri:

  • Bir Android cihaz nesnesi alın:
    self.device = self.android_devices[0]
    
  • Seçilen aygıt için bir kabuk nesnesi alın:
    self.shell = self.device.shell
    
  • Tek bir kabuk komutu verin:
    results = self.shell.Execute(‘ls')
    
  • Kabuk komutlarının bir listesini yayınlayın:
    results = self.shell.Execute([‘cd /data/local/tmp', ‘ls'])
    

Komut sonuç nesnesi

Kabuk komutunun yürütülmesinden elde edilen dönüş nesnesi, stdouts , stderrs ve return_codes anahtarlarını içeren bir sözlüktür. Kabuk komutunun tek bir dize olarak mı yoksa komut dizeleri listesi olarak mı sağlandığı dikkate alınmaksızın, sonuç sözlüğünün her değeri her zaman bir listedir.

Bir komut listesinin dönüş kodunu doğrulamak için test komut dosyasının dizinleri kontrol etmesi gerekir. Örnek:

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

Alternatif olarak, komut dosyası her komut dizinini ayrı ayrı kontrol edebilir. Örnek:

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