AWS Device Farm’da Appium ile Test Otomasyonu

Mehmet canker
Hürriyet Labs
Published in
7 min readJun 16, 2017

Mobil uygulama geliştirme aşaması tamamlandıktan sonra en önemli hedeflerimizden biri, binlerce cihaz çeşitliliği bulunan bir ekosistemde uygulamalarımızın kullanıcıların cihazlarında doğru bir şekilde çalıştığından emin olmaktır.

Kullanıcı arayüzü açısından Web uygulamaları ile kıyaslandığında doğası gereği (daha küçük ekranlar) daha basit bir yapıya sahip olmalarına rağmen mobil uygulamalar, cihaz çeşitliliğinin çok olması, cihazların sistemsel olarak limitleri, sabit bir WIFI haricinde çoğu zaman hücresel veri ile karasız network koşullarına maruz kalabilmeleri ve kullanıcıların uygulama üzerinden cihazın fonksiyonları ile iletişime geçmeleri (GPS, Kamera…) işleri daha kompleks hale getirmekte ve bu durum uygulamanın farklı koşullar içerisinde stabil olarak çalıştığına emin olmak da zorlaştırmaktadır. Bu durumda uygulamayı mobil cihazlar üzerinde farklı koşullar altında test etmek gerekiyor. Ancak hem cihaz çeşitliliği hem de bu cihazların içerisindeki işletim sistemlerinin de farklılaşabileceği düşünüldüğünde, tam anlamıyla (uygulamanın en çok kurulu olduğu cihazlar üzerinde bile test yapıldığını varsaysak bile) kararlı bir uygulamanın yayına alınacağından emin olma süreci uzayabiliyor.

Tabii burada test kısmını biraz daha detaylandırabiliriz. Mobil uygulamaları geliştirme süreçlerinde Continuous Integration modelini benimsemiş olabiliriz. Yani Unit testler, functional testler ve integration testleri tam anlamıyla yapıyor olsak da özellikle mobil dünyada bunlar yetersiz kalabiliyor. (Backend sistemlerde çalıştırılan testler tek bir server domaini üzerinde test edilip aynı domain üzerinde çalıştırılabilmekte ancak mobilde onlarca farklı cihaz ve işletim sistemi sürümü mevcut.)

Continuous delivery modeli tarafından incelendiğinde Continuous integration devamında agile test piramidinin üstünde yer alan Acceptance testlerin gelen her paket için yapılabilmesi ciddi anlamda iş gücü kaybı yaratabilmektedir. Böylece bu testlerin otomasyonu üzerinden yapılması zorunlu hale gelmektedir.

Otomasyonun yanında manuel testlerin da sürecin hala önemli bir parçası olduğunu biliyoruz.

Bu yazıda mobil uygulamalarda Appium Framework ile geliştirilen test otomasyonunun Amazon Device Farm üzerinde çalıştırıp, testlerimizi otomasyona bağlı olarak çalıştıracağız.

Yazı Appium ile test nasıl yazılacağını anlatmaktan ziyade, test otomasyonun AWS Device Farm ile nasıl çalıştırılacağı konsepti üzerine olacaktır.

Kullanacaklarımızın aslında büyük bölümü daha önce muhtemelen aşinalığımız olan teknolojiler (JUnit, Jenkins gibi) olacak. Öncelikle kısa kısa bu teknolojilerin genel özelliklerine bakalım.

1. AWS DEVICE FARM

AWS Device Farm

Mobil uygulamaların testlerinde en büyük problemlerden biri, test edilecek cihazların çeşitliliği olduğunu biliyoruz. Maalesef ki sanal olarak kurduğumuz cihazlar gerçek cihazların özelliklerini tamamen karşılamayabiliyor (Emulator bile olsa). Bu durumda bu cihazlara fiziki olarak sahip olmak hatta farklı işletim sistemleri için bir örneği bulundurmak gerekiyor. Ancak bu cihazları firmaların bünyesinde barındırması hem ciddi bir maliyet hem de zaman kaybı (stok takibi, yeni cihazların alınması vs. ) olarak bize yansıyabiliyor.

AWS Device Farm ise bize fiziksel cihazlar sağlayarak mobil ve web uygulamalarımızı test etmemizi sağlayıp yukarıda belirttiğimiz problemleri çözen bir cloud servisidir. Uzaktan bağlanıp kullanabileceğimiz ya da otomasyonumuza bağlı olarak çalıştırabileceğimiz onlarca farklı modelde cihazı kullanımımıza sunarak testlerimizi yapmamızı sağlamaktadır.

AWS Device Farm’da ilk 1000 dakika ücretsiz şekilde platformu deneyebiliyoruz.

