Nasıl yapılır? rehberleri
Compose testlerinde boşta bekleyen kaynakların alternatifleri: waitUntil API'leri (güncellendi)
Okuma süresi: 3 dakika
Bu makalede, belirli koşulların karşılanmasını beklemek için Compose'da waitUntil test API'sini nasıl kullanacağınız açıklanmaktadır. Bu, bazı durumlarda Boşta Bekleyen Kaynaklar kullanmaya iyi bir alternatiftir.
[2023 güncellemesi] Özet: Compose testlerinde (v1.4.0+) senkronizasyon için yeni waitUntil API'lerini kullanın.
Senkronizasyon nedir?
Testleri kategorize etmenin bir yolu kapsamlarına göre sınıflandırmaktır. Küçük testler veya birim testleri, uygulamanızın küçük parçalarına odaklanırken büyük testler veya uçtan uca testler, uygulamanızın büyük bir bölümünü kapsar. Bu ve diğer test türleri hakkında bilgileri yeni güncellenen test belgelerinde bulabilirsiniz.
Resmi tam boyutta görüntülemek için Enter tuşuna basın veya tıklayın.
Senkronizasyon, testin bir sonraki işlemi ne zaman çalıştıracağını bilmesini sağlayan mekanizmadır. Doğrulamak için seçtiğiniz kod parçası ne kadar büyük olursa testle senkronize etmek o kadar zor olur. Birim testlerinde, doğrulanacak kodun yürütülmesini tam olarak kontrol etmek kolaydır. Ancak kapsamı daha fazla sınıf, modül ve katmanı içerecek şekilde genişlettikçe test çerçevesinin uygulamanın bir işlemin ortasında olup olmadığını bilmesi zorlaşıyor.
Resmi tam boyutta görüntülemek için Enter tuşuna basın veya tıklayın.
androidx.test ve dolayısıyla Yazma Testi, bu konuda fazla endişelenmemeniz için arka planda bazı yöntemler kullanır. Örneğin, ana iş parçacığı meşgulse test, sonraki satırı yürütebilene kadar duraklatılır.
Ancak her şeyi bilemezler. Örneğin, verileri arka plan iş parçacığında yüklerseniz test çerçevesi bir sonraki işlemi çok erken yürütebilir ve bu da testinizin başarısız olmasına neden olur. En kötü durum, bu durumun yalnızca küçük bir yüzdede gerçekleşmesi ve testi güvenilmez hale getirmesidir.
1. seçenek: Boşta bekleyen kaynaklar
Boşta Bekleyen Kaynaklar, geliştirici olarak uygulamanın ne zaman meşgul olduğuna karar vermenizi sağlayan bir Espresso özelliğidir. Bu düğüm saatlerini iki şekilde kullanabilirsiniz:
1. Bu işlevleri, testin göremediği bir işi yapan çerçeveye veya kitaplığa yüklemek.
Buna iyi bir örnek, RxJava zamanlayıcıyı sarmalayan RxIdler'dır. Bu, test kurulumunuzu test kodundan net bir şekilde ayırmanıza olanak tanıdığı için boşta bekleyen kaynakları kaydetmenin tercih edilen yoludur.
2. Test edilen kodunuzu, uygulamanızın meşgul olup olmadığıyla ilgili bilgileri açıkça gösterecek şekilde değiştirme.
Örneğin, bir veri kaynağından veri yüklerken meşgul olduğunu belirtmek için deponuzu (veya bir test çiftini) değiştirebilirsiniz:
Üretim kodunuzu kirlettiğiniz veya karmaşık test çiftleri oluşturduğunuz için bu ideal bir yöntem değildir. Ayrıca, bazı durumlarda bunları yüklemek zordur. Örneğin, Kotlin Flow'da Idling Resources'ı nasıl kullanırsınız? Hangi güncelleme son güncellemedir?
Bunun yerine, işlerin olmasını bekleyebiliriz.
2. seçenek: Yanlış şekilde beklemek
Veri yükleme işlemi genellikle hızlıdır. Özellikle sahte veriler kullanıldığında bu işlem daha da hızlı olur. Bu nedenle, testi birkaç saniye uyutmak yerine neden boşta duran kaynaklarla zaman kaybedesiniz?
Bu test gerekenden daha yavaş çalışacak veya başarısız olacak. Yüzlerce veya binlerce kullanıcı arayüzü testiniz olduğunda testlerin mümkün olduğunca hızlı olmasını istersiniz.
Ayrıca, bazen emülatörler veya cihazlar düzgün çalışmayıp duraklayarak bu işlemin 2.000 ms'den biraz daha uzun sürmesine ve derlemenizin bozulmasına neden olur. Yüzlerce testiniz olduğunda bu durum büyük bir sorun haline gelir.
3. seçenek: Doğru şekilde bekleyin.
Test edilen kodunuzu meşgul olduğunu gösterecek şekilde değiştirmek istemiyorsanız rastgele bir süre beklemek yerine belirli bir koşul karşılanana kadar bekleyebilirsiniz.
Compose'da, boolean değeri üreten başka bir işlevi alan waitUntil işlevinden yararlanabilirsiniz.
22.03.2023 güncellemesi: Compose 1.4.0'dan itibaren yeni bir waitUntil API'leri grubu ekledik:
[1.4.0'dan önce: Şu yardımcıları kullanın: waitUntilExists, waitUntilNodeCount]
…ve bunları şu şekilde kullanın:
Bu API'leri yalnızca testinizi kullanıcı arayüzüyle senkronize etmeniz gerektiğinde kullanın. Her test ifadesinde senkronizasyon yapılması, test kodunu gereksiz yere kirleterek bakımını zorlaştırır.
Bu özelliği ne zaman kullanmalısınız? Bu işlevin iyi bir kullanım alanı, gözlemlenebilir bir kaynaktan (LiveData, Kotlin Flow veya RxJava ile) veri yüklemektir. Kullanıcı arayüzünüzün boşta kabul edilmesi için birden fazla güncelleme alması gerektiğinde, waitUntil kullanarak senkronizasyonu basitleştirebilirsiniz.
Örneğin, bir görünümden Akış topladığınızda:
Ayrıca, bu akışa birden fazla öğe gönderirsiniz:
repository ilk sonuçla geri dönmek için belirsiz bir süre beklerse test çerçevesi "Yükleniyor"un boşta kalma durumu (collectAsState içinde atanan ilk değer) olduğunu düşünür ve sonraki ifadeyle devam eder.
Bu nedenle, kullanıcı arayüzünde yükleme göstergesinin görünmediğinden emin olursanız testi çok daha güvenilir hale getirebilirsiniz:
İyi… durun bakalım… testler!
Kod snippet'leri lisansı:
Copyright 2022 Google LLC. SPDX-License-Identifier: Apache-2.0
Okumaya devam edin
-
"Nasıl yapılır?" rehberleri
Bu yayında, biraz daha görsel olarak ilgi çekici bir konuya, yani efektin temeli olarak yüz algılamayı kullanarak kamera önizlememizin üzerine bir spot ışığı efekti uygulama konusuna değineceğiz.
Jolanda Verhoef • Okuma süresi: 8 dk.
-
"Nasıl yapılır?" rehberleri
Aşırı pilin hızlı tükenmesinin Android kullanıcıları için akla ilk gelen sorunlardan biri olduğunun farkında olan Google, geliştiricilerin daha az güç tüketen uygulamalar geliştirmesine yardımcı olmak için önemli adımlar atmaktadır.
Alice Yuan • Okuma süresi: 8 dk.
-
"Nasıl yapılır?" rehberleri
Hem cihaz üzerinde hem de bulut modellerini kullanan yapay zeka destekli özelliklerin örneklerini sunarak kullanıcılarınız için keyifli deneyimler oluşturmanıza ilham vermek istedik.
Thomas Ezan, Ivy Knight • Okuma süresi: 2 dakika
Gelişmelerden haberdar olun
Android geliştirmeyle ilgili en son analizleri her hafta gelen kutunuza alın.