Yerel birim testleri oluşturma

Yerel test, Android yerine doğrudan kendi iş istasyonunuzda çalıştırılır test edebilirsiniz. Yerel Java Sanal Makinenizi (JVM) Android cihaz yerine test yapmak için kullanılabilir. 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 edin. Bunun için, ilgili kodu yürütür ve sonucu kontrol eder.

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 olması gerekir. Örneğin, Örneğin, gizli bir yöntemi doğrudan test edemezsiniz. Bunun yerine sınıfı test edersiniz API'lerini kullanabilirsiniz.
  • 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, özellikle kodunuzda reklam ortaya koyduk.

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

Yerel test konumu

Varsayılan olarak, yerel birim testlerine ilişkin kaynak dosyalar module-name/src/test/ Yeni bir dizin oluşturduğunuzda bu dizin zaten mevcut olur. bir proje başlatma belgesi oluşturmuş olmalısınız.

Test bağımlılıkları ekleme

Ayrıca JUnit test çerçevesi tarafından sağlanan standart API'ler.

Bunu yapmak için uygulamanızın modülünün build.gradle dosyasını açın ve aşağıdakini belirtin kitaplıklarını da bağımlı olarak görebiliriz. Şunu belirtmek için testImplementation işlevini kullanın: bunların uygulamaya değil, yerel test kaynağı grubuna uygulanmalarını sağlayı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 test sınıfı oluşturma

Yerel birim test sınıfınızı bir 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/ Bir test yöntemi, @Test ek açıklamasıyla başlar ve bileşenin motive eden tek bir yönünü uygulamak ve doğrulamak için kodu içerir. istediğiniz seçeneği belirleyin.

Aşağıdaki örnekte bir yerel birim test sınıfının nasıl uygulanacağı gösterilmektedir. İlgili içeriği oluşturmak için kullanılan test yöntemi emailValidator_correctEmailSimple_returnsTrue()doğrulanmaya çalışır isValidEmail(),uygulamanın içinde bir yöntemdir. Test işlevi, True (doğru) değerini döndürürseisValidEmail() 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 doğru olup olmadığını değerlendiren uygulamasının beklenen sonuçları döndürmesini sağlar. Ş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. Kütüphane, herkese açık yöntemlerin ve ancak yöntemlerin içindeki kod kaldırıldı. 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ı tespit etmektir. Şunları yapabilirsiniz: Context içindeki getString() yöntemini çağırarak dize kaynaklarını elde edin sınıfını kullanır. Ancak yerel test, Context veya sunduğu yöntemlerden herhangi birini kullanamaz. olduğunu unutmayın. İdeal olarak, getString() çağrısı taşındı, ancak bu her zaman mümkün değildir. Çözüm olduğunda her zaman aynı değeri döndüren bir Context modeli veya getString() yöntemi çağrılır.

Mockable Android kitaplığı ve Mockito veya MockK kullanıyorsanız 300x250'lik bir alan sağlar.

Mockito'yu kullanarak yerel birim testinize örnek bir nesne eklemek için şu adımları uygulayın: programlama modeli:

  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ı. Bu ek açıklama, Mockito test çalıştırıcısı ile çerçeveyi kullanımınızın doğru olduğunu ve örnek nesnelerinizin ilk kullanıma hazırlanmasını kolaylaştırır.
  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ı kökten değiştirmek için bir koşul belirtebilir ve Koşul karşılandığında when() ve thenReturn() kullanılarak değer döndürülür yöntemlerine göz atın.

Aşağıdaki örnek, test modeli kullanan bir birim testinin nasıl Mockito-Kotlin ile Kotlin'deki Context nesnesi oluşturuldu.

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. Ayrıca Android Testi Codelab'i de deneyin.

Hata: "Yöntem ... sahte"

Mockable Android kitaplığının herhangi bir bölümüne erişmeye çalışırsanız yöntemlerinden birini Error: "Method ... not mocked mesajıyla değiştirin.

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
  }