Javada Page Object Model ile Android Test Otomasyonu

Irem Uludirik
6 min readDec 24, 2021

--

Herkese merhabalar! Bu yazımda Page Object Model ile Android Simülatör test otomasyonu Javada nasıl yapılır, adım adım deneyim ve tecrübelerim ile bahsedeceğim.

Keyifli okumalar dilerim! :)

Kullanacağımız Teknoloji ve Toollar

Appium, bir web sürücüsü kullanarak Android veya iOS’ta komut dosyalarını çalıştırmak ve yerel uygulamaları, mobil web uygulamalarını ve hibrit uygulamaları test etmek için açık kaynaklı bir otomasyon aracıdır.

Appium Server uygulama üzerinde test otomasyon yapılmasına yani testin koşulmasına olanak sağlar. Şuradaki linkten bilgisayarınıza uygun versiyonunu indirebilirsiniz. Ardından komut satırımıza npm install -g appium ve npm install wd yazalım ve kurulsun. appium & yazdığımızda da, sürümünü göreceğiz.

Appium ServerGUI kurulumu tamamlandıktan sonra, Edit config. diyelim
Çıkan kutucukta androidimizin (C:\Users\irem6.DESKTOP-8MQ14NE\AppData\Local\Android\Sdk) ve javamızın (C:\Program Files\Java\jdk1.8.0_202\bin) kurulu olduğu pathleri yazmamız gerekiyor. Bu pathler ortam değişkenleri içerisinde de bulunmalı unutmayalım. Ardından Save and Restart diyelim
Ayriyetten, ortam değişkenimize android pathimizin içerisinde bulunan platform-tools klasörümüzü de tanımlamamız gerekiyor. Komut satırımıza adb devices yazıp enterladığımızda platform-tools içerisindeki adb’ye ulaşması gerek → C:\Users\irem6.DESKTOP-8MQ14NE\AppData\Local\Android\Sdk\platform-tools

Appium Inspector, uygulama üzerindeki bütün UI elementlerin inspect edilmesinde ve alınmasında kullanılmasına olanak sağlar. Şuradaki linkten bilgisayarınıza uygun versiyonu indirip kurabilirsiniz.

Açtığımızda, Remote Path karşılığında /wd/hub yazalım. Yoksa hata alırız… Ardından Desired Capabilities kısmını dolduralım. Öncelikle platformName’i belirtmemiz gerek, sonrasında nasıl ve ne ile çalışacaksanız belirtebilirsiniz. Appium Desired Capabilities hakkında detaylı bilgi için şuraya link bırakıyorum. Daha sonra kaydedip isim verebilirsiniz.

Android Studio, yazılımcılar için geliştirilmiş bir ortamdır. Bu ortamda yazılımcılar Android işletim sistemine sahip cihazlara uygun uygulamalar oluşturabilmektedir. Bu uygulamaların test süreci de yine Android Studio içinde gerçekleştirilebilir. Android Studio, IntelliJ IDEA’ya dayalı olup Android geliştirme için özel olarak tasarlanmıştır. Şuradaki linkten bilgisayarınıza uygun versiyonunu indirebilirsiniz.

SDK Manager’a basalım, Pathlerimizde de belirttiğimiz gibi
Release (R) olan bir sürüm indirip çalışabiliriz. İstersek daha çıkmamış sürümler üzerinde de çalışabiliriz. ben Android 11'i seçtim ve Apply diyelim ki indirsin.
AndroidVirtualDevice Manager’a basalım. Çıkan kutucukta Create diyelim
Çıkan ekranda ben Nexus 5 isimli telefonu seçtip next dedik (burası size kalmış)- sonradan değiştirilebilir
Next diyerek ilerleyelim ve isim koyup Finish diyelim
Play diyelim de telefonumuz gelsin
Telefonumuz şu şekilde ekranda belirdi değil mi :) (google pixel 3)
adb devices dediğimizde bizim device’ımız geliyor artık
Inspector üzerinden Start diyelim. Şu şekilde bir ekran karşımıza çıkacak

Evet… Her şey yolunda gibi. Şimdi testimizi gerçekleştirmek için, istediğimiz bir uygulamanın APK’sını indirmemiz gerekecek. Bunun için şuradaki linke göz atabilirsiniz. Ben herkesin hikaye yazabileceği bir uygulama olan Wattpad’i seçtim ve indirdim.

