Appium İle Cep Telefonu Uygulaması Testi

Gelişen teknoloji ile hayatımıza daha çok girmeye başlayan cep telefonları hepimizin nerdeyse olmazsa olmazı artık. Cep telefonu kullanımının artmasıyla da firmalar, son kullanıcıya daha çabuk ulaşabilmek ve kendilerini tanıtabilmek için web sayfalarının yanı sıra cep uygulaması da yapmaya başladılar. Tabii ki cep uygulamalarının artmasına paralel olarak bu uygulamaları geliştiren ekipler tarafından test ihtiyacı da artmaya başladı. Çünkü pek çok uygulama, neredeyse web sitesinde yapılan işlemlerin tamamını yapabilir seviyedeler. Buda tüm özelliklerin iyi test edilmesi gerektiğini anlamına geliyor. Çoğu yazılım geliştirme ekipleri artık geliştirdikleri ürünlerinin manuel testine ek olarak otomasyon testlerini de yaparak test kalitesini artırmaya çalışıyor. Peki bir cep telefonu uygulaması testinde hangi teknolojiyi kullanabiliriz?

Dünyada cep uygulaması testinde en çok tercih edilen araçlardan birisi Appium. Appium aslında selenium tabanlı ve cep telefonu uygulama testleri için geliştirilmiş açık kaynak kodlu bir test kütüphanesidir. Appium ile Android, IOS ve Windows uygulamaları için test kodu yazabilirsiniz. Ben örnek olarak bir android uygulaması üzerinde basit bir örnek yapacağım.

İlk önce selenium webdriver benzeri bir driver oluşturmamız gerekiyor. Bunu aşağıdaki şekilde yapıyoruz.

AppiumDriver <MobileElement> appiumDriver;

Daha sonra appium ile cep uygulamasında test yapabilmek için uygulamanın özelliklerini belirtmeniz gerekiyor. Bu özellikler nelerdir? Test koşulacak cihaz işletim sistemi (Android, IOS vs), işletim sistemi versiyon bilgisi, cihaz adı, uygulamanın açılması için kullanılacak başlangıç bilgileri gibi zorunlu yada testler sırasında öndeğer çalışmasını istediğiniz özellikler olabilir. Özellikleri, yine selenium kullananlar bilir DesiredCapabilities ile tanımlıyoruz. İnternetten bulduğum bir demo cep uygulamasına göre DesiredCapabilities’i aşağıdaki şekilde tanımlıyoruz. Eğer sizde deneyecekseniz bu özellikleri kendi uygulama ve cihaz bilgilerine göre değiştirip denemeniz gerekir.

        DesiredCapabilities caps = new DesiredCapabilities();
        caps.setCapability(MobileCapabilityType.PLATFORM_VERSION, "10.0");
        caps.setCapability(MobileCapabilityType.PLATFORM_NAME, "Android");
        caps.setCapability(MobileCapabilityType.DEVICE_NAME, "Android10");
        caps.setCapability(AndroidMobileCapabilityType.APP_PACKAGE,
                "com.touchboarder.android.api.demos");
        caps.setCapability(AndroidMobileCapabilityType.APP_ACTIVITY,
                "com.touchboarder.androidapidemos.MainActivity");
        caps.setCapability(MobileCapabilityType.NO_RESET, true);
        caps.setCapability(MobileCapabilityType.FULL_RESET, false);

Yukarıdaki özelliklerden NO_RESET ve FULL_RESET uygulama ilk açıldığında çıkan uyarıların bir kez izin verildikten sonra tekrar çıkmamasını sağlıyor. APP_PACKAGE ve APP_ACTIVITY uygulamanın ilk açılış bilgileri. Bu bilgilere cep telefonunuza APKINFO adlı uygulamayı kurup öğrenebilirsiniz. Daha sonra bu özellikleri ve Appium’un çalıştığı sunucu bilgisini driver’ımıza aşağıdaki şekilde tanıtıyoruz.

appiumDriver = new AndroidDriver(new URL("http://localhost:4723/wd/hub"), caps);

Evet artık test edeceğimiz uygulama üzerinde çalışmaya başlayabiliriz. Uygulamanın açıldığı ilk görüntü aşağıdaki gibidir.

Bu ekranda menüde ikinci sırada yer alan API Demos elemanına tıklayalım. Ben burada eleman nasıl bulunuru anlatmayacağım ama elemanın özelliklerini bulmak için Android Studio’nun UI Automator Viewer’ını kullandığımı söyleyebilirim. Yada yine Appium kurduktan sonra Appium Inspector ile de bulabilirsiniz. UI Automator Viewer ile elemanın özelliklerine aşağıdaki şekilde ulaşabiliriz.

