Android Test Automation: Unit Test vs Integration Test Seçimi
Android uygulaması geliştirirken kod yazarken hemen test etmek gerekir. Ancak her şeyi aynı şekilde test etmemiz mümkün değildir. Bazı parçalar izole şekilde test edilebilir, bazıları diğer bileşenlerle birlikte çalışması gerekir.
Unit Test: Tek bir fonksiyonu veya sınıfı test edersiniz. Diğer bileşenleri taklit edersiniz (mock). Hızlı ve güvenilirdir.
Integration Test: Birden fazla bileşen birlikte çalışırken test edersiniz. Veritabanı, API, Activity gibi gerçek şeyler kullanılır. Daha yavaş ama gerçekçidir.
Kullanıcı adını doğrulayan bir fonksiyon test edelim:
1class UserValidator {2fun isValidUsername(username: String): Boolean {3return username.length >= 3 && username.contains(Regex("^[a-zA-Z0-9]+$"))4}5}67// Unit Test8class UserValidatorTest {9private lateinit var validator: UserValidator1011@Before12fun setUp() {13validator = UserValidator()14}1516@Test17fun testValidUsername() {18val result = validator.isValidUsername("john123")19assertTrue(result)20}2122@Test23fun testInvalidUsername_TooShort() {24val result = validator.isValidUsername("ab")25assertFalse(result)26}2728@Test29fun testInvalidUsername_WithSpecialChar() {30val result = validator.isValidUsername("john@123")31assertFalse(result)32}33}Çıktı: Tüm testler geçer. İşlem 50ms içinde tamamlanır.
Aynı kullanıcıyı veritabanına kaydetme işlemini test edelim:
1@RunWith(AndroidJUnit4::class)2class UserRepositoryIntegrationTest {3@get:Rule4val instantTaskExecutorRule = InstantTaskExecutorRule()56private lateinit var database: UserDatabase7private lateinit var repository: UserRepository89@Before10fun setUp() {11val context = InstrumentationRegistry.getInstrumentation().targetContext12database = Room.inMemoryDatabaseBuilder(13context,14UserDatabase::class.java15).build()16repository = UserRepository(database.userDao())17}1819@Test20fun testSaveAndRetrieveUser() {21val user = User(id = 1, name = "john123")22repository.saveUser(user)2324val retrievedUser = repository.getUser(1)25assertEquals("john123", retrievedUser.name)26}2728@After29fun tearDown() {30database.close()31}32}Çıktı: Test geçer. İşlem 500ms alır (veritabanı işlemi nedeniyle).
| Durum | Seçim |
|-------|-------|
| İş mantığı, matematik, string işleme | Unit Test |
| Veritabanı kaydetme, API çağrısı | Integration Test |
| Hızlı geri bildirim istiyorum | Unit Test |
| Gerçek senaryoyu test etmek istiyorum | Integration Test |
Testlerinizin %70'i unit test, %20'si integration test, %10'u end-to-end test olmalıdır. Unit testler hızlı çalıştığı için geliştirme sırasında sık sık çalıştırabilirsiniz. Integration testler ise git push etmeden veya CI/CD pipeline'da çalıştırılmalıdır.
0 yorum