Kaspresso ve ADB sunucusu. Herkese merhaba! | tarafından Senchurin Nick | Tem, 2022

Kaspresso ve ADB sunucusu.  Herkese merhaba!  |  tarafından Senchurin Nick |  Tem, 2022

Herkese merhaba!

serimize devam ediyoruz nesne Kaspresso hakkında.

Bu, Kaspresso özellik uygulamasının ayrıntıları ve nüansları hakkında konuşacağımız gelişmiş bölümdeki ilk makaledir.

Mevcut otomasyon çerçevelerini karşılaştırırsak, ADB komutlarının yürütülmesi genellikle Appium için bir avantaj olarak kabul edilir. Ancak bu, Espresso ve UI Automator’da yoktur.

görüntü https://habr.com/ru/post/594017/

Bunu Kaspresso çerçevemizde düzeltmeye çalıştık ve bahsedeceğimiz şey olan bir ADB Sunucusu ekledik.

O zaman hadi gidelim. Espresso ve UI Automator, Kaspresso’nun temelidir, yani Appium’dan çıkmış olsaydık, önemli özelliğimizi kaybederdik: ADB aracılığıyla cihazla etkileşim.

Bu şu soruyu gündeme getiriyor: Testleri geçerken neden ADB’ye ihtiyacımız var? Cevap, ADB yalnızca uygulama yükleme, cihazdan herhangi bir dosya indirme veya sistem ayarlarını yükleme gibi standart komutları yerine getirmekle sınırlı değil, aynı zamanda diğer birçok komutla sınırlı değildir.

Örneğin, Google’daki mühendisler bir komut verdi – adb emu, yalnızca öykünücülerle çalışır. Bu komut, öykünücüde aygıtın dahili durumunu yönetmenize ve aşağıdakiler gibi standart dışı şeyler yapmanıza olanak tanıyan bir Telnet hizmeti başlatır:

  • coğrafi konum ayarı;
  • parmak izi tarayıcısına dokunma simülasyonu;
  • kararsız internet bağlantısı;
  • telefon çağrıları;
  • sms gönderme;
  • Ve bircok digerleri.

Yukarıdakilerin hepsi bu — sistem çağrılarının eksiksiz bir öykünmesi. Uygulamada internetin yokluğunu simüle etmeye çalışmanıza gerek yok çünkü ADB sayesinde sistem bunun nasıl olacağını gerçek bir cihazda gösteriyor.

Böylece, bunun gerçek anlaşma olduğundan emin olduk. Devam ediyor.

Adb’yi Appium’da kullanmak neden mümkün, ancak Espresso’da değil?

Appium kullanan test şeması şöyle görünür:

  1. Test ettiğimiz uygulama cihaza yüklenmiştir.
  2. Uygulamamızı kapsadığımız UI testleri bilgisayara yerleştirilir.
  3. Selenyum başlatılır.
  4. Selenium, Appium Sunucusunu başlatır.
  5. Appium Server, cihaza Bootstrap kurar.
  6. Bootstrap, ADB aracılığıyla Appium Sunucusu ile iletişim kurar.

Böylece testler çalışırken bilgisayar ve mobil cihaz sürekli olarak ADB üzerinden haberleşir. Bu da ihtiyacımız olan testlerde ADB kullanmamızı sağlıyor.

Espresso çerçevesini kullanarak testler yazdığımızda ne olur?

  1. Test ettiğimiz uygulama bir mobil cihaza yüklenmiştir.
  2. Testler içeren test APK, mobil cihaza yüklenir.
  3. Testleri çalıştır komutu bilgisayardan ADB üzerinden alınır.
  4. Uygulama ve Test APK birbiriyle iletişim kurar.

Bu şemada da gördüğümüz gibi, testler yapıldıktan sonra bilgisayar hiçbir şekilde sürece katılmıyor, her şey sadece cihaz tarafında oluyor. Böylece ADB’nin kullanılamayacağı sonucuna vardık.

Kaybı nasıl telafi edebiliriz?

Doğrudan testten bir “ADB komutunu çalıştır” eylemi göndermek için bir epiphany anı vardı.

Belgeleri araştırdık ve tüm öykünücülerde bir dizi adrese sahip bir sanal yönlendiricinin başladığını gördük, bu adreslerden biri 10.0.2.2’dir.

Emülatöre 10.0.2.2 IP adresi üzerinden erişirseniz, bilgisayarınızın localhost. Bunu keşfeder keşfetmez Flask çerçevesi üzerinden bir sunucu oluşturmaya çalıştık.

Etkileşim şemasını nasıl hayal ettik:

  1. Cihaz tarafında, uygulama aracılığıyla iletişim kurar. http://10.0.2.2 ADB komutunun belirtildiği adres, cmd parametre.
  2. Bilgisayar tarafında, sunucu olarak çalışan bir sunucu localhost talebi işler.
  3. Bilgisayar tarafında cmd’de belirtilen ADB komutu çalıştırılır.

İlk testleri yazdık, ADB komutları bilgisayara ulaştı ve ikincisi onları çalıştırdı. kadar mutluyduk…

görüntü https://habr.com/ru/post/594017/

Test senaryosunda “interneti kapat” satırı ile karşılaşmadık

görüntü https://habr.com/ru/post/594017/

Bu neden oluyordu?

Bildiğimiz gibi, Android, Linux işletim sistemine dayanmaktadır. Yani Wi-Fi ve mobil ağın etkinleştirildiği bir senaryomuz varsa, kabuk ile etkileşime girebilir ve aktif arayüzler hakkında bilgi alabiliriz.

Yani, ek olarak localhostWi-Fi’miz var [wlan0] ve mobil veri [radio0] arayüzler.

