iOS/Android Web Sunucu İstekleri-Unit Test

Umut Boz
KoçSistem
Published in
4 min readSep 15, 2021

Uygulama geliştirme süreçlerimizde Unit Test yazmaya Neden ihtiyaç duyduğumuzu, Unit Test geliştirme faydalarını ve yazılım geliştirme süreçlerini nasıl kolaylaştırdığı konusunu uzun uzun ele almayacağım. Bu yazıda Native Mobil(iOS&Android) uygulama geliştirme ortamlarından, uzak web sunucu isteklerini Unit Test ile nasıl gerçekleştireceğimizi inceleyeceğiz. Çalışmada Native iOS için Swift programlama dili ile, Native Android için ise Java ve Kotlin ile Unit Test örneklerini bulabilirsiniz.

Sırasıyla alfabetik olarak 😎 Native Android için Java ve Kotlin olmak üzere iki farklı programlama dili ile daha sonrasında Native iOS platformunda Swift programlama dili ile http request işlemini unit test nasıl doğrulayacağımızı ele alacağız.

Postman, Swagger gibi ortamlar üzerinde yapmış olacağınız http çağrılar, ilgili ortam üzerindeki şartlara göre gerçekleşecektir. Uygulama geliştirme sürecinde web api, web servislerde gerçekleşecek olan yapısal değişiklikler Postman’de ya da Swagger gibi ortamlarda gözlemlenebilir fakat mobil uygulamamızdaki şartları sağlamayacaktır. Peki, web api’ların erişimi ve tam uyumu konusunda, geliştirdiğimiz mobil uygulamanın ortam şartlarına ne kadar uyum sağladığını nasıl gözlemleyebiliriz?

🧐 İlgili Web Api ya da servislerin çağrıldığı ekranlarda debug yapıp gözlemleriz. Tamam. 🤔Bu cevap pek de profesyonelce olmadı.😇

Mobil uygulama geliştirme aşamasında consume ettiğimiz web api-servislerin kendilerine özgü belli bir standarda uygun ya da değil contract’ları vardır. Mobil uygulama geliştirme ortamımızda bu contract’lara yapısal olarak ne kadar uyduğumuz, sürecin ne kadar sağlıklı çalıştığının ilk başlangıç noktasıdır. Gönderilecek parametreler, header bilgileri, token ya da güvenlik senaryoları, çağrılardan dönen tipler vb.. api’ye bağımlı olduğumuzun göstergesidir. Mobil uygulama geliştirirken Http Request (web api, web service, soap vb.) yapmak için kullanacağınız volley, retrofit, alamofire ya da UrlSession gibi kütüphaneler, erişim sağlayacağınız web api’lara iletişim için birer araçtır. Son kullanıcılar, mobil uygulamalarda uzak verilere geliştirici olarak kurguladığımız bu 3.parti ya da değil kütüphaneler ile erişim sağlamaktadır. Bu uzak veri erişiminin Unit Testing geliştirmesine dahil edebilmemiz için, tercih etmiş olduğumuz kütüphanelerin ve kurgusal yapılarımızın tümüyle test sürecinin içinde olması gereken bir parça olarak düşünmemiz gerekmektedir. Bu api’ların doğru erişimleri için mobil uygulama geliştirme ortamımızın kendi bağımlılıklarıyla birlikte test süreçlerini yazıp, test etmemiz en sağlıklı olanı olacaktır.

Android

Önce Kotlin ile bir web api çağrısı yapan bir unit test örneğini inceleyelim.

//build gradle
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.2'

GitHub repository’lerini çeken bir basit örnek üzerinden unit test işlemini gerçekleştireceğiz. Yukarıdaki örnekte test sürecinde kullanacağımız kotlin ile yazılmış bir ServiceManager sınıfı bulunuyor.

Web Servis ya da Api çağrıları temel anlamda bir istek (request) bir de yanıt(response) sürecinden meydana geldiğinden, bu işlemin doğası gereği akış asenkron olarak gerçekleşecektir. Bu nedenle unit test sürecindeki yukarıdan aşağıya doğru devam eden senkron süreci CountDownLatch sınıfı ile asenkron bir yapıya dönüştürerek Web Servis yanıtını bekleyip test doğrulama işlemini assert nesneleriyle gerçekleştirebiliriz.

Kotlin ile yazmış olduğumuz Java programlama dili karşılığınıda yukarıda bulabilirsiniz.

Yukarıda kullanmış olduğumuz CountDownLatch sınıfı bir ya da daha fazla thread’in diğer thread’lerde ki işlem tamamlana kadar beklemesine izin verir. Unit Test başlatıldığında web api’dan çağrının tamamlanmasını bekler ve senkronizasyon sağlanır.

iOS projelerimizde Unit Test dahil olması için uygulamayı ilk oluşturduğumuzda Include Test aktif ettiğimizde projemizde Target olarak Unit Test hazır olarak gelecektir.

Eğer bu işlemi yapmadıysak mevcut projenize File>Add Target (ios) UI Testing Bundle target olarak dahil ederek Unit Test süreçlerini ilerletebilirsiniz.

Bu Unit Test target’ı içinde hazır bir import XCTest edilmiş bir unit test swift class’ı hazır olarak gelecektir. Bu XCTestCase class’ından extend edilmiş Test class’ı içerisinde yazacağımız test fonksiyonları Test Navigate’de algılanabilir bir test fonksiyon olabilmesi için fonksiyon isminde testLogin gibi bir “test” prefix eklemek durumundayız.

XCode içerisinde “Project Navigator” altında çalıştırılabilir test fonksiyonlarını aşağıdaki görseldeki icon altında izleyip çalıştırabilirsiniz.

Bir uygulamanın modelini ve eşzamansız yöntemleri test etmek için Xcode’un Test Navigate kullanabiliriz. Eğer dışarıdan bir modülü test sürecimize dahil etmek istiyorsak aşağıdaki gibi bir import işlemi yapmalıyız.

@testable import Networking

Java ve Kotlin örneklerinde olduğu gibi Web Request sürecini asenkron olarak XCTestExpectation(description: “request api.oneframe”) ve wait nesnelerini birlikte kullanarak burada tahmini max. zamansal bir bekletme gerçekleştirilir. Response’lar içerisinde ise expectation.fullfill() süreç tamamlanır. Aşağıdaki bu örneği buraya bırakıyorum.🍃

🦭En kısa zamanda tekrar görüşmek üzere🦭

Kaynaklar

https://developer.android.com/reference/kotlin/java/util/concurrent/CountDownLatch

https://developer.android.com/training/testing/unit-testing

https://developer.android.com/training/testing/unit-testing/local-unit-tests

--

--