Cihaz kabuğu komutları

VTS testi sırasında, hedef tarafı test ikilisini yürütmek, özellikleri, ortam değişkenlerini ve sistem bilgilerini almak/ayarlamak ve Android çerçevesini başlatmak/durdurmak için kabuk komutları kullanılır. adb shell komutunu veya cihazda çalışan VTS shell sürücüsünü (önerilen) kullanarak VTS device shell komutlarını ç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 testler, kalıcı bir USB bağlantısı olmadan VTS kabuk sürücüsü kullanılamadığından ADB kabuğunu kullanmalıdır. Python test betiğindeki AndroidDevice nesnesinden ADB kabuğunu ç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ü, cihaz üzerinde çalışan ve kabuk komutlarını yürüten bir ajan ikili dosyasıdır. Varsayılan olarak, sürücü aygıtta çalışıyorsa, VTS 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 bir 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 nesnesi 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. Cihaz üzerinde çalışan etmen 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ılı kalmayı ö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ı 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 ayarlarda 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 kalmamasını sağlar.
  • performans . adb shell komutu bazı sonuçları (bir dizindeki dosyaları listelemek gibi) önbelleğe alırken, bir test ikili dosyasını 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 etkin bir bağlantı sağlar, bu nedenle tek ek yük USB iletişimidir. 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şimi kapsamlı bir günlük kaydına sahip olduğundan, gerçek fark daha büyüktür.
  • Devlet tutma . VTS kabuk sürücüsü, her uçbirim adı için bir uçbirim oturumu sürdürür (varsayılan uçbirim 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.'yi etkinleştirmek için protobuf'a sarılır. İletişim ek yükü, sonuç dizisi ayrıştırmasından daha büyük olduğunda, cihaz tarafı sonuç ayrıştırması da dahil olmak üzere, performansı iyileştirmeye 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ı dosyaları, test yürütüldükten sonra cihaza gönderilmeli ve temizlenmelidir.
  • Aktif bağlantı gerektirir . Test sırasında (USB bağlantısının kesilmesi, bağlantı noktasının kapanması, cihazın çökmesi vb. nedeniyle) kasıtlı veya kasıtsız olarak ana bilgisayar ile aracı arasındaki TCP bağlantısı kesilirse, VTS aracısına bir kabuk komutu iletilemez. adb shell otomatik geçiş olsa bile, bağlantı kesilmeden önceki komutun sonucu ve durumu bilinmiyordu.

örnekler

Bir VTS ana bilgisayar tarafı Python test betiğinde 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 komutunun yürütülmesinden 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 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 betiğinin 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')