Inspector’ımızda bu app’i telefonumuza yükleyebilmek için: app — text — ( app’in full path’i) gerekli olacak. Görselde belirttiğim şekilde dolduralım.
deviceName olarak da komut satırınca adb devices yolladıktan sonra karşımıza gelen cevabı yazıyoruz. Ardından Start Session’a basalım.
Eğer birebir ekranlar aynı olmazsa, yukarıdaki refresh butonuna basarak çözebilirsiniz
1 → Tab: Click | 2 → Send Keys: yazı yazarken kullanılır | 3 → clear: yazılanı temizler
1 → Native App Mode : Mobil modu diyebiliriz | 2 → Web ve Hybrit App Mode : Web ve hibrit modu diyebiliriz | 3 → Select elements : ekrandaki elemanları seçer | 4→ Swipe by coordinates: ekranı koordinatlara göre aşağı yukarı hareket ettirmemizi sağlar | 5→ Send Keys: yazı yazarken kullanılır | 6 → Back: Bir önceki sayfaya geçmemizi sağlar| 7 → Reflesh source and screenchot: sayfayı yenilememizi ve ekran görüntüsü almamızı sağlar| 8→ Start recording: kayda başlatır | 9 → Search for element: xml içerisindeki selectorlerimizi aratabiliriz | 10 → Copy xml source: xml kaynağını kopyalar | 11→ Quit : kapatır
Mesela Join for free’e basıp test edeceğiz. Bunun için, oraya tıklıyoruz (ya da ortada bulunan xml’den arayıp Tab’a basıyoruz). Bu şekilde testimizi ilerleteceğiz.

IntelliJ IDEA, Java’da bilgisayar yazılımı geliştirmek için kullanılan bir tümleşik geliştirme ortamıdır. Şuradaki linkten bilgisayarınıza uygun versiyonunu indirebilirsiniz. Community seçmeniz bizim için yeterli olacaktır.

IntelliJ Idea üzerinden, New Project diyelim ve Java 1.8- Maven projesi oluşturalım. Ardından isim verip finish diyelim.

Dependencies:

Kopyalanan depencencie kodumuzu pom.xml dosyamıza, dependencies adı altına yapıştıralım.

Eklenmiş halleri
Java klasörünün altında tests diye bir klasör oluşturduk, ardından android adında class oluşturduk
Şu şekilde bir iskelet oluşturabiliriz.
driver’ımızı belirtelim. Bu işlemlerden sonra import kısmına eklenmesi gerek
Inspector içerisinde yazan kodumuzu da projemize tanımlamamız gerekiyor.
setup kısmına, json verilerimizi yukarıdaki formatta tanımlayabiliriz.
Ardından, pempe ile highlightladığım gibi driverimizi tanımlıyoruz. URL için kullandığımız local hostumuzu yazmamız gerekir. ip: port kullanıyoruz bunun için
Testin daha hızlı ayağa kalkması için fullReset false ve noResettrue ekliyoruz. Ardından autoGrantPermissions →true diyerek permissionsları otomatik olarak kabul etmiş oluyoruz. Bunun gibi bir çok hayat kurtarıcı capabilitieler için şu linke göz atarak referans alabilirsiniz.

Ön hazırlıklarımız bittiğine göre testimize başlayalım:

Inspector üzerinden start session’a basalıp. Ardından start recording diyelim

Bir şeyler kaydettik: sağ üst köşeden kaydedeceğimiz dili seçelim. Ardından yanında bulunan copy butonuna basalım ve IntelliJ Ideaya yapıştıralım.
  • Yukarıdaki testimizde, ilk önce Join for free butonuna basıyoruz. Pempe ile highlight yaptığım yerde XPath’inin uzun olduğunu görüyoruz. Kolaylık ve okunabilirlik açısından alternatifleri de mevcut, örneğin xpath’i text olarak yazabiliriz:
Üzerinde yazan text’e göre xpath çekebiliriz → //*[@text=’Join for free’] bu da bize aynı yeri verir
  • Ardından, testimizde e-mail, username, password giriyoruz. Bu işlemleri send keys butonuna basarak gerçekleştiriyoruz.
  • Fakat username’i bizden istemediği şekilde girelim ki, bakalım uyarı yazısı gelecek mi?
Passwordu yazdığımızda, bize yukarıda göründüğü gibi bir uyarı sembolü beliriyor.
  • Uyarı sembolünün üstüne tıkladığımızda da, yukarıda uyarı yazısı beliriyor.

Ben bu testte bu uyarı yazısını kontrol etmeyi hedefliyordum. Bunun için assert koydum:

Assert.assertTrue bize boolean döndürür. Eğer bizim son aşamamız displayed ise true olarak onaylanmış olacak. Onun varlığını orada kanıtlamış bulunuyoruz.