AWS test otomasyonunun yanında, remote(uzaktan) testler yapabilmek için uygulama yüklemeye izin vermektedir. Remote testler manuel yapıldığı için test edeceğimiz uygulamayı yükledikten sonra direkt olarak cihaza bağlanıp testi başlatabiliyoruz. Remote testler özellikle cihazların eski işletim sistemlerinde veya elimizde bulunmayan cihazlarda çalışırken, uygulamada oluşan problemlerin çözümünde çok fayda sağlıyor. Bunun yanında mobil cihazlarda yapabildiğimiz bir çok gesture’u yine Device Farm üzerinden cihazlara iletebiliyoruz.

AWS’nin bize sunduğu Cihaz listesi en çok tercih edilen markaların ürünlerinden oluşmaktadır.

Mesela iOS 7.1 iphone 4s problem yaşadığınızı düşünün bu hatayı o domainde çözmek için, en uygun çözüm yine remote test üzerinden cihaza bağlanıp hatayı tekrarlamak ve hatayı oluşturan nedeni ortaya çıkarmaktır. Yine hatanın giderilip giderilmediği aynı şekilde remote test üzerinden anlaşılabilmektedir.

Bunun yanında AWS Device Farm, testler esnasında ekran görüntüsü alma, video kaydetme, logları tutma, memory üzerindeki hareketler gibi pek çok datayı testlerde bize sunmaktadır. Böylece bir t anı için uygulamanın performansını rahatlıkla gözlemleyebiliriz.

CPU Grafiği

AWS Device Farm içerisinde Mobil haricinde Web domaininde de testler yapabiliyoruz. Bir çok gesture’yi web browsera uygulayabiliyoruz. Yazının konusu olmadığı için, Web ile ilgili detaylara giremeyeceğiz. Bunun yanında remote testleri yapmaya özel bir konfigurasyon yapmadan hemen başlayabilirsiniz.

2. JUNIT VE TESTNG

JUNIT’in şüphesiz Java dünyasında özeli bir yeri var. Unit testler başta olmak üzere Java dünyasında pek çok noktada kullanılıyor.

AWS Device Farm tarafından bakıldığında ise, eğer Appium ile otomasyonu yapacaksak JUNIT ve TestNG şu anda en popüler frameworkler olarak karşımıza çıkıyor. TestNG, JUNIT’e göre nispeten yeni ve JUNIT’in pek çok özelliğini bünyesinde bulunduruyor. Zaten dokümantasyonunda JUNIT’ten ilham alındığı açıkça belirtilmiş durumda. Özellikle çok işlevli bir çok annotationa sahip. Ancak JUNIT özellikle yeni 5 versiyonu ile birlikte, ‘@Tag’ ve ‘@DisplayName’ gibi işlevsel annotationlara kavuştu. Bu tamamen sizin tercihinize kalmakla birlikte büyük communitysi ve yeni versiyonu ile JUNIT (Bir dönem TestNG kullanmama rağmen) benim için bir adım önde duruyor.

3. APPIUM

Appium

Test otomasyon süreçleri uzun yıllardır bir çok farklı teknoloji ile uygulanmakta. Appium ise, bunun mobil taraftaki en ünlü temsilcisi. Appium ile Native Android, Native iOS, Hibrit ve mobil web uygulamalar üzerinde test otomasyonu yapabiliyoruz.

Appium Webdriver protokolünü destekleyen bütün diller ile birlikte, Framework bağımsız olarak çalışabilmektedir.

Geçmişten günümüze Test otomasyonu geliştiricilerinin en çok tercih ettikleri dil ve büyük bir birikimi olması nedeniyle Java programlama dilinin diğerlerine oranla bir adım önde olduğunu düşünüyorum.

Appium’un çalışması nasıl oluyor?

Appium’un mimarisi client-server mimarisi üzerine dayanmaktadır. Client, Appium servera bir istek atarak bir session başlatır. Client bu istek içerisine DesiredCapabilities objesini yerleştirir. Bu obje başlatılacak sessionun içeriğini de belirler. PlatformName, platformVersion, Language, orientation gibi. Bu şekilde Appium serverda yeni oluşturulacak session DesiredCapabilities’e göre şekillenir. Appium yukarıda belirttiklerimizin haricinde onlarca özelliğe daha sahiptir.

Appium’un avantajları nelerdir?

  1. Son kullanıcıya yönelik geliştirdiğimiz uygulamayı herhangi bir framework ya da kütüphane ile tekrar bundle etmek zorunda değiliz. Bu şekilde mobil geliştiricileri test kodlarından uzak tutup üretilen paket dosyasının ekstra bir kod sarmalına sokmadan yayına gidecek kod gibi kullanılabilmesidir.
  2. Appium, sadece bir dil değil, bir çok yazılım dili ile testleri yazmamıza imkan sağlar. Appium’un çalışma prensibi JSONWire protokolü üzerine kuruludur. Client tarafında pek çok tercih şansımız bulunmaktadır. Popüler dillerin hemen hemen tamamını desteklemektedir.
  3. Appium, AWS Device Farm ve Xamarin Test Cloud (bu da oldukça başarılı bir cloud servisi) gibi pek çok cloud servisi ile uyumludur.

