Android Uygulamaları için Kötü Huylu Test Yaratımı Yavuz Köroğlu Alper Şen Bilgisayar Mühendisliği Bölümü Boğaziçi Üniversitesi, İstanbul/Türkiye yavuz.koroglu@boun.edu.tr depend.cmpe.boun.edu.tr 12. Ulusal Yazılım Mühendisliği Sempozyumu (UYMS 18)
Günümüzde Android Kullanımı Ortalama her günümüzün 3 saati yukarıdaki gibi geçiyor!
Günümüzde Android Kullanımı Ortalama her günümüzün 3 saati yukarıdaki gibi geçiyor! Sürekli hata mesajları alıyoruz.
Günümüzde Android Kullanımı Ortalama her günümüzün 3 saati yukarıdaki gibi geçiyor! Sürekli hata mesajları alıyoruz.
Günümüzde Android Kullanımı Ortalama her günümüzün 3 saati yukarıdaki gibi geçiyor! Sürekli hata mesajları alıyoruz.
Günümüzde Android Kullanımı Ortalama her günümüzün 3 saati yukarıdaki gibi geçiyor! Sürekli hata mesajları alıyoruz.
Otomatik Android Grafik Kullanıcı Arayüzü (GKA) Test Araçları Monkey: Rastgele (Random) A 3 E: Derinlik-Öncelikli (Depth-First) SwiftHand: Model Tabanlı Derinlik-Öncelikli DynoDroid: Yanlı-Rastgele (Biased-Random) Sapienz: Arama-Tabanlı (Search-Based) Q-Öğrenme Tabanlı (QBE): Makine Öğrenmesi Tabanlı (Koroglu et. al Yayınlandığı Yer: ICST 18) Yukarıdaki Bütün Araçlar Az Sayıda Çökme Bulabiliyor Çözüm: Kötü Huylu Test Yaratımı na odaklanmak.
Kötü Huylu Test Yaratımı (KHTY) Aracının Bulduğu Bir Hata Otomatik Yaratılmış Test
Kötü Huylu Test Yaratımı (KHTY) Aracının Bulduğu Bir Hata Mutasyona Uğratılmış Test
Kötü Huylu Test Yaratımı (KHTY) Test Altındaki Uygulama Test Yaratım Aracı (QBE) Kötü Huylu Test Yaratımı (KHTY) Yeniden Çalıştırma Test Sonuçları İyi Huylu Test Kümesi + GKA Modeli Kötü Huylu Test Kümesi Test Sonuçları Şekil: Kötü Huylu Test Yaratımı (KHTY) Ana Fikir Ana Akış Var olan testleri mutasyona uğratarak test kümesini zenginleştirmek. 1 Test Kümesi ve GKA Modeli yaratımı. 2 Test Kümesi nin mutasyonu. 3 Test Kümesi nin tekrar çalıştırılması.
GKA Modeli (M) Genel olarak, Çoğu uygulamanın bir modeli bulunmamaktadır. Uygulama modelinin dinamik olarak üretilmesi. Bu model Genişletilmiş Etiketli Durum-Geçiş Sistemi (GEDGS) dir. Bu modelde, 1 Düğümler (nodes) GKA durumlarını temsil eder. 2 Ayrıtlar (edges) GKA eylemlerini temsil eder.
GKA Durumu (v) 1 Java Paket İsmi 2 Aktivite İsmi (Bir aktivite yaklaşık olarak bir Android ekranına karşılık gelir) 3 Bağlamsal Özellikler (WiFi, Oryantasyon vb.) 4 Ekrandaki GKA Bileşenleri
GKA Eylemi (z) Kullanıcının tetiklediği olaylar: metin, tıklama, kaydırma vb. } {{ } text } {{ } click } {{ } swipe
Otomatik Test Yaratım Platformu Q-Öğrenme Yardımlı Test Yaratımı (QBE) Tam-Otomatik, Kara-Kutu, Model Öğrenme, ve Makine Öğrenmesi ile yönlendirilen bir tekrarlanabilir test yaratım platformudur. Önemli KHTY aracını QBE üzerine inşa ettik. _ yenidenbaşlatmak v1 tıklama tıklama v2 metin1 metin2 v1' tıklama tıklama v2' v1'' tıklama tıklama v2'' metin1 metin2 v1''' tıklama v3 Şekil: Örnek Yahtzee Uygulaması Modeli
KHTY için Tanımlar İşleç (Mutation Operator - δ) Bir test örneği alan ve yeni bir test örneği dönen aşağıdaki gibi bir fonksiyondur. δ(t) = t
KHTY için Tanımlar İşleç (Mutation Operator - δ) Bir test örneği alan ve yeni bir test örneği dönen aşağıdaki gibi bir fonksiyondur. δ(t) = t Test Örneği (Test Case - t) GKA modelinin ilk durumundan (v 0 ) başlayan bir durum-geçişler dizisidir.
KHTY için Tanımlar İşleç (Mutation Operator - δ) Bir test örneği alan ve yeni bir test örneği dönen aşağıdaki gibi bir fonksiyondur. δ(t) = t Test Örneği (Test Case - t) Durum-Geçiş (Transition - v i, v i+1, z i, d i ) 1 v i : Önceki Durum 2 v i+1 : Sonraki Durum 3 z i : Eylem 4 d i : Süre (saniye) GKA modelinin ilk durumundan (v 0 ) başlayan bir durum-geçişler dizisidir.
KHTY için Tanımlar Örnek Durum-Geçiş (Transition - v i, v i+1, z i, d i ) 1 v i : Önceki Durum 2 v i+1 : Sonraki Durum 3 z i : Eylem 4 d i : Süre (saniye) Örnek 1 (_, v1, y.başlat, 15)
KHTY için Tanımlar Örnek Durum-Geçiş (Transition - v i, v i+1, z i, d i ) 1 v i : Önceki Durum 2 v i+1 : Sonraki Durum 3 z i : Eylem 4 d i : Süre (saniye) Örnek 1 (_, v1, y.başlat, 15) 2 (v1, v1, metin1, 1)
KHTY için Tanımlar Örnek Durum-Geçiş (Transition - v i, v i+1, z i, d i ) 1 v i : Önceki Durum 2 v i+1 : Sonraki Durum 3 z i : Eylem 4 d i : Süre (saniye) Örnek 1 (_, v1, y.başlat, 15) 2 (v1, v1, metin1, 1) 3 (v1, v2, tıkla, 2)
İşleçler M1 Döngü Stresleme: Tüm döngüsel eylemleri tekrarlamak. M2 Durdur-Başlat: Bütün ardışık eylem ikililerinin arasına durdur-başlat eklemek. M3 Yazı Değiştirme: Rastgele bir metin eylemini anormal bir metinle değiştirmek. M4 Bağlamsal Durum Değiştirme: Rastgele ardışık eylem ikilileri arasında bağlamsal durumu değiştirmek. (Toggle WiFi, GPS, Bluetooth etc.) M5 Beklemeleri Kaldırma: Tüm süreleri sıfıra eşitlemek. M6 Hızla Kaydırmak: Tüm kaydırma eylemlerini olabildiğince hızlandırmak.
İşleçler M1 Döngü Stresleme: Tüm döngüsel eylemleri tekrarlamak.
İşleçler M1 Döngü Stresleme: Tüm döngüsel eylemleri tekrarlamak. Örnek: t = (_, v1, y.başlat, 15), (v1, v1, tıkla, 2), (v1, v2, kaydır "500", 2), (v2, v2, geri, 2)
İşleçler M1 Döngü Stresleme: Tüm döngüsel eylemleri tekrarlamak. Örnek: t = (_, v1, y.başlat, 15), (v1, v1, tıkla, 2), (v1, v2, kaydır "500", 2), (v2, v2, geri, 2) δ(t) = (_, v1, y.başlat, 15), (v1, v1, tıkla, 1) m, (v1, v2, kaydır "500", 2), (v2, v2, geri, 1) m
İşleçler M1 Döngü Stresleme: Tüm döngüsel eylemleri tekrarlamak. M2 Durdur-Başlat: Bütün ardışık eylem ikililerinin arasına durdur-başlat eklemek.
İşleçler M1 Döngü Stresleme: Tüm döngüsel eylemleri tekrarlamak. M2 Durdur-Başlat: Bütün ardışık eylem ikililerinin arasına durdur-başlat eklemek. Örnek: t =..., (v1, v2, tıkla, 2), (v2, v3, sürükle "500", 2)
İşleçler M1 Döngü Stresleme: Tüm döngüsel eylemleri tekrarlamak. M2 Durdur-Başlat: Bütün ardışık eylem ikililerinin arasına durdur-başlat eklemek. Örnek: t =..., (v1, v2, tıkla, 2), (v2, v3, sürükle "500", 2) δ(t) =..., (v1, v2, tıkla, 2, ), (v2, _, uyku kapa, 2), (_, v2, uyku aç, 2), (v2, v3, kaydır "500", 2)
İşleçler M1 Döngü Stresleme: Tüm döngüsel eylemleri tekrarlamak. M2 Durdur-Başlat: Bütün ardışık eylem ikililerinin arasına durdur-başlat eklemek. M3 Yazı Değiştirme: Rastgele bir metin eylemini anormal bir metinle değiştirmek.
İşleçler M1 Döngü Stresleme: Tüm döngüsel eylemleri tekrarlamak. M2 Durdur-Başlat: Bütün ardışık eylem ikililerinin arasına durdur-başlat eklemek. M3 Yazı Değiştirme: Rastgele bir metin eylemini anormal bir metinle değiştirmek. Örnek: t =..., (v1, v1, metin "www.url.com", 4),...
İşleçler M1 Döngü Stresleme: Tüm döngüsel eylemleri tekrarlamak. M2 Durdur-Başlat: Bütün ardışık eylem ikililerinin arasına durdur-başlat eklemek. M3 Yazı Değiştirme: Rastgele bir metin eylemini anormal bir metinle değiştirmek. Örnek: t =..., (v1, v1, metin "www.url.com", 4),... δ(t) =..., (v1, v1, metin ".", 4),...
İşleçler M1 Döngü Stresleme: Tüm döngüsel eylemleri tekrarlamak. M2 Durdur-Başlat: Bütün ardışık eylem ikililerinin arasına durdur-başlat eklemek. M3 Yazı Değiştirme: Rastgele bir metin eylemini anormal bir metinle değiştirmek. M4 Bağlamsal Durum Değiştirme: Rastgele ardışık eylem ikilileri arasında bağlamsal durumu değiştirmek. (Toggle WiFi, GPS, Bluetooth etc.)
İşleçler M1 Döngü Stresleme: Tüm döngüsel eylemleri tekrarlamak. M2 Durdur-Başlat: Bütün ardışık eylem ikililerinin arasına durdur-başlat eklemek. M3 Yazı Değiştirme: Rastgele bir metin eylemini anormal bir metinle değiştirmek. M4 Bağlamsal Durum Değiştirme: Rastgele ardışık eylem ikilileri arasında bağlamsal durumu değiştirmek. (Toggle WiFi, GPS, Bluetooth etc.) Örnek: t =..., (v1, v2, tıkla, 2), (v2, v3, kaydır "500", 2),...
İşleçler M1 Döngü Stresleme: Tüm döngüsel eylemleri tekrarlamak. M2 Durdur-Başlat: Bütün ardışık eylem ikililerinin arasına durdur-başlat eklemek. M3 Yazı Değiştirme: Rastgele bir metin eylemini anormal bir metinle değiştirmek. M4 Bağlamsal Durum Değiştirme: Rastgele ardışık eylem ikilileri arasında bağlamsal durumu değiştirmek. (Toggle WiFi, GPS, Bluetooth etc.) Örnek: t =..., (v1, v2, tıkla, 2), (v2, v3, kaydır "500", 2),... δ(t) =..., (v1, v2, tıkla, 2), (v2, v2, GPS değiştir, 2), (v2, v3, kaydır "500", 2),...
İşleçler M1 Döngü Stresleme: Tüm döngüsel eylemleri tekrarlamak. M2 Durdur-Başlat: Bütün ardışık eylem ikililerinin arasına durdur-başlat eklemek. M3 Yazı Değiştirme: Rastgele bir metin eylemini anormal bir metinle değiştirmek. M4 Bağlamsal Durum Değiştirme: Rastgele ardışık eylem ikilileri arasında bağlamsal durumu değiştirmek. (Toggle WiFi, GPS, Bluetooth etc.) M5 Beklemeleri Kaldırma: Tüm süreleri sıfıra eşitlemek.
İşleçler M1 Döngü Stresleme: Tüm döngüsel eylemleri tekrarlamak. M2 Durdur-Başlat: Bütün ardışık eylem ikililerinin arasına durdur-başlat eklemek. M3 Yazı Değiştirme: Rastgele bir metin eylemini anormal bir metinle değiştirmek. M4 Bağlamsal Durum Değiştirme: Rastgele ardışık eylem ikilileri arasında bağlamsal durumu değiştirmek. (Toggle WiFi, GPS, Bluetooth etc.) M5 Beklemeleri Kaldırma: Tüm süreleri sıfıra eşitlemek. Örnek: t =..., (v1, v2, kaydır "500", 2),...
İşleçler M1 Döngü Stresleme: Tüm döngüsel eylemleri tekrarlamak. M2 Durdur-Başlat: Bütün ardışık eylem ikililerinin arasına durdur-başlat eklemek. M3 Yazı Değiştirme: Rastgele bir metin eylemini anormal bir metinle değiştirmek. M4 Bağlamsal Durum Değiştirme: Rastgele ardışık eylem ikilileri arasında bağlamsal durumu değiştirmek. (Toggle WiFi, GPS, Bluetooth etc.) M5 Beklemeleri Kaldırma: Tüm süreleri sıfıra eşitlemek. Örnek: t =..., (v1, v2, kaydır "500", 2),... δ(t) =..., (v1, v2, kaydır "500", 0),...
İşleçler M1 Döngü Stresleme: Tüm döngüsel eylemleri tekrarlamak. M2 Durdur-Başlat: Bütün ardışık eylem ikililerinin arasına durdur-başlat eklemek. M3 Yazı Değiştirme: Rastgele bir metin eylemini anormal bir metinle değiştirmek. M4 Bağlamsal Durum Değiştirme: Rastgele ardışık eylem ikilileri arasında bağlamsal durumu değiştirmek. (Toggle WiFi, GPS, Bluetooth etc.) M5 Beklemeleri Kaldırma: Tüm süreleri sıfıra eşitlemek. M6 Hızla Kaydırmak: Tüm kaydırma eylemlerini olabildiğince hızlandırmak.
İşleçler M1 Döngü Stresleme: Tüm döngüsel eylemleri tekrarlamak. M2 Durdur-Başlat: Bütün ardışık eylem ikililerinin arasına durdur-başlat eklemek. M3 Yazı Değiştirme: Rastgele bir metin eylemini anormal bir metinle değiştirmek. M4 Bağlamsal Durum Değiştirme: Rastgele ardışık eylem ikilileri arasında bağlamsal durumu değiştirmek. (Toggle WiFi, GPS, Bluetooth etc.) M5 Beklemeleri Kaldırma: Tüm süreleri sıfıra eşitlemek. M6 Hızla Kaydırmak: Tüm kaydırma eylemlerini olabildiğince hızlandırmak. Örnek: t =..., (v1, v2, kaydır "500", 2),...
İşleçler M1 Döngü Stresleme: Tüm döngüsel eylemleri tekrarlamak. M2 Durdur-Başlat: Bütün ardışık eylem ikililerinin arasına durdur-başlat eklemek. M3 Yazı Değiştirme: Rastgele bir metin eylemini anormal bir metinle değiştirmek. M4 Bağlamsal Durum Değiştirme: Rastgele ardışık eylem ikilileri arasında bağlamsal durumu değiştirmek. (Toggle WiFi, GPS, Bluetooth etc.) M5 Beklemeleri Kaldırma: Tüm süreleri sıfıra eşitlemek. M6 Hızla Kaydırmak: Tüm kaydırma eylemlerini olabildiğince hızlandırmak. Örnek: t =..., (v1, v2, kaydır "500", 2),... δ(t) =..., (v1, v2, kaydır "0", 2),...
İşleçler M1 Döngü Stresleme: Tüm döngüsel eylemleri tekrarlamak. M2 Durdur-Başlat: Bütün ardışık eylem ikililerinin arasına durdur-başlat eklemek. M3 Yazı Değiştirme: Rastgele bir metin eylemini anormal bir metinle değiştirmek. M4 Bağlamsal Durum Değiştirme: Rastgele ardışık eylem ikilileri arasında bağlamsal durumu değiştirmek. (Toggle WiFi, GPS, Bluetooth etc.) M5 Beklemeleri Kaldırma: Tüm süreleri sıfıra eşitlemek. M6 Hızla Kaydırmak: Tüm kaydırma eylemlerini olabildiğince hızlandırmak.
Vaka Çalışmaları Tuşlara tıklandığında ses çıkarmaktadır. (M1) Döngü-Stresleme uygulanmıştır. audioflinger kütüphanesini çökertmiştir. Sonuç: Sistem ses çıkaramaz hale gelmiştir. Şekil: Soundboard
Vaka Çalışmaları Şekil: A2DPVol Bluetooth Uygulaması. Normalde bluetooth kapalı. (M4) Bağlamsal Durum Değiştirme uygulanmıştır. Sonuç: "Find Devices" tuşu uygulamayı çökertmiştir.
Vaka Çalışmaları Şekil: A2DPVol Bluetooth Uygulaması. Normalde bluetooth kapalı. (M4) Bağlamsal Durum Değiştirme uygulanmıştır. Sonuç: "Find Devices" tuşu uygulamayı çökertmiştir.
Vaka Çalışmaları Orjinal test örneği bir uyarı mesajı açığa çıkarmıştır. (ÇÖKME DEĞİL) (M2) Durdur-Başlat uygulanmıştır. Sonuç: Çökme. Şekil: Import Contacts
Vaka Çalışmaları Orjinal test örneği bir uyarı mesajı açığa çıkarmıştır. (ÇÖKME DEĞİL) (M2) Durdur-Başlat uygulanmıştır. Sonuç: Çökme. Şekil: Import Contacts
Vaka Çalışmaları Orjinal test örneği bir uyarı mesajı açığa çıkarmıştır. (ÇÖKME DEĞİL) (M2) Durdur-Başlat uygulanmıştır. Sonuç: Çökme. Şekil: Import Contacts
Vaka Çalışmaları Orjinal test örneği bir uyarı mesajı açığa çıkarmıştır. (ÇÖKME DEĞİL) (M2) Durdur-Başlat uygulanmıştır. Sonuç: Çökme. Şekil: Import Contacts
Vaka Çalışmaları Takvim uygulaması. URL kutucuğu bir web sitesi adresi beklemektedir. (M3) Yazı Değiştirme uygulanmıştır. Sonuç: Çökme. Şekil: acal
Vaka Çalışmaları Takvim uygulaması. URL kutucuğu bir web sitesi adresi beklemektedir. (M3) Yazı Değiştirme uygulanmıştır. Sonuç: Çökme. Şekil: acal
Vaka Çalışmaları Takvim uygulaması. URL kutucuğu bir web sitesi adresi beklemektedir. (M3) Yazı Değiştirme uygulanmıştır. Sonuç: Çökme. Şekil: acal
Vaka Çalışmaları Haber uygulaması. WiFi kapalı. Uygulama uyarı vermektedir. (M4) Bağlamsal Durum Değiştirme uygulanmıştır. Sonuç: Herhangi bir başlık seçildiğinde çökmüştür. Şekil: Mirrored
Vaka Çalışmaları Haber uygulaması. WiFi kapalı. Uygulama uyarı vermektedir. (M4) Bağlamsal Durum Değiştirme uygulanmıştır. Sonuç: Herhangi bir başlık seçildiğinde çökmüştür. Şekil: Mirrored
Vaka Çalışmaları Haber uygulaması. WiFi kapalı. Uygulama uyarı vermektedir. (M4) Bağlamsal Durum Değiştirme uygulanmıştır. Sonuç: Herhangi bir başlık seçildiğinde çökmüştür. Şekil: Mirrored
Açıklayıcı Örnek _ başlat v1 geri tıkla geri menü geri v2 v3 QBE, soldaki modeli öğrenirken bir İyi Huylu test yaratmıştır.
Açıklayıcı Örnek _ başlat v1 geri tıkla geri menü geri v2 v3 Bu test örneğine rastgele mutasyonlar uygulanmıştır.
Açıklayıcı Örnek _ başlat v1 geri tıkla geri menü geri v2 v3 Kötü huylu test örneklerinin ikisi de çökmüştür.
Deney Ortamı 14 x Android-x86 VirtualBox (Android 4.4.r5 kurulu) F-Droid uygulamaları arasından rastgele seçilmş 100 Android uygulması. Zaman içinde değişen farklı çökme sayısı gözlemlenmiştir. Yöntem: Çökmelerin farklılığını yığın izlerine (stack trace) bakarak otomatik belirleme. Her araçla her uygulma için 20 şer dakika. KHTY, QBE, Sapienz, Monkey, PUMA, ve A 3 E. KHTY için, 1 10 dakika, QBE ile test örneği yaratımı. 2 10 dakika, KHTY ile yaratılmış kötü huylu testlerin çalıştırılması.
Deneyler # Çökmeler 0 5 10 15 20 25 30 KHTY : 29 çökme QBE : 18 çökme SAPIENZ : 12 çökme MONKEY : 10 çökme PUMA : 6 çökme A3E : 4 çökme 0 200 400 600 800 1000 1200 Süre (saniye) Şekil: 20 Dakika İçinde Tespit Edilmiş Farklı Çökme Sayısı
Sonuç Özet Kötü Huylu Test Yaratımı yöntemi. Android GKA testi için 6 işleç ile mutasyon. Orjinal test örnekleri QBE kullanılarak otomatik bir şekilde elde edilmesi. Vaka çalışmaları ve deneylerle KHTY nin etkililiğinin gösterilmesi. Gelecek Çalışmalar Daha fazla GKA eylemi (rotasyon, çift-tıklama vb.). Rastgele yerine çökme sıklıklarına bağlı mutasyon seçimi. QBE ve KHTY için en uygun zamanlamaları bulmak.
Teşekkürler...
Ek A: GKA Eylemleri Listesi (List of GUI Actions) Tablo: GKA Eylemleri Listesi Bağlamsal olmayan Param1 Param2 Param3 Param4 Param5 tıklama x y - - - uzuntıklama x y - - - metin x y yazı - - kaydırma x1 y1 x2 y2 süre menü - - - - - geri - - - - - Bağlamsal bağlanırlık bluetooth konum uçuşmodu uyku Parametre açık/kapalı/değiştir açık/kapalı/değştir gps/gps&ağ/kapalı/değiştir açık/kapalı/değiştir açık/kapalı/değiştir Özel Param1 Param2 Param3 Param4 Param5 yenidenbaşlatmak paket aktivite - - -
Ek B: Model Öğrenme Eylem: yenidenbaşlatmak com.tum.yahtzee MainActivity _ yenidenbaşlatmak v1
Ek B: Model Öğrenme Eylem: tıklama 200 390 (tıklama play) _ yenidenbaşlatmak v1 tıklama v2
Ek B: Model Öğrenme Eylem: tıklama 200 410 (tıklama ok) _ yenidenbaşlatmak v1 tıklama tıklama v2
Ek B: Model Öğrenme Eylem: metin 200 270 12345 (metin1) _ yenidenbaşlatmak v1 tıklama tıklama v2 metin1
Ek B: Model Öğrenme Eylem: yenidenbaşlatmak com.tum.yahtzee MainActivity _ yenidenbaşlatmak v1 tıklama tıklama v2 metin1
Ek B: Model Öğrenme Eylem: metin 200 270 12345 (metin1) _ yenidenbaşlatmak v1 tıklama tıklama v2 metin1
Ek B: Model Öğrenme Eylem: metin 200 330 12345 (metin2) _ yenidenbaşlatmak v1 tıklama tıklama v2 metin1,metin2
Ek B: Model Öğrenme Eylem: tıklama 200 390 (tıklama play) _ yenidenbaşlatmak tıklama v1 tıklama tıklama v2 v3 metin1,metin2
Ek B: Model Öğrenme Eylem: tıklama 200 390 (tıklama play) _ yenidenbaşlatmak v1 tıklama tıklama v2 v3 metin1 metin2 tıklama v1'