Şimdi gelelim testimize:

Bu aşamaya geldiğimizde, uyarı ikonu ve yazısına kolay ulaşabilmek için:
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
yazarak testin biraz beklemesini sağladım.

Daha kısa ve okunaklı bir kod için: aynı olan kodları bir değişkene (auth) atadım ve ardından bu değişkeni + ile devamında ne varsa onunla bağladım
Testimizi koştuğumuzda, başarılı bir şekilde geçtiğini görüyoruz :)

Page Object Model (POM)

Page Object Model, yani kısaca POM, kod tekrarını azaltmada faydalıdır ve test senaryosu bakımını iyileştirir. Bir uygulamanın her web sayfasını bir sınıf dosyası olarak düşünebiliriz.

Şimdi yazdığımız testi (android adı) POM ile düzenleyelim ve daha fonksiyonel bir hale getirelim.

Şu şekilde bir Pages klasörü oluşturalım ve BasePage, SignInPage classlarını oluşturalım. Ardından tests klasörüne de BaseTest ve SignInTest diye classlarımızı açalım
BaseTest içerisine → Testimizin ana hatlarını (driver, before, after vs.) görseldeki gibi taşıyacağız.
SignInTest içerisine → Testimizi/ Testlerimizi taşıyalım. Ve driver, auth gibi başka yerde tanımladığımız elementleri çağırmak için → pembe ile highlight ettiğim yer gibi: extends (neredeyse orasının adı) şeklinde yazalım → extends BaseTest. Birden fazla testimiz var ise: bu testlere öncelik sırası verebilmek için, testNG’nin bir özelliği olan priority’yi ve ardıncan hangi sıralama ile çalışacaksa onu @Test ‘in yanına parantez içerisinde, yeşil ile highlight ettiğim şekilde yazalım → (priority = 0)
BasePage → driver’i taşıyabiliriz.
SignInPage → Burada ilk önce BasePage’den extends yaparak driverımızı çağıralım (pembe highlight). Sonra, AndroidDriver’ı driver olarak tanımlayalım ve artık super driverımız oluştu (her yerde kullanıldığı için) (yeşil highlight). Sonra, Testimizin içerisinde bulunan ve kullanılan stringleri wrongSignInWithCredentials adı altında parantez içerisinde tanımlayalım ardından steplerimize entegre edelim (sarı highlight). Ayrıca auth’u tanımlayayı unutmayalım :)
REVİZE SignInTest → Burada kodumuzun tamamını taşımıştık. Ama artık 2–3 satır ile testimizi gerçekleştirebiliriz. Bunun için, görselde de görüldüğü gibi: SignInPage dosyasını çağırarak tanımlıyoruz (pembe highlight) ve buradan signInWithCredentials değerlerini giriyoruz (yeşil highlight).

Eğer signInPage üzerinden farklı elemanlar da kullanılacaksa . yazıp, (.signInWithCredentials gibi):

İlk önce:

SignInPage’de yer alan fonksiyonumuz void idi (kendi kendine dönebiliyordu). Oradaki void’i silip, yerine sayfanın adını yazıyoruz ve fonksiyonun en sonuna da return this; ekliyoruz.

Ardından başka bir fonksiyon içerisinde neyi . ile gösterip çağıracaksak, aynı adda ne yapacaksak o fonksiyonun içerisine yazıyoruz (bu fonksiyonda void kullanılabilir).

Örnek olarak bu fonksiyonu kullanacağız diyelim. Ve text kontrol edeceğiz diyelim:
SignInTest sayfasında, çağırırken bu şekilde gösterilebilir. Kontrol edeceğimiz testi de burada belirtiyoruz. Aynı email ve username’de lolduğu gibi

Bu yazımda Page Object Model ile Android Simülatör test otomasyonu Javada nasıl yapılır, adım adım deneyim ve tecrübelerim ile bahsetmeye çalıştım.

Appium Server, Appium Inspector, Android Studio kurulumları ve kullanımlarını, configuration düzenlemeyi, desired capabilities kullanımlarını, SDK ve AVD versiyon kurulum ve kullanımlarını, emulatör kullanımı, APK’ler ile çalışmayı, ilgili teknolojiler için dependencies kurulumlarını, Appium üzerinden test kaydı başlatıp istenilen dilde export edilmesini, ardından POM ile düzenlenip birbiri ile entegre edilmesini deneyimlerim ve tecrübelerim ile birlikte bir örnek üzerinden anlatmaya çalıştım.

Umarım faydası olur. İyi çalışmalar dilerim :)

--

--