Ancak Uçak Modu düğmesini açar açmaz durum çok daha kötüleşiyor.

Gerekli arayüzleri kaybederiz ve kalan çok azı, emülatörlere kurulu bir sanal yönlendirici ile çalışmamıza izin vermez. Önemli özelliği kaybettiğimiz sonucuna vardık.

Belgelere tekrar döndük ve ilginç bir şey bulduk – port yönlendirme.

Aşağıdaki gibi çalışır:

  1. Sunucu, bu örnekte olduğu gibi cihazda 7100 bağlantı noktasında başlatılır.
  2. Komuta adb ileri tcp:6100 tcp:7100 bilgisayar tarafında yürütülür.
  3. Bilgisayarı belirli bir yere bağlarız localhost 6100 numaralı bağlantı noktasındaki adresi ve mobil cihazda oluşturulan sunucuya erişin.

Dikkat çekici olan şu ki port yönlendirme internetin tamamen yokluğunda çalışır: bağlantı noktaları öykünücünün bağlantısı ne olursa olsun yönlendirilir. Örneğin, cihaz USB üzerinden bağlıysa, bağlantı noktaları USB üzerinden yönlendirilecektir; Wi-Fi ile bağlanırlarsa, Wi-Fi üzerinden yönlendirilirler. Ve şu anda cihazdaki hangi arayüzlerin aktif olduğu önemli değil.

Ayrıca, bunun aksine ileri komut, adb ters komut var. Cihaza bir HTTP isteği yapmanızı sağlar. localhost cihaza yerleştirilen uygulamadan, ancak aslında bilgisayara bağlanın. Yani tam tersini yapıyor.

Ancak bu komutun bir sınırlaması vardır: yalnızca Android 5.0 ile çalışır. Android 5.0’ın altındaki cihazlarda test etmek zorunda kaldığımız için bu bize hiç uymadı.

Kaspresso’da kullanılan son şema

Kısaca ana fikir hakkında: Başlamaya başladık adbserver-desktop.jar bilgisayar tarafında. Bu, bağlı cihazların yönetilmesine yardımcı olan bir istemcidir. Cihazlarda Kaspresso testleri yapılır. yani çift adbserver-desktop.jar bilgisayar tarafında ve Kaspresso cihaz tarafında aşağıdaki şema için iş akışını sağlar:

  1. Cihazın portunu seçiyoruz. Cihaz tarafında her zaman bir bağlantı olacak, böylece her zaman aynı portu ayarlayabiliriz. Olsun: 8500.
  2. Bilgisayara aynı anda birden fazla cihaz bağlanabileceğinden, bilgisayara birden fazla bağlantı olabilir. Her bağlantı için 6000..49000 aralığından benzersiz bir boş bağlantı noktası oluşturulur. Örneğin, iki cihazı bağlarız ve portları seçeriz. :6100 ve :48999 onlar için sırasıyla.
  3. Bilgisayarda, komutları kullanarak her cihaza bağlantı noktaları göndeririz:
    adb -s device1 ileri tcp:6100 tcp:8500
    adb -s device2 ileri tcp:48999 tcp:8500
  4. Adreslerle soket istemcileri oluşturuyoruz yerel ana bilgisayar:6100 ve yerel ana bilgisayar:48999 bilgisayar tarafında. Her ihtimale karşı, istemci ve sunucu aynı adrese yerleştirilirse, istemci ile sunucu arasında bir soket bağlantısının oluştuğunu hatırlatmak. Yani, oluşturulan istemciler şu anda soket sunucularının başlamasını bekliyorlar. yerel ana bilgisayar:6100 ve localhost:48999 adresleri yukarıda belirtildiği gibi.
  5. Ve şimdi asıl hile geliyor. portları zorladık :6100 ve :48999 bilgisayarın bağlantı noktasına :8500 cihazlar. Bu, oluşturulan soket istemcilerinin aslında sunucuyu localhost:8500 adresinde değil, cihazın tarafında beklediği anlamına gelir. yerel ana bilgisayar:6100 ve yerel ana bilgisayar:48999 adresler bilgisayar tarafında.
  6. Her cihazda, soket sunucusunu şu komutla başlatıyoruz: yerel ana bilgisayar:8500 adres.
  7. Cihazda bir soket bağlantısı kuruyoruz. yerel ana bilgisayar:8500 address , burada hem istemci hem de sunucu bulunur. Aynı zamanda, soket istemcisinin fiziksel olarak bilgisayar tarafında yer aldığını hatırlıyoruz (yerel ana bilgisayar:6100 ve yerel ana bilgisayar:48999). Daha fazla iletişim, bir soket bağlantısı üzerinden gerçekleşir. Cihazda bir ADB komutu çalıştırmamız gerekebilir. Bu durumda bilgisayara bu gerçeği bildirir ve kanala bir dizi göndeririz. Bilgisayar, cihazın göstergesiyle bu komutu fiziksel olarak yürütür ve kanal aracılığıyla bir yanıt gönderir – durumu olan bir dize.

Komutlar yürütüldüğünde, geri bildirim sunucudan gelir. Bu nedenle, şemaya eşzamanlılık eklenir. Ayrıca, örneğin büyük dosyaları aktarmamız gerektiğinde de yararlıdır, çünkü komutu yürüttükten sonra geri bildirim alırız.

Özet: Cihaz bilgisayara herhangi bir şekilde bağlıysa (Wi-Fi, Bluetooth veya USB aracılığıyla) artık Kaspresso’da ADB komutlarını çalıştırabiliriz.

Şimdilik bu kadar. Bizi izlemeye devam edin!

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.