Entegrasyon testi, mobil uygulama bileşenleri — modüller, hizmetler, veritabanları ve harici API’ler — arasındaki etkileşimin doğruluğunu kontrol eder. Her bir bileşeni izole eden birim testlerinin aksine, entegrasyon testleri birleşim noktalarındaki hataları tespit eder: veri formatı uyumsuzluğu, parametre iletim hataları ve sunucu yanıtlarının hatalı işlenmesi. Martin Fowler, 2018’e göre, entegrasyon testleri birim testlerinin kaçırdığı kritik kusurların %40’ına kadarını kapsar ve sürüm öncesinde sistem kararlılığı konusunda güven sağlar.
Önemli noktalar
Entegrasyon testi, bir uygulamanın ayrı modülleri veya alt sistemleri arasındaki etkileşimin doğruluğunu değerlendiren bir yazılım doğrulama aşamasıdır. Birim testleri her bir bileşeni ayrı ayrı kontrol ederken, entegrasyon testleri bu bileşenleri bir araya getirir ve birlikte nasıl çalıştıklarını kontrol eder. Tipik senaryolar arasında ağ katmanı ile depo arasında veri aktarımı, ORM aracılığıyla veritabanına yazma ve üçüncü taraf API’lerden gelen yanıtların işlenmesi yer alır.
Mobil geliştirme bağlamında, entegrasyon testleri UI katmanı, iş mantığı ve veri kaynakları arasındaki etkileşimleri kapsar. Örneğin, bir test "Giriş Yap" düğmesine tıklandıktan sonra uygulamanın sunucuya bir istek gönderdiğini, bir token aldığını ve yerel depolama alanına kaydettiğini doğrulayabilir. Böyle bir doğrulama, bileşen zincirinin hatasız çalıştığını teyit eder.
World Quality Report 2023’e göre, entegrasyon testlerini düzenli olarak uygulayan şirketler, yalnızca birim testlerine güvenen projelere kıyasla üretim olaylarını %35 oranında azaltır. Bu, entegrasyon kontrollerini ticari geliştirmede kalite güvence stratejisinin zorunlu bir unsuru haline getirir.
Mobil uygulamalar birbirine bağlı birçok bileşenden oluşur: ağ istekleri, yerel veritabanları, push bildirimleri, sistem hizmetleri ve üçüncü taraf SDK’lar. Bu bileşenlerin her biri ayrı ayrı geliştirilir, ancak çalışma zamanında gerçek zamanlı olarak veri alışverişinde bulunurlar. Entegrasyon testleri, izole modül doğrulamasıyla bulunamayan kusurları tespit eder.
Entegrasyon testleri tarafından keşfedilen tipik sorunlar arasında API ile uygulama modeli arasında veri türü uyuşmazlığı, JSON serileştirme hataları, ağ zaman aşımlarının hatalı işlenmesi ve Room veya Core Data aracılığıyla eşzamanlı veritabanı erişimi sırasındaki hatalar yer alır. Entegrasyon kontrolleri olmadan, bu tür kusurlar üretime ulaşır ve yalnızca gerçek kullanıcılarda ortaya çıkar.
Google Testing Blog (2021) araştırması, entegrasyon testleri sırasında bulunan bir kusurun düzeltme maliyetinin sürümden sonraya göre 5 kat daha düşük olduğunu göstermektedir. Bunun nedeni, erken aşamalarda geliştiricinin hatanın tam bağlamına sahip olması ve acil bir hotfix döngüsü olmadan düzeltebilmesidir. Entegrasyon testleri yazmaya zaman ayırmak, bakım maliyetlerinin azalması ve kullanıcı güveninin artmasıyla kendini amorti eder.
Entegrasyon testlerini organize etmek için üç ana yaklaşım vardır: Big Bang, Bottom-Up ve Top-Down. Strateji seçimi proje büyüklüğüne, uygulama mimarisine ve testlerin yazıldığı sırada bileşenlerin kullanılabilirliğine bağlıdır. Her yaklaşımın, test kapsamını planlarken dikkate alınması gereken avantajları ve sınırlamaları vardır.
Big Bang — sistemin tüm bileşenlerinin aynı anda bağlandığı ve ardından genel bir test çalıştırmasının yapıldığı yaklaşım. Bu yöntem uygulaması basittir: stub yazmaya veya tek tek modülleri taklit etmeye gerek yoktur. Ancak bir hata tespit edildiğinde, hangi bileşenin buna neden olduğunu belirlemek zordur. Big Bang, modül sayısının beşi geçmediği basit mimariye sahip küçük projelerde haklıdır.
Bottom-Up — entegrasyon testlerinin düşük seviyeli bileşenlerle başladığı strateji: veritabanı, ağ katmanı, sistem hizmetleri. Her seviyeyi doğruladıktan sonra, testler kademeli olarak üst seviye modülleri — depolar, Use Case sınıfları ve ViewModel’leri — bağlar. Ana avantaj, uygulamanın temel katmanlarındaki kusurların erken tespitidir, bu da geliştirmenin sonraki aşamalarında zincirleme hata riskini azaltır.
Top-Down — testlerin üst seviye bileşenlerle — UI ekranları ve navigasyon — başladığı, alt seviye modüllerin stub veya mock’lar kullanılarak simüle edildiği yaklaşım. Bu, sunucu tarafı veya veritabanı tamamen uygulanmadan önce kullanıcı senaryolarının kontrol edilmesini sağlar. Top-Down, backend’in henüz gerçek entegrasyona hazır olmadığı durumlarda istemci ve sunucu parçalarının paralel geliştirilmesi sırasında özellikle kullanışlıdır.
Mobil uygulamaların entegrasyon testleri için, üç kategoriye ayrılan bir dizi özel araç kullanılır: sunucu taklit kütüphaneleri, veritabanı framework’leri ve sistem hizmeti doğrulama araçları. Belirli bir aracın seçimi platforma — Android veya iOS — ve projenin teknoloji yığına bağlıdır.
Android ve iOS için entegrasyon testlerinin pratik örneklerine bakalım. Android platformu için JUnit ile birlikte MockWebServer kullanıyoruz, iOS için — OHHTTPStubs kütüphanesiyle XCTest. Her iki örnek de bir API’den veri alma ve yerel bir depoda saklama senaryosunu doğrular.
Bu test, taklit edilen sunucuya yapılan bir Retrofit isteğinin doğru JSON döndürdüğünü ve deponun yanıtı bir alan modeline dönüştürdüğünü doğrular. MockWebServer isteği keser ve belirtilen JSON’ı döndürür, ardından test beklenen sonucu gerçek sonuçla karşılaştırır.
class UserRepositoryTest {
private val mockServer = MockWebServer()
@Before
fun setup() {
mockServer.start()
}
@Test
fun fetchUser_returnsCorrectData() {
val json = "{ \`"id\`": 1, \`"name\`": \`"Alice\`" }"
mockServer.enqueue(MockResponse()
.setBody(json)
.setResponseCode(200))
val repository = UserRepository(
createRetrofit(mockServer.url("/").toString()))
val user = repository.fetchUser(1)
assertEquals(1, user.id)
assertEquals("Alice", user.name)
}
@After
fun tearDown() {
mockServer.shutdown()
}
}
iOS için benzer bir test, URL isteklerini kesmek için OHHTTPStubs kullanır. Kütüphane, URL Loading System’in sistem framework düzeyinde sunucu yanıtını değiştirerek URLSession, Alamofire veya Moya gibi herhangi bir ağ kütüphanesinin test edilmesine olanak tanır.
import XCTest
import OHHTTPStubs
import OHHTTPStubsSwift
class UserRepositoryTests: XCTestCase {
func testFetchUser_returnsCorrectData() {
stub(condition: isPath("/users/1")) { _ in
return HTTPStubsResponse(
jsonObject: ["id": 1, "name": "Alice"],
statusCode: 200,
headers: nil
)
}
let repository = UserRepository()
let expectation = expectation(description: "fetch user")
repository.fetchUser(id: 1) { user in
XCTAssertEqual(user.id, 1)
XCTAssertEqual(user.name, "Alice")
expectation.fulfill()
}
waitForExpectations(timeout: 2.0)
}
}
Etkili entegrasyon testleri, test kararlılığını artıran ve bakım maliyetlerini azaltan bir dizi uygulamanın izlenmesini gerektirir. Harici bağımlılıkları izole edin: üretim örnekleri yerine bellek içi veritabanları kullanın ve üçüncü taraf API’leri stub kütüphaneleri kullanarak taklit edin. Bu, ağ kullanılabilirliği veya harici hizmet durumundan kaynaklanan deterministik olmayan hataları ortadan kaldırır.
Test bağımsızlığını koruyun: her entegrasyon testi, diğer testlerin sonuçlarına bağlı olmadan izole bir şekilde çalışmalıdır. Test ortamını hazırlamak ve temizlemek için JUnit’te @Before ve @After ek açıklamalarını veya XCTest’te setUp ve tearDown’ı kullanın. Bu, testlerin birbirini etkilemesini önler ve hata teşhisini basitleştirir.
Sınır durumlarını kapsayın: entegrasyon testleri yalnızca başarılı senaryoları (happy path) değil, aynı zamanda hata işleme — zaman aşımları, HTTP 4xx ve 5xx kodları, boş yanıtlar, bozuk JSON — işlemlerini de doğrulamalıdır. Google Testing Blog (2022)’ye göre, üretim olaylarının %60’ı testler tarafından kapsanmayan sınır durumlarının hatalı işlenmesiyle ilgilidir.
Sıkça sorulan sorular
Birim testleri, bağımlılıkları stub’larla değiştirerek tek bir sınıfı veya işlevi izole bir şekilde kontrol eder. Entegrasyon testleri birden çok gerçek bileşenin etkileşimini doğrular — örneğin, bir ağ bağlantısı ve bir veritabanını aynı anda.
Entegrasyon testlerinin çalıştırılması genellikle test sayısına ve ortam karmaşıklığına bağlı olarak 2 ila 15 dakika sürer. Büyük projeler için, birleştirme öncesinde toplam doğrulama süresini azaltmak amacıyla testlerin bir CI sisteminde paralel işlere bölünmesi önerilir.
İlk olarak, entegrasyon testleri ağ katmanı, veritabanı ve sistem hizmetleri — bildirimler, kamera, coğrafi konum — için yazılır. Backend’e API istekleri ve yerel depolama işlemleri en yüksek ROI’yi sağlar çünkü bu bileşenler en sık gerileme kaynağı haline gelir.
Tek bir ekran için ViewModel birim testleri ve UI testleri yeterlidir. Tek bir ekran için entegrasyon testleri yalnızca ekranın birden çok veri kaynağıyla etkileşime girmesi durumunda haklıdır — örneğin, iki farklı API’den gelen yanıtları birleştiriyor veya ağa ve yerel veritabanına aynı anda veri yazıyorsa.
Entegrasyon testleri her pull request’te CI hattında ve ana sürümlerden önce çalıştırılmalıdır. Ayrıca, bağımlılıklardaki veya test ortamındaki değişikliklerle ilgili kusurları tespit etmek için entegrasyon testlerinin tam setinin gece (nightly build) çalıştırılması önerilir.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun