Appium ile Android Uygulamalarında Performans Testi

Mesut Beysülen
3 min readDec 2, 2020

--

Mobil uygulamaların değerlendirmesinde performans testleri…

Appium’u genellikle uygulamaların işlevselliğinin ve özelliklerinin doğru çalıştığını doğrulamak için kullanmaktayız. Ancak uygulamalarda işlevsel testlerin önemli olduğu kadar performans testleride eşit düzeyde önemlidir.

Kullanıcı deneyimini değerlendirmek ve test etmek için otomatik hale getirilmesi gereken bir başka test boyutunu yani performans testini, appium ile nasıl otomatik hale getirebiliriz bu yazıda bunu anlatacağım.

Performans, uygulamanızın kullanıcıya ne kadar duyarlı olduğudur ve ağ istek süresinden CPU ve bellek kullanımına kadar çeşitli özel faktörleri içerebilir.

Mobil uygulamalar, web ve masaüstü uygulamalardan daha fazla kaynağı daha kısıtlı ortamlarda çalıştırır. Ayrıca mobil uygulamalar, yalnızca uygulama açıkken kullanıcı için kötü bir deneyim yaratma potansiyeline sahip olmakla kalmaz, aynı zamanda CPU veya belleği tüketerek pil ömrünü kısaltabilir veya diğer uygulamaların yavaş çalışmasına neden olabilir. Bu nedenle, performans testi yapmak, yalnızca kendi kullanıcılarımız için en hızlı deneyimi sağlamak için değil, uygulama ekosisteminin iyi bir vatandaşı olmanın bir yoludur.

İşte tamda bu noktada, Appium kullanıcıları için her türlü ilginç performans verisine Appium API aracılığıyla ulaşabilmemizi sağlıyor. En azından bunu android de yapmaktadır.

adb dumpsys komutunun tüm bilgi zenginliklerini kullanabileceğimiz getPerformanceDatamethodu ile cpu, bellek, ağ trafiği ve pil gibi okunması desteklenen sistem durumu bilgilerini döndürmesini sağlayabiliyoruz. Bu komut ile uygulamamızın performansının tüm yönlerine kısa ve öz bir genel bakış sağlayabiliriz.

List<List<Object>> performanceData = driver.getPerformanceData("my.app.package","cpuinfo",5);

<my.app.package>uygulamanın paket ismi.

<cpuinfo>ne tür performans verileri istediğimizi yazdığımız alan.

5timeout bilgisini integer olarak girdiğimiz parametre.

Ayrıca, getSupportedPerformanceDataTypesmethodu ile cpu, bellek, ağ trafiği ve pil gibi okunması desteklenen sistem durumu bilgi türlerini döndürülmesini sağlayabiliriz.

List<String> performanceTypes = driver.getSupportedPerformanceTypes();

Burada dönen bazı parametreler şunlardır; cpuinfo, memoryinfo, batteryinfove networkinfo.

Bizim bu bilgiler ışığında odaklanacağımız nokta aslında uygulamamızın bellek kullanımı ve bu bellek kullanımı sonucunda oluşan sızıntıları tespit edebilmek. Bellek sızıntıları(memory leak) birçok uygulamanın karşılaştığı sorun olmuştur. Garbage-collected ortamda android uygulamaların çalışması, belleğin kullanılamadığı durumda kilitlenme gibi sorunlara yol açacaktır.

List<List<Object>> data = driver.getPerformanceData("com.pozitron.hepsiburada", "memoryinfo", 10);

Uygulamamızın hepsiburada olduğunu düşünürsek, memory bilgisini çekeceğimiz çağrımız yukarıdaki gibi olacaktır.

Döndürülen şey iki listeden oluşan bir küme olucaktır. İlk liste anahtarlar(key) ve diğeri de değerler(value). Yukarıdaki çağrıyı, aradığımız belirli türdeki bellek bilgilerini sorgulamayı kolaylaştıran bir method olarak yazabiliriz.(tabii ki, projemizin içinde verileri tutmak için bir sınıf yapabiliriz.)

public class PerformanceTest {

private static int MEMORY_CAPTURE_WAIT = 10;
private static String PKG = "com.pozitron.hepsiburada";
private static String PERF_TYPE = "memoryinfo";

public HashMap<String, Integer> getMemoryInfo(AndroidDriver driver) throws Exception {
List<List<Object>> data = driver.getPerformanceData(PKG, PERF_TYPE, MEMORY_CAPTURE_WAIT);
HashMap<String, Integer> readableData = new HashMap<>();
for (int i = 0; i < data.get(0).size(); i++) {
int val;
if (data.get(1).get(i) == null) {
val = 0;
} else {
val = Integer.parseInt((String) data.get(1).get(i));
}
readableData.put((String) data.get(0).get(i), val);
}
return readableData;
}
}

Artık yukarıdaki sınıf ile memoryinfo değerlerine ulaşabiliyoruz. Peki bu memoryInfo içinde neler var? İşte bunu öğrenmeniz için aşağıya 2 link bırakıyorum inceleyiniz.

Bizim burada kullancağımız önemli değer totalPss.

totalPss bellek kullanımını kB cinsinden vermesi için memoryinfo’ dan isteyeceğimiz bir parametre.

Kısa ve net bir şekilde, totalPss uygulamamızın RAM etkisini oldukça iyi bir ölçümü veren değerdir. Bu key parametreler aslında çok fazla ancak işin net anlaşılması adına bellek kullanımı üzerinden gitmemiz daha sağlıklı olacaktır.

Aşağıda örnek olarak nasıl kullandığımızı ve değerlerin karşılaştırmasını yaparak uygulamamızda gerçek bir performans ölçümü sağlamış olduk.

// get the usage at one point in time
int totalPss1 = PerformanceTest.getMemoryInfo(driver).get(PSS_TYPE);

// then get it again after waiting a while
try { Thread.sleep(MEMORY_USAGE_WAIT); } catch (InterruptedException ign) {}
int totalPss2 = PerformanceTest.getMemoryInfo(driver).get(PSS_TYPE);

// finally, verify that we haven't increased usage more than 5%
Assert.assertEquals((double) totalPss2, Matchers.lessThan(totalPss1 * 1.05));

Buradaki amaç, bir sayfada image görüntüleniyor. Biz bu sayfayı ilk açtığımızda bellek kullanım miktarınının anlık miktarını alıyoruz. Daha sonra 30 sn kadar bekleyip tekrar ikinci bir anlık görüntü alıyoruz. Ve bu alınan ikinci bellek kullanımının ilk aldığımız anlık görüntüden çok fazla çıkmadığını iddia ediyoruz. Eğer %5 gibi bir orandan fazla değilse, bellek sızıntımızın olmadığını test etmiş oluyoruz.

Düşünsenize çok fazla image barındıran bir uygulamanız var ve bellek kullanımını etkileyen birçok faktöründe olduğunu biliyorsunuz. İşte tam bu durumları, kullanıcı deneyimlerini büyük ölçüde etkileyen sorunlarla işlevsel testte karşılaşmasak bile, böyle basit bir testte yakalayabiliriz.

Bir sonraki yazımızda görüşmek üzere…👋

--

--

Mesut Beysülen

Senior QA-Test Automation Engineer @MigrosOne, Ex @hepsiburada | Instructor on Youtube @mesutbeysulen