0Pricing
Android Academy · Ders

JUnit ile Birim Testi

JUnit 4 ile hızlı ve güvenilir birim testleri yazın. @Test, @Before ve @After kullanın, LiveData'yı InstantTaskExecutorRule ile, coroutine'leri runTest ile test edin.

JUnit ile Birim Testi, CoddyKit'te ücretsiz bir Android Academy dersidir. Bu, 4 dersinin 1. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Android Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Android Academy kursu toplamda 4 dersten oluşur.

Neden Test Yazmalısınız?

Testler bir lüks değildir — güvenlik ağınızdır:

  • Kullanıcılar fark etmeden önce hataları yakalar
  • Güvenle yeniden düzenleme yapmanızı sağlar (testler geçiyorsa hiçbir şey bozulmamıştır)
  • Amaçlanan davranışı belgeler
  • Özellik eklerken gerilemeleri önler

İyi test edilmiş kod genellikle daha iyi tasarlanmış koddur — test edilmesi zorsa tasarım muhtemelen bileşenleri gereğinden fazla sıkı bağlamıştır.

Android Test Türleri

İki kategori vardır:

  • Birim testleri (test/ klasörü) — JVM üzerinde çalışır, cihaz gerekmez. Hızlıdır. Kotlin/Java'daki yalın mantığı test eder.
  • Enstrümante testler (androidTest/ klasörü) — cihazda veya emülatörde çalışır. Daha yavaştır. Android'e özgü kodu (Room veritabanı, kullanıcı arayüzü) test eder.

İş mantığı için birim testlerini tercih edin. Enstrümante testleri yalnızca Android API'leriyle etkileşim kurmanız gerektiğinde kullanın.

JUnit 4 Kurulumu

JUnit 4, Android projelerine varsayılan olarak eklenir. Bunları app/build.gradle dosyasına ekleyin:

// app/build.gradle:
dependencies {
    testImplementation 'junit:junit:4.13.2'
    testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.7.3'
    testImplementation 'androidx.arch.core:core-testing:2.2.0'  // for LiveData
}

İlk JUnit Testiniz

src/test/java/ içinde bir sınıf oluşturun ve test yöntemlerine @Test açıklamasını ekleyin:

import org.junit.Test
import org.junit.Assert.*

class CalculatorTest {

    private val calc = Calculator()

    @Test
    fun `addition returns correct sum`() {
        val result = calc.add(2, 3)
        assertEquals(5, result)
    }

    @Test
    fun `division by zero throws exception`() {
        assertThrows(ArithmeticException::class.java) {
            calc.divide(10, 0)
        }
    }
}

@Before ve @After

Her testin çevresindeki durumu hazırlamak ve temizlemek için yaşam döngüsü açıklamalarını kullanın:

class UserRepositoryTest {

    private lateinit var repo: UserRepository
    private lateinit var fakeDao: FakeUserDao

    @Before
    fun setUp() {
        fakeDao = FakeUserDao()          // fresh instance before each test
        repo = UserRepository(fakeDao)
    }

    @After
    fun tearDown() {
        fakeDao.clear()                  // clean up after each test
    }

    @Test
    fun `getUsers returns all users`() {
        fakeDao.insert(User(1, "Alice"))
        fakeDao.insert(User(2, "Bob"))
        assertEquals(2, repo.getUsers().size)
    }
}

Yaygın Doğrulamalar

JUnit, Assert.* içinde doğrulama yöntemleri sağlar:

// Equality:
assertEquals(expected, actual)
assertNotEquals(unexpected, actual)

// Null:
assertNull(value)
assertNotNull(value)

// Boolean:
assertTrue(condition)
assertFalse(condition)

// Same object reference:
assertSame(expected, actual)

// Custom message on failure:
assertEquals("User ID should be 1", 1, user.id)

// Exception:
assertThrows(IllegalArgumentException::class.java) {
    User(id = -1, name = "")
}

ViewModel Testi

LiveData'yı test etmek için LiveData'nın eşzamanlı olarak gönderim yapmasını sağlayan InstantTaskExecutorRule kuralını ekleyin:

class UserViewModelTest {

    @get:Rule
    val instantTaskRule = InstantTaskExecutorRule()

    private val fakeRepo = FakeUserRepository()
    private lateinit var viewModel: UserViewModel

