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}
6
7// Unit Test
8class UserValidatorTest {
9private lateinit var validator: UserValidator
10
11@Before
12fun setUp() {
13validator = UserValidator()
14}
15
16@Test
17fun testValidUsername() {
18val result = validator.isValidUsername("john123")
19assertTrue(result)
20}
21
22@Test
23fun testInvalidUsername_TooShort() {
24val result = validator.isValidUsername("ab")
25assertFalse(result)
26}
27
28@Test
29fun testInvalidUsername_WithSpecialChar() {
30val result = validator.isValidUsername("john@123")
31assertFalse(result)
32}
33}

Çıktı: Tüm testler geçer. İşlem 50ms içinde tamamlanır.

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası

Aynı kullanıcıyı veritabanına kaydetme işlemini test edelim:

1@RunWith(AndroidJUnit4::class)
2class UserRepositoryIntegrationTest {
3@get:Rule
4val instantTaskExecutorRule = InstantTaskExecutorRule()
5
6private lateinit var database: UserDatabase
7private lateinit var repository: UserRepository
8
9@Before
10fun setUp() {
11val context = InstrumentationRegistry.getInstrumentation().targetContext
12database = Room.inMemoryDatabaseBuilder(
13context,
14UserDatabase::class.java
15).build()
16repository = UserRepository(database.userDao())
17}
18
19@Test
20fun testSaveAndRetrieveUser() {
21val user = User(id = 1, name = "john123")
22repository.saveUser(user)
23
24val retrievedUser = repository.getUser(1)
25assertEquals("john123", retrievedUser.name)
26}
27
28@After
29fun 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.

bknz: Konteyner Güvenliği: Image Tarama ve Runtime Koruması

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz