VTS testi sırasında, hedef taraflı bir 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 kabuk sürücüsünü (önerilen) kullanarak VTS cihaz kabuğu komutlarını yürütebilirsiniz.
ADB kabuğunu kullanma
VTS kabuk sürücüsü kalıcı bir USB bağlantısı olmadan kullanılamadığından, test sırasında USB bağlantı noktasının kapatılmasını veya cihazın yeniden başlatılmasını gerektiren testlerde ADB kabuğu kullanılmalıdır. Python test komut dosyasında AndroidDevice
nesnesinden ADB kabuğunu çağırabilirsiniz. Örnekler:
- Android cihaz nesnesi alın:
self.device = self.android_devices[0]
- Tek bir kabuk komutu gönderin:
result = self.device.adb.shell(‘ls')
VTS kabuk sürücüsünü kullanma
VTS kabuk sürücüsü, cihazda çalışan ve kabuk komutlarını yürüten bir aracı ikili dosyasıdır. VTS, varsayılan olarak adb
shell
komutunu kullanmaktan daha az gecikmeye sahip olduğu için sürücü cihazda çalışıyorsa kabuk sürücüsünü kullanır.
VTS çerçevesi, her Android cihazın temel çalıştırıcıda AndroidDevice nesnesi olarak temsil edildiği çok cihazlı testleri destekler. VTS çerçevesi varsayılan olarak VTS aracısı ve VTS kabuk sürücüsü ikililerini her Android cihaza gönderir ve bu cihazlardaki VTS aracılarıyla TCP bağlantıları kurar.
Ana makine tarafındaki Python komut dosyası, bir kabuk komutunu yürütmek için AndroidDevice nesnesi içindeki ShellMirror nesnesine işlev çağrısı yapar. ShellMirror nesnesi, kabuk komut metinlerini bir protobuf mesajına paketleyip Android cihazdaki VTS aracısına (TCP kanalı üzerinden) gönderir. Ardından cihazda çalışan aracı, kabuk komutunu Unix soketi üzerinden VTS kabuk sürücüsüne yönlendirir.
VTS kabuk sürücüsü bir kabuk komutu aldığında, kilitlenmeyi önlemek için komutu cihaz kabuğunda nohup aracılığıyla yürütür. Ardından stdout, stderr ve dönüş kodu nohup
'ten alınır ve VTS aracısına geri gönderilir. Son olarak, aracı, komut sonuçlarını bir protobuf
mesajına sarmalayarak ana makineye 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 alt düzey HAL ve çekirdek testleri olduğundannohup
, kabuk komutlarının yürütülme sırasında takılmamasını sağlar. - Performans.
adb shell
komutu bazı sonuçları önbelleğe alır (ör. bir dizindeki dosyaları listeleme), ancak test ikilisini yürütme gibi görevleri gerçekleştirirken bağlantı yükü oluşturur. VTS kabuk sürücüsü test boyunca etkin bir bağlantıyı korur. Bu nedenle, tek yükü USB iletişimi oluşturur. Testlerimizde, boş bir gtest ikilisine 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şiminde kapsamlı günlük kaydı olduğundan gerçek fark daha büyüktür. - Durum bilgisi tutma. VTS kabuk sürücüsü, her terminal adı için bir terminal oturumu (varsayılan terminal adı default) tutar. Bir terminal oturumunda ayarlanan ortam değişkenleri yalnızca aynı oturumdaki sonraki komutlar tarafından kullanılabilir.
- Genişletilebilir. VTS çerçevesi ile cihaz sürücüsü arasındaki kabuk komutu iletişimleri, gelecekte olası sıkıştırma, uzaktan erişim, şifreleme vb. işlemlerin yapılmasını sağlamak için protobuf içine alınır. İletişim yükü sonuç dizesi ayrıştırmasından daha büyük hale geldiğinde cihaz tarafında sonuç ayrıştırma da dahil olmak üzere performansı artırmanın başka yolları da vardır.
Dezavantajları
adb
shell
yerine VTS kabuk sürücüsünü kullanmanın dezavantajları şunlardır:
- Ek ikili dosyalar. VTS temsilcisi dosyaları cihaza gönderilmeli ve test çalıştırıldıktan sonra temizlenmelidir.
- Etkin 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 kilitlenmesi vb. nedeniyle) VTS aracısına kabuk komutu iletilemez.
adb shell
durumuna otomatik geçiş yapılsa bile bağlantı kesilmeden önceki komutun sonucu ve durumu bilinmez.
Örnekler
VTS ana makine tarafında Python test komut dosyasında kabuk komutlarının kullanılmasına dair örnekler:
- Android cihaz nesnesi alın:
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 gönderin:
results = self.shell.Execute(‘ls')
- Kabuk komutlarının listesini gösterin:
results = self.shell.Execute([‘cd /data/local/tmp', ‘ls'])
Komut sonucu nesnesi
Kabuk komutu yürütme işleminden döndürülen nesne, stdouts
, stderrs
ve return_codes
anahtarlarını içeren bir sözlüktür.
Kabuk komutunun tek bir dize veya komut dizesi listesi olarak sağlanıp sağlanmadığına bakılmaksızın, sonuç sözlüğünün her değeri her zaman bir listetir.
Test komut dosyasının, komut listesinin döndürdüğü kodu doğrulamak için dizinleri kontrol etmesi gerekir. Örnek:
asserts.assertFalse(any(results[‘return_codes']), ‘some command failed.')
Alternatif olarak komut dosyası, her komut dizini için ayrı ayrı kontrol gerçekleştirebilir. Örnek:
asserts.assertEqual(results[‘return_codes'][0], 0, ‘first command failed')
asserts.assertEqual(results[‘return_codes'][1], 0, ‘second command failed')