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:
- Mockito kitaplığı bağımlılığını
build.gradle
dosyanıza aşağıdaki gibi ekleyin: bkz. Test ortamınızı kurma. - 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. - Bir Android bağımlılığı için örnek nesne oluşturmak amacıyla
@Mock
ek açıklamasını ekleyin ifadesini girin. - Bağımlılığın davranışını stub'lamak için
when()
vethenReturn()
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
}