Android Local Unit Test Yazımı

Şimdi sizin aklınızda iki soru işareti var;

Bir, Local Unit Test nedir? İki, Local Unit Test Neden Yapılır?

Image for post
Image for post

Sıradan bir test de iki şey yükselir. Bir, kararlı geliştirme hızı. İki, geliştirme döngüsünde erken bug tespiti. Bug, uygulamalarda bazı ihmallerden dolayı karşılaşılan hata demektir. Uygulamanın düzgün çalışmasını engeller. Biz bunu istemiyoruz. Biz istiyoruz ki hatalarınızı önceden tespit edin. Sıradan geliştirmeye örnek, sıradan geliştirme. Yaratıcı geliştirmeye örnek test-driven-development.

Image for post
Image for post
Test-Driven-Development (TDD)

Unit Test’ler Android Framework ünden bağımsız ya da çok az bir şekilde bağımlı olan testlerdir. Bunlar yazılan sınıfların methodların sonuçlarını değerlendirir. Unit Test ikiye ayrılır. Bunlardan ilki local unit test,ikincisi ise intstumentation test tir. Local unit testler için bir android cihaza ya da emülatöre ihtiyaç olmazken instrumentation testler bir cihaz yada emülatör üzerinde gerçekleştirilir. Bu makalede sadece local unit test yapılmaya değinilecektir.

Image for post
Image for post

Unit Testlerde JUnit, Mockito, Powermock gibi bir çok framework kullanılabilir. Mockito ve PowerMock dan kısaca bahsedecek olursak Context vb. Android dependencylerine ihtiyacımız olduğu vakit kullanabiliriz.

Image for post
Image for post

Local Unit testler app>src>test içerisinde bulunur. Projeniz de Android görünümünü seçtiğiniz zaman Local Unit Testlerin bulunduğu paket java klasörünün altında, (test) şeklinde parantez içinde bir ekle gözükür. (anroidTest) yazan ise instrumentation testlerin bulunduğu pakettir.

Image for post
Image for post

Şimdi sizden isteğim aşağıda vermiş olduğum repo dan uygulamayı indirip import etmeniz. Bu uygulama fahrenhayt → selsius ve tam tersi dönüşüm yapmaktadır. Bizde bu dönüşüm işlemini bir local unit test yazarak test edeceğiz. master branch inde temel kod bulunuyorken, test branch i test kodlarını da içermektedir.

Bu uygulamayı kurduktan sonra (test) etiketine sahip paket içerisinde ConverterUtilTest adında bir sınıf oluşturacağız ve bu sınıflar içerisinde @Test annotationu ile methodlar tanımlayarak testlerimizi gerçekleştireceğiz.

Öncelikle gerçek olarak beklenen değeri gereken fonksiyonumuzdan alacağımız. Daha sonra bizim beklediğimiz değeri tanımlayacağız. Bu değerleri tanımladıktan sonra birbirlerine eşitler mi kontrol edeceğiz.Aşağıda söylediklerimin koda dökülmüş hali bulunmaktadır.

@Test
public void testConvertCelsiusToFahrenheit() {

float actual = ConverterUtil.convertCelsiusToFahrenheit(100);

float expected = 212;

assertEquals("Conversion from celsius to fahrenheit failed", expected, actual, 0.0001);
}

assertEquals() methodu karşılaştırma işlemini yapar. Kendisine verilen değerlerin eşit olup olmadığını kontrol eder. Burada devreyen 0.001 değeri delta değeridir. Delta değeri float ve double değerlerin karşılaştırılmasında yuvarlama hatalarından kaçınmak için kullanılır. Bu karşılaştırma aşamasında

Math.abs (expected - actual) <= delta

olması durumunda şart doğru olarak kabul edilir. Diğer fonksiyonumuz da fahrenhayt tan selsius a çevirimi kontrol eder.

@Test
public void testConvertFahrenheitToCelsius() {

float actual = ConverterUtil.convertFahrenheitToCelsius(212);

float expected = 100;

assertEquals("Conversion from fahrenheit to celsius failed", expected, actual, 0.0001);
}

Final olarak test sınıfımız aşağıdaki gibi olacaktır.

Testi başlatmak için test etmek istediğiniz methodun yanındaki yeşil ok simgesine (run) tıklayabilirsiniz. Eğer bütün methodları aynı anda test etmek istiyorsanız sınıf isminin yanındaki yeşil ok simgesine ya da test paketi içerisinde test sınıfına sağ tıklayarak run seçeneğini seçebilirsiniz. Aşağıda bu sınıfın tüm methodlarının test edildiği bir durumu çıktısı verilmiştir.

Image for post
Image for post
Test çıktısı

Evet arkadaşlar, artık Local Unit Test nasıl yazılır öğrenmiş olduk. Eğer test kodunu yazarken zorlanırsanız paylaştığım repo içerisindeki test branch ine bakabilirsiniz. Bu konuda daha çok makale okuyarak daha geniş testler yazabilirsiniz.

The more code the more happiness

Android Application Developer @ Lyrebird Studio, Researcher-Writer https://www.linkedin.com/in/halilozcan/

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store