Elemanı id ile bularak işlem yaptıracağım. Eleman, findElementByID ile bulunabilir ama bu örnekte aynı id’li birden fazla eleman olduğu için findElementsById ile hepsini önce bir liste içine atıyorum. Daha sonra listeyi for döngüsü içine sokarak text özelliği API Demos olanı buldurup tıklama yaptıracağım.

List<MobileElement> elements = appiumDriver.findElementsById("android:id/text1");
        for (MobileElement element : elements) {
            System.out.println(element.getText());
            if (element.getText().equals("API Demos")) {
                element.click();
                break;
            }
        }

Menüden API Demos tıklandığında aşağıdaki ekranla karşılaşıyoruz.

Bu ekranda da Animation elemanına tıklayalım. Yine benzer şekilde bu ekrandaki elemanların id’leri yine aynı. Burada da elemana tıklamayı findElementsById ile liste yapıp, index numarası ile tıklayalım. Index numarasını yine UI Automator Viewer ile bulabilirsiniz.

appiumDriver.findElementsById("android:id/text1").get(1).click();

Aşağıdaki ekranda da Activity Transition elemanına bir önceki ile benzer şekilde bulup tıklayabiliriz.

appiumDriver.findElementsById("android:id/text1").get(0).click();

Şimdi açılan ekranda makas resmini buldurup tıklayalım.

Bu ekranda elemanların id’leri farklı olduğu için findElementById metodunu kullanabiliriz.

appiumDriver.findElementById("com.touchboarder.android.api.demos:id/scissors").click();

Makas resmine tıkladıktan sonra açılan aşağıdaki ekranda, bilgilerden Block elemanının içeriğini kontrol ettirelim.

Testlerde kontrol için genellikle junit assertion metodları kullanıldığı için bende kullanmak istiyorum. Yine elemanı buldurup text değerini aşağıdaki şekilde kontrol edeceğim. Bu kod elemanın text değeri Block değil ise hata verecektir. Aksi durumda test başarılı kabul edilir.

Assert.assertFalse("Bilgi hatalı", elementsByClassName.get(7).getText().equals("Block"));

Şimdi kodumuzun tamamı aşağıdaki şekilde çalıştırabiliriz. Ben menü tıklamaları arasına Thread.sleep() koydum çünkü ekran yenileme hızına göre elemanı yakalayamıyordu.

import io.appium.java_client.AppiumDriver;
import io.appium.java_client.MobileElement;
import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.remote.AndroidMobileCapabilityType;
import io.appium.java_client.remote.MobileCapabilityType;
import org.junit.Assert;
import org.openqa.selenium.remote.DesiredCapabilities;

import java.net.MalformedURLException;
import java.net.URL;
import java.util.List;

public class AppiumBlog {

    public static void main(String[] args) throws MalformedURLException, InterruptedException {

        AppiumDriver<MobileElement> appiumDriver;

        DesiredCapabilities caps = new DesiredCapabilities();
        caps.setCapability(MobileCapabilityType.PLATFORM_VERSION, "10.0");
        caps.setCapability(MobileCapabilityType.PLATFORM_NAME, "Android");
        caps.setCapability(MobileCapabilityType.DEVICE_NAME, "Android10");
        caps.setCapability(AndroidMobileCapabilityType.APP_PACKAGE,
                "com.touchboarder.android.api.demos");
        caps.setCapability(AndroidMobileCapabilityType.APP_ACTIVITY,
                "com.touchboarder.androidapidemos.MainActivity");
        caps.setCapability(MobileCapabilityType.NO_RESET, true);
        caps.setCapability(MobileCapabilityType.FULL_RESET, false);

        appiumDriver = new AndroidDriver(new URL("http://localhost:4723/wd/hub"), caps);

        List<MobileElement> elements = appiumDriver.findElementsById("android:id/text1");
        for (MobileElement element : elements) {
            if (element.getText().equals("API Demos")) {
                element.click();
                break;
            }
        }
        Thread.sleep(1000);
        appiumDriver.findElementsById("android:id/text1").get(1).click();
        Thread.sleep(1000);
        appiumDriver.findElementsById("android:id/text1").get(0).click();
        Thread.sleep(1000);
        appiumDriver.findElementById("com.touchboarder.android.api.demos:id/scissors").click();
        Thread.sleep(1000);
        List<MobileElement> values = appiumDriver.findElementsByClassName("android.widget.TextView");
        Assert.assertFalse("Bilgi hatalı", values.get(7).getText().equals("Block"));

        Thread.sleep(2000);
        appiumDriver.closeApp();
    }
}

Evet, böylece bir cep telefonu uygulamasını nasıl test edeceğimizi basit ve kısa yolla anlatmaya çalıştım. Faydalı olması dileği ile…



Leave a comment