Espresso boşta kalma kaynakları

Boşta olan kaynak, sonuçları kullanıcı arayüzü testinde sonraki işlemleri etkileyen eşzamansız bir işlemi temsil eder. Boşta kalan kaynakları Espresso'ya kaydederek uygulamanızı test ederken bu eşzamansız işlemleri daha güvenilir bir şekilde doğrulayabilirsiniz.

Boşta kalan kaynakların ne zaman gerekli olduğunu belirleyin

Espresso, gelişmiş senkronizasyon özellikleri sunar. Ancak çerçevenin bu özelliği yalnızca MessageQueue üzerinde mesaj yayınlayan işlemler (ör. içeriğini ekrana çizen View alt sınıfı) için geçerlidir.

Espresso, arka plan iş parçacığında çalıştırılanlar dahil olmak üzere diğer eşzamansız işlemlerin farkında olmadığından, bu durumlarda senkronizasyon garantilerini sunamaz. Espresso'nun uygulamanızın uzun süreli işlemlerinden haberdar olmasını sağlamak için her birini boşta kalan bir kaynak olarak kaydetmeniz gerekir.

Uygulamanızın eşzamansız çalışmasının sonuçlarını test ederken boşta kalma kaynaklarını kullanmıyorsanız testlerinizin güvenilirliğini artırmak için aşağıdaki kötü geçici çözümlerden birini kullanmak zorunda kalabilirsiniz:

  • Aramalar Thread.sleep() hedefine ekleniyor. Testlerinize yapay gecikmeler eklediğinizde test paketinizin yürütülmesi daha uzun sürer ve testleriniz daha yavaş cihazlarda yürütüldüğünde bazen başarısız olabilir. Ayrıca, uygulamanızın gelecekteki bir sürümde daha fazla zaman alan eşzamansız çalışmalar yapması gerekebileceği için bu gecikmeler iyi ölçeklendirilmez.
  • Yeniden deneme sarmalayıcıları uygulama. Bunlar,zaman aşımı gerçekleşinceye kadar uygulamanızın eşzamansız iş yapmaya devam edip etmediğini tekrar tekrar kontrol etmek için bir döngü kullanır. Testlerinizde maksimum yeniden deneme sayısı belirtseniz bile her yeniden yürütme, sistem kaynaklarını, özellikle de CPU'yu tüketir.
  • Bir veya daha fazla iş parçacığının başka bir iş parçacığında belirli bir sayıda işlem tamamlanana kadar beklemesine olanak tanıyan CountDownLatch örneklerini kullanma. Bu nesneler, bir zaman aşımı süresi belirtmenizi gerektirir. Aksi takdirde, uygulamanız süresiz olarak engellenebilir. Mandallar aynı zamanda kodunuzu gereksiz yere karmaşık hale getirerek bakımı da zorlaştırır.

Espresso, bu güvenilir olmayan geçici çözümleri testlerinizden kaldırmanıza ve bunun yerine uygulamanızın eşzamansız çalışmasını boşta kalan kaynaklar olarak kaydetmenize olanak tanır.

Yaygın kullanım alanları

Testlerinizde aşağıdaki örneklere benzer işlemler gerçekleştirirken boşta olan bir kaynak kullanmayı düşünün:

  • İnternetten veya yerel bir veri kaynağından veri yüklemeniz
  • Veritabanları ve geri çağırmalarla bağlantılar oluşturma.
  • Bir sistem hizmeti veya IntentService örneği kullanarak hizmetleri yönetme.
  • Bit eşlem dönüşümleri gibi karmaşık iş mantığını gerçekleştirme.

Bu işlemler testlerinizin daha sonra doğruladığı bir kullanıcı arayüzünü güncellediğinde boşta kalan kaynakların kaydedilmesi özellikle önemlidir.

Boşta kalma kaynak uygulaması örnekleri

Aşağıdaki listede, uygulamanıza entegre edebileceğiniz boşta kalma kaynaklarıyla ilgili çeşitli örnek uygulamalar açıklanmaktadır:

