Herkese merhabalar,
Bu yazımda Test, Test Türleri nedir ve neden Test yazmalıyız gibi kavramlara değineceğim. 🥳
Geliştirdiğimiz her uygulamayı run ▶️ tuşuna basarak çalışıp çalışmadığının kontrolünü sağlayabiliriz. Fakat büyük çaplı ve karmaşık yapılar barındıran projelerde run ederek test etme işlemi biraz daha karmaşık hale gelebilir.
Projemize eklediğimiz her bir fonksiyonu run tuşu ile test etmeye kalkmak hem proje için hem de geliştirici açısından büyük zaman kaybıdır. Üstüne bir de Android geliştiriyor iseniz bekleyin ki build alsın. 🥲 Bu gibi zaman kayıplarını önlemek adına Yazılım Testlerinden faydalanabiliriz.
Peki Nedir Bu Yazılım Testleri?
Uygulamamızın işlevselliğini ölçmek için yazdığımız kod parçaları bizim yazılım testlerimizdir. Bu testler Unit Test, Integration Test, UI Test olarak 3 ayrı başlığa ayrılır.
Gelin bunları daha detaylı ele alalım. 🥳
Unit Test :
Uygulamamız içerisinde bulunan en küçük birimleri test etmek için Unit Testleri kullanırız. Birim Testleri veya Küçük Seviyeli Testler olarak da geçer. Local ortamda - Android Studio - çalışmasından dolayı testleri oldukça hızlı gerçekleştirebilmenizin yanında uygulamanız içerisindeki en büyük test parçalarını da oluşturur.
👀 Uygulamanız için yazmış olduğunuz testlerin neredeyse %70'i Unit Testler ile oluşur.
Unit Testlerde kendi içerisinde Local Unit Test ve Instrumented Unit Test olarak ikiye ayrılır.
Local Unit Test :
Yalnızca local ortamda çalışan birim testlerdir. Bu testler test süresini en aza indirmek için Java Sanal Ortamı(JVM) üzerinde çalışacak şekilde derlenir.
Instrumented Unit Test :
Cihaz veya emülatör üzerinde çalışan birim testlerdir. Local birim testlere göre doğruluk oranı daha yüksek olmasına karşın Local teste göre daha yavaştır.
Gelin örnek bir test yazalım. ✍🏻
Test yazmaya geçmeden önce build.gradle dosyamıza implementasyon sağlamamız gereken 2 kütüphane buluyor.
✨ Bunlar JUnit ve Mocking kütüphaneleri. JUnit bir birim testi frameworküdür. Mocking ise sahte nesneler (Bir sınıftan oluşturulan nesne gibi davranış) oluşturarak birim testlerimizi yazabilme olanağı sunar.
Test yazacağınız projeyi oluşturdunuz varsayarak devam ediyorum. 🥳
O zaman hemen build gradle dosyamızı açıp şu iki kütüphaneyi ekliyor ve ardında sync now diyoruz. ☘️
testImplementation 'junit:junit:4.13.2'
testImplementation "io.mockk:mockk:1.12.0"
Örneğin bir hesap makinesi uygulamamız olsun ve biz burada işlemlerin doğru yapılıp yapılmadığını test etmek istiyoruz. İlk olarak bu işlemleri gerçekletiren sınıfı oluşturmamız daha sonrasında da bu sınıfın testini yazmamız gerekir. O halde bir hesaplama işlemi gerçekleştirecek sınıfımızı oluşturalım.
Calculator ismini verdiğim bir sınıf oluşturdum ve burada gerekli işlemleri yapacak fonksiyonları oluşturdum.
class Calculator {
fun add(a: Int, b: Int): Int {
return a + b
}
fun subtract(a: Int, b: Int): Int {
return a - b
}
fun multiply(a: Int, b: Int): Int {
return a * b
}
fun divide(a: Int, b: Int): Int {
return a / b
}
}
Gelelim MainActivity üzerinde bu oluşturdugumuz Calculator sınıfını kullanmaya,
Burada calculator sınıfı içerisindeki toplama işlemini ifade eden add fonksiyonunu çağırarak toplama işlemini gerçekleştireceğim 2 sayıyı girdim.
Şimdi gelelim bu sınıf için test yazmaya. 🥳
Java klasörü içerisinde paket adınız yanında (test) ifadesi bulunan klasör bizim Unit Testleri yazarken kullandığımız alandır.
Burada CalculatorUnitTest adını verdiğimiz bir test sınıfı oluşturalım.
addTest() ismini verdiğim bir test fonksiyonu oluşturdum. Derleme esnasında bunun test fonksiyonu olmasının anlaşılması için test yazdığınız fonksiyonun başına @Test ifadenizi eklemeyi unutmayın.
addTest() fonskiyonumun içerisinde Calculator sınıfını çağırdım ve toplama işlemi için 2 adet sayı bilgisi girdim.
assertEquals(20, result) ile beklediğim değer ve testin bana döndürdüğü değeri karşılaştırdım. (assertEquals(beklenilen değer, testten dönen değer)) Bu iki değerin birbirine eşit olmaması durumunda testimiz bize hata döndürecektir.
Anlaşılır olması açısından seçebileceğim en basit örneği seçtim umarım faydalı olmuştur. Son olarak UnitTest sınıfının hesap makinesi uygulamamız için tam halini ekleyeyeyim ve diğer test türlerine devam edelim. ☘️
package com.nisaefendioglu.androidtesting
import org.junit.Assert.assertEquals
import org.junit.Test
class CalculatorUnitTest {
@Test
fun addTest() {
val calculator = Calculator()
val result = calculator.add(15, 5)
assertEquals(10, result)
}
@Test
fun subtractTest() {
val calculator = Calculator()
val result = calculator.subtract(15, 5)
assertEquals(10, result)
}
@Test
fun multiplyTest() {
val calculator = Calculator()
val result = calculator.multiply(15, 5)
assertEquals(75, result)
}
@Test
fun divideTest() {
val calculator = Calculator()
val result = calculator.divide(15, 5)
assertEquals(3, result)
}
}
Integration Test :
Entegrasyon testleri orta seviyeli testler olarak da bilinir. Unit Testler gibi local ortam yerine gerçek cihazlar üzerinde test etme işlemi için kullanılır. Birbirinden farklı modüller veya bileşenler arasındaki entegrasyonun çalışıp çalışmadığını test etmek içindir. Örneğin uygulamanız içerisinde bir sayfadan diğer sayfaya geçerken yapılan işlemlerin testi için Entegrasyon testlerinden yararlanabiliriz.
Gerçek cihazlar üzerinde test edilmesinden dolayı da Unit testlere göre çok daha yavaş çalışır.
👀 Integration Testleri uygulamanız için yazılan toplam testlerin yaklaşık %20'sini oluşturmaktadır.
✨ Integration testlerinde ActivityScenario veya Robolectric sınıfları kullanılabilmektedir.
UI Test :
Arayüz testleri ve büyük seviyeli testler olarak bilinen UI Testler, kullanıcının uygulamanız üzerindeki birden çok alandaki deneyimini test etmenize olanak sağlayan testlerdir. Projenizdeki tüm akışı test eder.
👀 Doğruluk oranı diğer testlere göre daha yüksek olan UI Testler uygulamanız için yazılan toplam testlerin yaklaşık %10'unu oluşturmaktadır.
✨ Arayüz testlerinde Espresso, Robotium, UI Automator gibi implementasyonlar kullanılmaktadır.
Umarım sizler için de faydalı bir yazı olmuştur. Başka bir yazıda görüşmek dileğiyle. ⭐️
Bugsız kodlamalar. 👩🏻💻