Aygıt Kabuğu Komutları

VTS testi sırasında, kabuk komutları bir hedef tarafı 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. adb shell komutunu veya cihazda çalışan VTS kabuk sürücüsünü kullanarak VTS cihaz kabuğu komutlarını çalıştırabilirsiniz (önerilir).

ADB kabuğunu kullanma

USB bağlantı noktasının kapatılmasını veya test sırasında cihazın yeniden başlatılmasını gerektiren testler, kalıcı bir USB bağlantısı olmadan VTS kabuk sürücüsü kullanılamadığı için ADB kabuğunu kullanmalıdır. Python test komut dosyasında AndroidDevice nesnesinden ADB kabuğunu çağırabilirsiniz. Örnekler:

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

VTS kabuk sürücüsünü kullanma

VTS kabuk sürücüsü, aygıt üzerinde çalışan ve kabuk komutlarını yürüten bir aracı ikilisidir. Varsayılan olarak, VTS, sürücü aygıtta çalışıyorsa kabuk sürücüsünü kullanır, çünkü bu yöntemin adb shell komutunu kullanmaktan daha az gecikme süresi vardır.

Ş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 iter 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 nesnesi içindeki ShellMirror nesnesine bir işlev çağrısı yapar. ShellMirror amacı, içine kabuk komutu metinleri paketleri protobuf mesajı ve Android cihazında VTS madde (TCP kanalı üzerinden) 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, asılmasını önlemek için komutu cihaz kabuğundaki nohup aracılığıyla yürütür. Stdout, stderr ve dönüş kodu daha sonra nohup alınır ve VTS temsilcisine geri gönderilir. Son olarak, aracı, komut 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ü, varsayılan ayarda komutları 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 askıda nohup sağlar.
  • Performans . adb shell komutu bazı sonuçları (bir dizindeki dosyaları listelemek gibi) önbelleğe alırken, bir test ikili dosyası yürütmek gibi görevleri gerçekleştirirken bir bağlantı ek yüküne sahiptir. VTS kabuk sürücüsü, test boyunca aktif bir bağlantıyı sürdürür, bu nedenle tek ek yük USB iletişimidir. Testimizde, boş bir gtest ikilisine 100 çağrı ile 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; gerçek fark daha büyüktür çünkü VTS kabuk iletişiminin kapsamlı bir günlük kaydı vardır.
  • Devlet koruma . VTS kabuk sürücüsü, her bir 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 ve aygıt sürücüsü arasındaki kabuk komut iletişimleri, gelecekte olası sıkıştırma, uzaktan erişim, şifreleme vb. Sağlamak için protobuf'a sarılır. İletişim ek yükü, sonuç dizisi çözümlemesinden daha büyük olduğunda cihaz tarafı sonuç ayrıştırması dahil olmak üzere, performansı iyileştirmek için başka olasılıklar da mevcuttur.

Dezavantajları

adb shell yerine VTS kabuk sürücüsünü kullanmanın dezavantajları şunları içerir:

  • Ek ikili dosyalar . VTS aracı dosyaları cihaza aktarılmalı ve testin yürütülmesinden sonra temizlenmelidir.
  • Aktif bağlantı gerektirir . Test sırasında ana bilgisayar ve aracı arasındaki TCP bağlantısı kesilirse (USB bağlantısının kesilmesi, bağlantı noktasının kapatılması, cihaz çökmesi vb. Nedeniyle) kasıtlı veya kasıtsız olarak, VTS aracısına bir kabuk komutu iletilemez. Otomatik olarak adb shell bile, bağlantı kesilmeden önceki komutun sonucu ve durumu bilinmeyecekti.

Örnekler

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

  • Bir Android cihaz nesnesi edinin:
    self.device = self.android_devices[0]
    
  • Seçilen cihaz 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 komut yürütmesinin dönüş nesnesi, stdouts , stderrs ve return_codes anahtarlarını içeren bir return_codes . Kabuk komutunun tek bir dize olarak mı yoksa bir komut dizeleri listesi olarak mı sağlandığına bakılmaksı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ı dizinleri kontrol etmelidir. Misal:

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

Alternatif olarak, komut dosyası her bir komut dizinini ayrı ayrı kontrol edebilir. Misal:

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