Yerel birim testleri oluşturma

Yerel test, Android yerine doğrudan kendi iş istasyonunuzda çalıştırılır test edebilirsiniz. Bu nedenle, test çalıştırmak için Android cihaz yerine yerel Java sanal makinenizi (JVM) kullanır. Yerel testler, daha hızlı çalışmasını sağlayabilir. Ancak, Android çerçevesi, çalıştırabileceğiniz test türleriyle ilgili bir sınırlama oluşturur.

Birim testi, küçük bir kod bölümünün (test edilen birim) davranışını doğrular. Bunu, kodu yürütüp sonucu kontrol ederek yapar.

Birim testleri genellikle basittir ancak birim test edilebilirlik göz önünde bulundurularak tasarlanmamıştır:

  • Doğrulamak istediğiniz koda bir testten erişilebilir olmalıdır. Örneğin, Örneğin, gizli bir yöntemi doğrudan test edemezsiniz. Bunun yerine, sınıfı herkese açık API'lerini kullanarak test edersiniz.
  • Birim testlerini izole şekilde çalıştırmak için birimin bağımlılıkları testler altında bulunan ürünlerin yerine, sahte veya diğer test çiftlerini kullanın. Bu durum, özellikle kodunuz Android çerçevesine bağlıysa sorunlu olabilir.

Android'de yaygın olarak kullanılan birim testi stratejileri hakkında bilgi edinmek için Ne yapılmalı? test edin.

Yerel test konumu

Yerel birim testlerinin kaynak dosyaları varsayılan olarak module-name/src/test/ içine yerleştirilir. Android Studio'yu kullanarak yeni bir proje oluşturduğunuzda bu dizin zaten mevcuttur.

Test bağımlılıkları ekleme

Ayrıca, projenizin test bağımlılıkları JUnit test çerçevesi tarafından sağlanan standart API'leri kullanacak şekilde yapılandırılmalıdır.

Bunu yapmak için uygulamanızın modülünün build.gradle dosyasını açın ve aşağıdaki kitaplıkları bağımlılık olarak belirtin. Bu özelliklerin uygulamaya değil, yerel test kaynağı kümesine uygulandığını belirtmek için testImplementation işlevini kullanın:

dependencies {
  // Required -- JUnit 4 framework
  testImplementation "junit:junit:$jUnitVersion"
  // Optional -- Robolectric environment
  testImplementation "androidx.test:core:$androidXTestVersion"
  // Optional -- Mockito framework
  testImplementation "org.mockito:mockito-core:$mockitoVersion"
  // Optional -- mockito-kotlin
  testImplementation "org.mockito.kotlin:mockito-kotlin:$mockitoKotlinVersion"
  // Optional -- Mockk framework
  testImplementation "io.mockk:mockk:$mockkVersion"
}

Yerel birim testi sınıfı oluşturma

Yerel birim testi sınıfınızı JUnit 4 test sınıfı olarak yazarsınız.

Bunu yapmak için genellikle içinde bir veya daha fazla test yöntemi içeren bir sınıf oluşturun. module-name/src/test/ Test yöntemleri @Test ek açıklamasıyla başlar ve test etmek istediğiniz bileşenin tek bir yönünü çalıştırıp doğrulamak için gereken kodu içerir.

Aşağıdaki örnekte, yerel birim testi sınıfının nasıl uygulanacağı gösterilmektedir. emailValidator_correctEmailSimple_returnsTrue()test yöntemi, uygulamadaki bir yöntem olan isValidEmail()'yi doğrulamaya çalışır. isValidEmail() da doğru döndürürse test işlevi doğru değerini döndürür.

Kotlin


import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue
import org.junit.Test

class EmailValidatorTest {
  @Test fun emailValidator_CorrectEmailSimple_ReturnsTrue() {
    assertTrue(EmailValidator.isValidEmail("name@email.com"))
  }

}

Java


import org.junit.Test;

import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

class EmailValidatorTest {
  @Test
  public void emailValidator_CorrectEmailSimple_ReturnsTrue() {
    assertTrue(EmailValidator.isValidEmail("name@email.com"));
  }
}

Uygulamanızdaki bileşenlerin beklenen sonuçları döndürüp döndürmediğini değerlendiren okunaklı testler oluşturmanız gerekir. Şu şekilde bir onay kitaplığı kullanmanızı öneririz: junit.Assert, Hamcrest veya Gerçek. Yukarıdaki snippet, junit.Assert

