Nasıl yapılır? rehberleri

Compose testlerinde boşta bekleyen kaynakların alternatifleri: waitUntil API'leri (güncellendi)

Okuma süresi: 3 dakika
Jose Alcérreca
Geliştirici İlişkileri Mühendisi

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.

large_0_9n_Nqkt_HHUTOQ_In_AI_b113b43bcf.png
Uygulamadaki farklı test kapsamları

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.

large_correct_b1a355f41b.webp
Test ve uygulama arasındaki senkronizasyonun doğru olması

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.

0_DOCdjq-JpPDGV5OB.png

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.

1_jIYFxE4qlHXMi2SwW6JemA.png

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
Yazan:

Okumaya devam edin