Kullanıcı etkileşimlerini test etmek, kullanıcıların uygulamanızla etkileşimde bulunurken beklenmedik sonuçlarla karşılaşmamalarını veya kötü bir deneyim yaşamalarını önlemeye yardımcı olur. Uygulamanızın kullanıcı arayüzünün doğru şekilde çalıştığını doğrulamanız gerekiyorsa kullanıcı arayüzü testleri oluşturma alışkanlığı kazanmalısınız.
Kullanıcı arayüzü testindeki yaklaşımlardan biri, gerçek kişilerden oluşan bir test kullanıcısının hedef uygulamada bir dizi kullanıcı işlemi yapmasını ve uygulamanın düzgün şekilde çalıştığını doğrulamasını sağlamaktır. Ancak, bu manuel yaklaşım çok zaman alabilir ve hataya açık olabilir. Kullanıcı arayüzü testlerinizi, kullanıcı işlemlerinin otomatik bir şekilde gerçekleştirileceği şekilde yazmak daha verimli bir yaklaşımdır. Otomatik yaklaşım, testlerinizi tekrarlanabilir bir biçimde hızlı ve güvenilir bir şekilde çalıştırmanızı sağlar.
Kullanıcı arayüzü testleri bir uygulamayı (veya uygulamanın bir kısmını) başlatır, ardından kullanıcı etkileşimlerini simüle eder ve son olarak uygulamanın gerektiği gibi tepki verip vermediğini kontrol eder. Bu testler, küçük bir bileşenin davranışını doğrulamaktan tüm kullanıcı işlemleri akışı boyunca işlem yapan büyük bir gezinme testine kadar uzanabilen entegrasyon testleridir. Regresyonları kontrol etmenin yanı sıra farklı API seviyeleri ve fiziksel cihazlarla uyumluluğu doğrulamak için yararlıdır.
Android Studio'da kullanılan kullanıcı arayüzü testleri
Android Studio'yu kullanarak araçlı kullanıcı arayüzü testleri çalıştırmak için test kodunuzu ayrı bir Android test klasörüne (src/androidTest/java
) uygularsınız. Gradle için Android Eklentisi, test kodunuza dayalı bir test uygulaması oluşturur, ardından test uygulamasını hedef uygulamayla aynı cihazda yükler. Test kodunuzda, belirli kullanım senaryolarını kapsayan test görevleri gerçekleştirmek için, hedef uygulamadaki kullanıcı etkileşimlerini simüle etmek üzere kullanıcı arayüzü test çerçevelerini kullanabilirsiniz.
Jetpack çerçeveleri
Jetpack, kullanıcı arayüzü testleri yazmak için API'ler sağlayan çeşitli çerçeveler içerir:
- Espresso test çerçevesi (Android 4.0.1, API düzeyi 14 veya üstü), tek bir hedef uygulama içindeki View kullanıcı etkileşimlerini simüle etmek üzere kullanıcı arayüzü testleri yazmak için API'ler sağlar. Espresso'yu kullanmanın en önemli avantajı, test ettiğiniz uygulamanın kullanıcı arayüzü ile test işlemlerinin otomatik olarak senkronize edilmesini sağlamasıdır. Espresso, ana iş parçacığının boşta olduğunu algılar ve böylece test komutlarınızı uygun zamanda çalıştırarak testlerinizin güvenilirliğini artırır.
- Jetpack Compose (Android 5.0, API düzeyi 21 veya sonraki sürümler), Oluşturma ekranlarını ve bileşenlerini başlatmak ve bunlarla etkileşimde bulunmak için bir dizi test API'si sağlar. Oluşturma öğeleriyle olan etkileşimler testlerle senkronize edilir ve zaman, animasyonlar ve yeniden besteler üzerinde tam kontrole sahiptir.
- UI Automator (Android 4.3, API düzeyi 18 veya sonraki sürümler), sistem ve yüklü uygulamalarda uygulamalar arası işlevsel kullanıcı arayüzü testi için uygun olan bir kullanıcı arayüzü test çerçevesidir. UI Automator API'leri, bir test cihazında Ayarlar menüsünü veya uygulama başlatıcıyı açma gibi işlemleri gerçekleştirmenize olanak tanır.
- Robofactric (Android 4.1, API düzeyi 16 veya üstü) iş istasyonunuzda veya bir emülatör ya da cihaz yerine normal bir JVM'deki sürekli entegrasyon ortamında çalışan yerel testler oluşturmanıza olanak tanır. Kullanıcı arayüzü bileşenleriyle etkileşimde bulunmak için Espresso veya Compose test API'lerini kullanabilir.
Kesintililik ve senkronizasyon
Mobil uygulamaların ve çerçevelerin eşzamansız doğası, güvenilir ve tekrarlanabilir testlerin yazılmasını çoğu zaman zorlaştırır. Bir kullanıcı etkinliği eklendiğinde, test çerçevesi uygulamanın tepki vermeyi tamamlamasını beklemelidir. Bu işlem, ekrandaki bazı metinleri değiştirmekten etkinliğin eksiksiz bir şekilde yeniden oluşturulmasına kadar değişiklik gösterebilir. Bir test deterministik bir davranışa sahip değilse bu test kesintilidir.
Compose veya Espresso gibi modern çerçeveler testler düşünülerek tasarlanmıştır. Bu nedenle, kullanıcı arayüzünün bir sonraki test işlemi veya onaylamadan önce boşta kalacağı garanti edilir. Buna senkronizasyon denir.
Senkronizasyonu test et
Bir veritabanından veri yükleme veya sonsuz animasyonlar gösterme gibi test tarafından bilinmeyen eşzamansız veya arka plan işlemleri çalıştırdığınızda yine de sorunlar ortaya çıkabilir.
![Test yapmadan önce uygulamanın boşta olup olmadığını kontrol eden bir döngüyü gösteren akış diyagramı](https://developer.android.google.cn/static/training/testing/instrumented-tests/sync.png?authuser=9&hl=tr)
Test paketinizin güvenilirliğini artırmak için Espresso Boşta Kalma Kaynakları gibi arka plan işlemlerini izleyebileceğiniz bir yöntem yükleyebilirsiniz. Ayrıca, boşta kalma durumu için sorgulayabileceğiniz veya senkronizasyonu iyileştiren test sürümleriyle ilgili modülleri (örneğin, eş yordalar için TestDispatcher veya RxJava için RxIdler) değiştirebilirsiniz.
![Senkronizasyon sabit bir süre beklemeye bağlı olduğunda bir test hatasını gösteren şema](https://developer.android.google.cn/static/training/testing/instrumented-tests/flaky.png?authuser=9&hl=tr)
Mimari ve test kurulumu
Uygulamanızın mimarisi, testlerin bir kısmını test etmek için parçaların yerini almasına izin vermelidir. Ayrıca, teste yardımcı olacak yardımcı programlar sağlayan kitaplıklar kullanmalısınız. Örneğin, bir veri deposu modülünü teste sahte, deterministik veriler sağlayan bellek içi bir sürümüyle değiştirebilirsiniz.
![Üretim ve test mimari diyagramları. Üretim şeması, depoya veri sağlayan yerel ve uzak veri kaynaklarını gösterir. Böylece, veri deposuna eşzamansız olarak veri sağlanır. Test diyagramında, verilerini kullanıcı arayüzüyle eşzamanlı olarak sağlayan Sahte bir depo gösteriliyor.](https://developer.android.google.cn/static/training/testing/instrumented-tests/arch.png?authuser=9&hl=tr)
Bu işlevi etkinleştirmek için önerilen yaklaşım, bağımlılık yerleştirme kullanmaktır. Kendi sisteminizi manuel olarak oluşturabilirsiniz ancak bunun için Hilt gibi bir DI çerçevesi kullanmanızı öneririz.
Neden otomatik olarak test edelim?
Bir Android uygulaması, birçok API düzeyinde ve form faktöründe binlerce farklı cihazı hedefleyebilir. İşletim sisteminin kullanıcıya sunduğu yüksek özelleştirme düzeyi, uygulamanızın yanlış oluşturulabileceği, hatta bazı cihazlarda kilitlenebileceği anlamına gelir.
Kullanıcı arayüzü testi, bir uygulamanın farklı bağlamlardaki davranışını doğrulayarak uyumluluk testi yapmanıza olanak tanır. Kullanıcı arayüzü testlerinizi aşağıdaki şekillerde değişiklik gösteren cihazlarda çalıştırmak isteyebilirsiniz:
- API düzeyi: 21, 25 ve 30.
- Locale (Yerel Ayar): İngilizce, Arapça ve Çince.
- Yön: Dikey, yatay.
Dahası, uygulamalar telefon dışındaki davranışları da kontrol etmelidir. Tabletlerde, katlanabilir cihazlarda ve diğer cihazlarda test etmelisiniz.
Ek kaynaklar
Kullanıcı arayüzü testleri oluşturma hakkında daha fazla bilgi için aşağıdaki kaynaklara bakın.