    @Before
    fun setUp() {
        viewModel = UserViewModel(fakeRepo)
    }

    @Test
    fun `users are loaded on init`() {
        fakeRepo.usersToReturn = listOf(User(1, "Alice"), User(2, "Bob"))
        viewModel.loadUsers()

        val result = viewModel.users.value
        assertNotNull(result)
        assertEquals(2, result?.size)
    }
}

Korutinleri Test Etme

Testlerde korutin yürütmesini denetlemek için TestCoroutineDispatcher / StandardTestDispatcher kullanın:

class SyncWorkerTest {

    @get:Rule
    val instantTaskRule = InstantTaskExecutorRule()

    private val testDispatcher = StandardTestDispatcher()

    @Before
    fun setUp() {
        Dispatchers.setMain(testDispatcher)
    }

    @After
    fun tearDown() {
        Dispatchers.resetMain()
    }

    @Test
    fun `sync completes successfully`() = runTest {
        val repo = FakeRepository()
        val worker = SyncUseCase(repo, testDispatcher)
        val result = worker.run()
        assertTrue(result.isSuccess)
    }
}

Sahte Nesne ve Mock Karşılaştırması

Testlerde gerçek bağımlılıkları değiştirmek için iki strateji:

  • Sahte nesne — test için tasarlanmış, çalışan bir uygulama (ör. gerçek veritabanı yerine bellek içi bir liste). Yazması kolaydır, okunabilirdir ve kitaplık gerektirmez.
  • Mock — çağrıları kaydeden ve etkileşimleri doğrulamanıza olanak tanıyan, otomatik oluşturulmuş bir taslaktır (Mockito, MockK). Daha güçlüdür; ancak gereğinden fazla kullanılırsa kırılgan hâle gelebilir.

Basit durumlarda sahte nesneleri tercih edin; yöntem çağrılarını doğrulamanız gerektiğinde Mock kullanın.

Sahte Nesne Yazma

Bir sahte nesne, gerçek sınıfla aynı arayüzü uygular ancak bellek içi depolama kullanır:

interface UserDao {
    fun getAll(): List<User>
    fun insert(user: User)
}

class FakeUserDao : UserDao {
    private val storage = mutableListOf<User>()

    override fun getAll(): List<User> = storage.toList()
    override fun insert(user: User) { storage.add(user) }

    fun clear() { storage.clear() }
}

Test Adlandırma Kuralı

İyi test adları neyin test edildiğini ve beklenen sonucu açıklar. Okunabilir açıklamalar için Kotlin'de ters tırnak içindeki işlev adlarını kullanın:

  • `getUsers returns empty list when no users exist`
  • `login throws exception when password is blank`
  • `add returns correct sum for negative numbers`

Kalıp: `subject does X when Y`

Hızlı Kontrol

Bir JUnit test sınıfında @Before açıklamasının amacı nedir?

Özet: JUnit ile Birim Testi

Güvenilir uygulamalar test edilmiş uygulamalardır:

  • Birim testleri src/test/ içine konur ve JVM üzerinde çalışır — hızlıdır
  • @Test ile açıklama ekleyin; assertEquals, assertTrue, assertThrows kullanın
  • Hazırlık ve temizleme için @Before / @After
  • LiveData'yı eşzamanlı olarak test etmek için InstantTaskExecutorRule
  • Korutin testi için runTest + StandardTestDispatcher
  • Basit değişimler için Mock yerine sahte nesneleri tercih edin

Sırada: etkileşimleri doğrulamak için Mockito ile Mock kullanımı.

Sıkça Sorulan Sorular

“JUnit ile Birim Testi” dersi ücretsiz mi?

Evet — “JUnit ile Birim Testi” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Android Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Android Academy kursu toplamda 4 dersten oluşur.

“JUnit ile Birim Testi” dersinde ne öğreneceğim?

JUnit 4 ile hızlı ve güvenilir birim testleri yazın. @Test, @Before ve @After kullanın, LiveData'yı InstantTaskExecutorRule ile, coroutine'leri runTest ile test edin. Android Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Android Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Android Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 1. dersidir.

“JUnit ile Birim Testi” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Android Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Android Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. JUnit ile Birim Testi
  2. Mockito ile Taklit Nesneler
  3. Espresso ile Kullanıcı Arayüzü Testi
  4. Hata Ayıklama ve Profil Oluşturma
← Android Academy Sayfasına Dön