VTS testi sırasında, 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 kabuk komutları kullanılır. adb shell
komutunu veya cihazda çalışan VTS kabuk sürücüsünü (önerilir) kullanarak VTS cihaz kabuk komutlarını çalıştırabilirsiniz.
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ığından ADB kabuğunu kullanmalıdır. ADB kabuğunu Python test komut dosyasındaki AndroidDevice
nesnesinden çağırabilirsiniz. Örnekler:
- Bir Android cihaz nesnesi alın:
self.device = self.android_devices[0]
- Tek bir kabuk komutu yayınlayın:
result = self.device.adb.shell(‘ls')
VTS kabuk sürücüsünü kullanma
VTS kabuk sürücüsü, aygıtta ç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.
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 cihazlarda 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ında paketler ve (TCP kanalı aracılığıyla) Android cihazındaki VTS aracısına gönderir. Aygıtta ç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, askıda kalmayı önlemek için komutu aygıt kabuğunda 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 sonucunu/sonuçlarını bir protobuf
mesajına sararak ana bilgisayara yanıt verir.
Avantajlar
adb shell
yerine VTS shell 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ı önbelleğe alırken (bir dizindeki dosyaları listelemek gibi), bir test ikili dosyasını yürütmek gibi görevleri gerçekleştirirken bir bağlantı yüküne sahiptir. VTS kabuk sürücüsü, test boyunca aktif bir bağlantı sürdürür, 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şiminin kapsamlı günlük kaydı olduğundan gerçek fark daha büyüktür. - Devlet tutma . 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 ve aygıt sürücüsü arasındaki kabuk komut iletişimleri, gelecekte olası sıkıştırma, uzaktan iletişim, şifreleme vb. işlemleri etkinleştirmek için protobuf'a sarılır. İletişim yükü sonuç dizesi ayrıştırmasından daha büyük olduğunda cihaz tarafında sonuç ayrıştırma dahil olmak üzere, performansı iyileştirmek için başka olasılıklar da mevcuttur.
Dezavantajları
adb shell
yerine VTS shell 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.
- Etkin bağlantı gerektirir . Test sırasında (USB bağlantısının kesilmesi, bağlantı noktasının kapanması, cihaz çökmesi vb. nedeniyle) ana bilgisayar ile aracı arasındaki TCP bağlantısı kasıtlı veya kasıtsız olarak kesilirse, VTS aracısına bir kabuk komutu iletilemez. Otomatik olarak
adb shell
bile, bağlantının kesilmesinden önceki komutun sonucu ve durumu bilinemezdi.
Ö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 cihaz için bir kabuk nesnesi alın:
self.shell = self.device.shell
- Tek bir kabuk komutu yayınlayın:
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ütmesinden dönen nesne, stdouts
, stderrs
ve return_codes
anahtarlarını içeren bir sözlüktür. Kabuk komutunun tek bir dize olarak mı yoksa komut dizelerinin bir 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 indeksleri kontrol etmesi gerekir. Örnek:
asserts.assertFalse(any(results[‘return_codes']), ‘some command failed.')
Alternatif olarak, komut dosyası her bir 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')