CountingIdlingResource
Aktif görevlerin sayacı bulunur. Sayaç sıfır olduğunda ilişkili kaynak boşta olarak kabul edilir. Bu işlev, Semaphore işlevine çok benzer. Çoğu durumda bu uygulama, test sırasında uygulamanızın eşzamansız çalışmasını yönetmek için yeterli olur.
UriIdlingResource
CountingIdlingResource'e benzer ancak kaynağın boşta olarak kabul edilmesi için sayacın belirli bir süre boyunca sıfır olması gerekir. Bu ek bekleme süresi, art arda ağ isteklerini dikkate alır. Bu durumda, ileti dizinizdeki bir uygulama, önceki bir isteğe yanıt aldıktan hemen sonra yeni bir istek gönderebilir.
IdlingThreadPoolExecutor
Oluşturulan iş parçacığı havuzları içindeki toplam çalışan görev sayısını izleyen özel bir ThreadPoolExecutor uygulaması. Bu sınıfta etkin görevlerin sayacını yönetmek için bir CountingIdlingResource kullanılır.
IdlingScheduledThreadPoolExecutor
Özel bir ScheduledThreadPoolExecutor uygulaması. IdlingThreadPoolExecutor sınıfıyla aynı işlevi ve imkanları sunar ancak ilerisi için veya düzenli olarak yürütülmesi planlanan görevleri de takip edebilir.

Kendi boşta kaynağınızı oluşturma

Uygulamanızın testlerinde boşta kalan kaynakları kullanırken özel kaynak yönetimi veya günlük kaydı sağlamanız gerekebilir. Bu gibi durumlarda, önceki bölümde listelenen uygulamalar yeterli olmayabilir. Bu durumda, boşta kalma kaynak uygulamalarınızdan birini genişletebilir veya kendi uygulamanızı oluşturabilirsiniz.

Kendi boşta kalma kaynak işlevini uygularsanız, özellikle ilki olmak üzere aşağıdaki en iyi uygulamaları aklınızda bulundurun:

Boşta kalma denetimlerinin dışında boşta durumuna geçişleri çağırın.
Uygulamanız boşta kaldıktan sonra, tüm isIdleNow() uygulamalarının dışında onTransitionToIdle() çağrısı yapın. Bu sayede Espresso, belirli bir boşta olan kaynağın boşta olup olmadığını belirlemek için ikinci bir gereksiz kontrol yapmaz.

Aşağıdaki kod snippet'inde bu öneri gösterilmektedir:

Kotlin

fun isIdle() {
    // DON'T call callback.onTransitionToIdle() here!
}

fun backgroundWorkDone() {
    // Background work finished.
    callback.onTransitionToIdle() // Good. Tells Espresso that the app is idle.

    // Don't do any post-processing work beyond this point. Espresso now
    // considers your app to be idle and moves on to the next test action.
}

Java

public void isIdle() {
    // DON'T call callback.onTransitionToIdle() here!
}

public void backgroundWorkDone() {
    // Background work finished.
    callback.onTransitionToIdle() // Good. Tells Espresso that the app is idle.

    // Don't do any post-processing work beyond this point. Espresso now
    // considers your app to be idle and moves on to the next test action.
}
İhtiyaç duymadan önce boşta olan kaynakları kaydedin.

Boşta kalan kaynaklarla ilişkili senkronizasyon avantajları, yalnızca Espresso'nun ilgili kaynağın isIdleNow() yöntemini ilk kez çağırdıktan sonra geçerli olur.

Aşağıdaki listede bu mülke ilişkin çeşitli örnekler gösterilmektedir:

  • Boşta olan bir kaynağı @Before ek açıklaması bulunan bir yönteme kaydederseniz boşta kalan kaynak her testin ilk satırında geçerli olur.
  • Boşta olan bir kaynağı test içinde kaydederseniz boşta kalan kaynak, Espresso tabanlı bir sonraki işlem sırasında geçerli olur. Bir sonraki işlem, boşta olan kaynağı kaydeden ifadeyle aynı testte olsa bile bu davranış yine de gerçekleşir.
Kullanıldıktan sonra boşta kalan kaynakların kaydını iptal edin.

Sistem kaynaklarından tasarruf etmek için, boşta olan kaynakların kaydını artık ihtiyacınız kalmadığında iptal etmeniz gerekir. Örneğin, boşta olan bir kaynağı @Before ek açıklaması bulunan bir yöntemle kaydederseniz bu kaynağın kaydını @After ek açıklaması bulunan ilgili bir yöntemle iptal etmeniz en iyisidir.

Boşta kalan kaynakları kaydetmek ve bunların kaydını iptal etmek için boşta kalan kayıt defteri kullanın.

Uygulamanızın boşta kalan kaynakları için bu kapsayıcıyı kullanarak gerektiğinde boşta kalan kaynakları tekrar tekrar kaydedebilir ve kaydını iptal edebilir, böylece tutarlı bir davranış gözlemlemeye devam edebilirsiniz.

Boşta kalan kaynaklarda yalnızca basit uygulama durumunu koruyun.

Örneğin, uyguladığınız ve kaydettiğiniz boşta kalma kaynaklarında View nesnelerine referans bulunmamalıdır.

Boşta kalan kaynakları kaydet

Espresso, uygulamanızın boşta kalma kaynaklarını yerleştirebileceğiniz bir container sınıfı sağlar. IdlingRegistry adlı bu sınıf, uygulamanızda minimum ek yüke neden olan bağımsız bir yapıdır. Bu sınıf, uygulamanızın sürdürülebilirliğini iyileştirmek için aşağıdaki adımları uygulamanıza da olanak tanır:

  • Uygulamanızın testlerinde, içerdiği boşta kalma kaynakları yerine IdlingRegistry için bir referans oluşturun.
  • Her derleme varyantı için kullandığınız boşta kalan kaynakların toplanmasındaki farklılıkları koruyun.
  • Boşta kalma kaynaklarını bu hizmetlere referans veren kullanıcı arayüzü bileşenleri yerine uygulamanızın hizmetlerinde tanımlayın.

Boşta kalan kaynakları uygulamanıza entegre etme

Boşta kalma kaynaklarını bir uygulamaya birkaç farklı şekilde ekleyebilirsiniz, ancak özellikle bir yaklaşım, belirli bir boşta olan kaynağın temsil ettiği belirli bir işlemi belirtmenize olanak tanırken uygulamanızın kapsamını korur.

Uygulamanıza boşta kalan kaynaklar eklerken, uygulamanın kendisine boşta kalma kaynak mantığını yerleştirmenizi ve testlerinizde yalnızca kayıt ve kayıt iptali işlemlerini gerçekleştirmenizi önemle tavsiye ederiz.

Bu yaklaşımı uygulayarak üretim kodunda yalnızca test amaçlı bir arayüz kullanmak gibi alışılmadık bir durum yaratsanız da uygulamanızın APK boyutunu ve yöntem sayısını koruyarak boşta kalan kaynakları halihazırda sahip olduğunuz kodun etrafından sarabilirsiniz.

Alternatif yaklaşımlar

Uygulamanızın üretim kodunda boşta kalma kaynakları mantığının olmamasını tercih ederseniz başka entegrasyon stratejileri daha vardır:

  • Gradle'ın ürün çeşitleri gibi derleme varyantları oluşturun ve boşta kalan kaynakları yalnızca uygulamanızın hata ayıklama derlemesinde kullanın.
  • Uygulamanızın boşta kalan kaynak bağımlılık grafiğini testlerinize eklemek için Dagger gibi bir bağımlılık yerleştirme çerçevesi kullanın. Dagger 2 kullanıyorsanız eklemenin kendisi bir alt bileşenden kaynaklanmalıdır.
  • Uygulamanızın testlerine boşta kalan bir kaynak uygulayın ve uygulama uygulamasının bu testlerde senkronize edilmesi gereken bölümünü ortaya çıkarın.

    Dikkat: Bu tasarım kararı, boşta olan kaynaklara yönelik bağımsız bir referans oluşturuyor gibi görünse de en basit uygulamalar dışındaki tüm uygulamaları kapsamayı da ortadan kaldırır.

Ek kaynaklar

Android testlerinde Espresso'yu kullanma hakkında daha fazla bilgi için aşağıdaki kaynaklara bakın.

Sana Özel