Örnek Android kitaplığı

Yerel birim testleri yürüttüğünüzde Android Gradle Eklentisi bir kitaplığındaki tüm API'leri içeren, sürümünü kullandığınızdan emin olun. Kitaplıkta bu API'lerin tüm herkese açık yöntemleri ve sınıfları bulunur ancak yöntemlerin içindeki kod kaldırılmıştır. Varsa farklı yöntemlere erişildiğinde testte bir istisna oluşur.

Bu sayede, Android'de sınıflara referans verirken yerel testler oluşturulabilir. çerçeve oluşturmak için Context kullanabilirsiniz. Daha da önemlisi, benzer bir strateji kullanarak geliştirmeyi öğreneceksiniz.

Android bağımlılıklarıyla alay etme

Tipik bir sorun, sınıfın bir dize kaynağı kullandığını bulmaktır. Context sınıfındaki getString() yöntemini çağırarak dize kaynakları elde edebilirsiniz. Ancak yerel testler, Android çerçevesine ait oldukları için Context veya bu sınıfın hiçbir yöntemini kullanamaz. İdeal olarak, getString() çağrısı taşındı, ancak bu her zaman mümkün değildir. Çözüm, getString() yöntemi çağrıldığında her zaman aynı değeri döndüren bir Context ardışık düzeni veya taslağı oluşturmaktır.

Mockable Android kitaplığı ve Mockito veya MockK kullanıyorsanız benzerliklerini ekleyebilirsiniz.

Mockito'u kullanarak yerel birim testinize bir örnek nesne eklemek için aşağıdaki programlama modelini uygulayın:

  1. Mockito kitaplığı bağımlılığını build.gradle dosyanıza aşağıdaki gibi ekleyin: bkz. Test ortamınızı kurma.
  2. Birim testi sınıf tanımınızın başına @RunWith(MockitoJUnitRunner.class) ek açıklamasını ekleyin. Bu ek açıklama, Mockito test çalıştırıcısına çerçeveyi doğru şekilde kullandığınızı doğrulamasını söyler ve örnek nesnelerinizin başlatılmasını basitleştirir.
  3. Bir Android bağımlılığı için örnek nesne oluşturmak amacıyla @Mock ek açıklamasını ekleyin ifadesini girin.
  4. Bağımlılığın davranışını stub'lamak için when() ve thenReturn() yöntemlerini kullanarak bir koşul belirtebilir ve koşul karşılandığında döndürülecek değeri belirleyebilirsiniz.

Aşağıdaki örnekte, Mockito-Kotlin ile oluşturulan Kotlin'de bir mock Context nesnesi kullanan bir birim testi nasıl oluşturabileceğiniz gösterilmektedir.

import android.content.Context
import org.junit.Assert.assertEquals
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mock
import org.mockito.junit.MockitoJUnitRunner
import org.mockito.kotlin.doReturn
import org.mockito.kotlin.mock

private const val FAKE_STRING = "HELLO WORLD"

@RunWith(MockitoJUnitRunner::class)
class MockedContextTest {

  @Mock
  private lateinit var mockContext: Context

  @Test
  fun readStringFromContext_LocalizedString() {
    // Given a mocked Context injected into the object under test...
    val mockContext = mock<Context> {
        on { getString(R.string.name_label) } doReturn FAKE_STRING
    }

    val myObjectUnderTest = ClassUnderTest(mockContext)

    // ...when the string is returned from the object under test...
    val result: String = myObjectUnderTest.getName()

    // ...then the result should be the expected one.
    assertEquals(result, FAKE_STRING)
  }
}

Mockito çerçevesini kullanma hakkında daha fazla bilgi edinmek için Mockito API'si"ne bakın. referansı ve SharedPreferencesHelperTest sınıfını örnek kod. Android Testi Codelab'ini de deneyin.

Hata: "... yöntemi taklit edilmedi"

Mockable Android kitaplığı, Error: "Method ... not mocked mesajıyla yöntemlerinden herhangi birine erişmeye çalıştığınızda istisna atar.

Atılan istisnalar testleriniz için soruna neden oluyorsa, yöntemin değerine bağlı olarak, bunun yerine null veya sıfır değerini döndürecek şekilde dönüş türü. Bunu yapmak için projenizin hedefine aşağıdaki yapılandırmayı ekleyin Groovy'deki üst düzey build.gradle dosyası:

android {
  ...
  testOptions {
    unitTests.returnDefaultValues = true
  }