Bunun yanında sadece Native değil, Phonegap ve Cordova gibi hibrit uygulama geliştirme teknolojilerini de desteklemektedir.

Appium kullanırken daha önce de belirttiğimiz gibi, mobil uygulama kodunuzu tekrar compile etmenize gerek yoktur. Halihazırda bulunan son kullanıcı için hazılarlanan sürecinize Appium’u eklemeniz son derece kolay olacaktır. Bunun yanında yayına çıkacak kod ile test yapılacak olması geliştiricilere ekstra bir yük getirmeyecektir.

Appium mobile yönelik otomasyon framework’üdür. Selenium’un mobil için extend edilmiş bir hali olarak düşünebiliriz. Zaten kodları geliştirkende kullanacağımız pek çok interface Selenium’dan gelmektedir.

AWS Device Farm üzerinde çalışabilmek için, Appium dışında Calabash gibi iyi alternatiflerde bulunmaktadır.

4. JENKINS

Jenkins

Jenkins open source dünyasının kuşkusuz otomasyon süreçlerinin en önemli öğelerinden biri. AWS Device Farm üzerinde testlerimizi AWS’nin bize sunduğu API üzerinden çalıştırabiliyoruz. Bunun yanında AWS, Device Farm için Jenkins pluginini de bulunduruyor.

Test assetlerini Jenkins üzerinden AWS Device Farm üzerinden rahatlıkla çalıştırabiliyoruz. Aynı şekilde test akışını, testin sonuçlarını ve test çıktılarını (video, log gibi) yine Jenkins plugini bize sağlıyor. Ve Device Farm’a gitmeden otomasyonu Jenkins üzerinden yönetebiliyoruz.

Genel Bakış

Bu bölümde ise, yukarıda belirttiğimiz teknolojileri kullanarak örnek bir login case’ini Amazon Device Farm üzerinde çalıştırma sürecinden bahsedeceğiz.

Öncelikle ilk adım olarak Appium inspector ile uygulamayı (örnek platform olarak Android tercih ettik) çalıştırıyoruz. Daha önce belirttiğimiz gibi, Appium’un önemli avantajlarından biri uygulamayı test etmek için uygulamaya ekstra bir framework ile bundle etmeden test edebiliyor oluşumuzdur. Android için son kullanıcıya çıkmaya aday uygulama üzerinde inspector’u çalıştırarak input alanlarını, butonlarını tanıtıcı bir kimlik bulacağız. Aşağıdaki ekran görüntüsünde olduğu gibi, login case’ini test edeceğimiz için e-posta, şifre alanları ve giriş butonunun xpath değerlerini alıp (resource-id ile de alınabiliyor) kodumuzda kullanacağız.

Intellij, JUNIT’in son versiyonu 5 ‘e destek vermektedir.Bu işlem bittikten sonra (tercihen) Intellij platformu üzerinde ilgili kimlik bilgilerine sahip alanlar için testlerimizi yazabiliriz.

Testleri yazdıktan sonra, bir kereliğine AWS Device Farm’ı ziyaret edip kendi Device Poolumuzu yani test için kullanacağımız cihazların bulunduğu bir havuz yaratmamız gerekmektedir. Ben Asus Nexus 7 ve Samsung Galaxy S7'den oluşan bir pool oluşturdum. Bunun yanında Jenkins üzerinden Device Farm’a erişebilmemiz için, Root kullanıcı yerine yeni bir kullanıcı oluşturup, ona Device Farm’a erişim yetkisi tanımlamalıyız. Sonrasında o kullanıcıya ait Access Key ve Secret Access Key’i Jenkins’e tanımlayarak, uzaktan Device Farm’a ulaşabilir hale geleceğiz.

Device Poolu oluşturduktan sonra, bir sunucu üzerinde kurduğumuz Jenkins’e AWS Device Farm pluginini kuruyoruz.

Sonrasında Test kodlarımızı, çalışmak istediğimiz Device Pool’u ve çalışacak uygulamanın .apk (Android olduğu için) dosyasını Jenkins’e tanımlamamız gerekmektedir. Böylece test otomasyonu çalışmaya hazır hale gelecektir.

Yukarıdaki çıktılar çalıştırdığımız test için sonuçları göstermektedir. Testin mp4 formatındaki videosundan ekran görüntülerine hatta loglara kadar pek çok test çıktısı listelenmiştir. Bunun dışında testin başarıyla tamamlandığını görüyoruz. Aşağıdaki görsel ise test sırasında alınan uygulamanın bir anına ilişkin ekran görüntüsüdür.

Aşağıdaki video login case’i için Device Farm üzerinden sağlanan testin çıktılarından bir diğeridir.

--

--