Espresso Test Çerçevesi - AdapterView
AdapterView , bağdaştırıcı kullanılarak temel bir veri kaynağından getirilen ürün listesi ve kullanıcı kişileri gibi benzer bilgilerin bir koleksiyonunu oluşturmak için özel olarak tasarlanmış özel bir görünüm türüdür . Veri kaynağı, karmaşık veritabanı girişlerinin basit bir listesi olabilir. Elde edilen görüntüsü Bazı AdapterView olan liste görünümü , GridView ve Spinner .
AdapterView , temel alınan veri kaynağında bulunan veri miktarına bağlı olarak kullanıcı arabirimini dinamik olarak oluşturur. Ek olarak, AdapterView yalnızca ekranın kullanılabilir görünür alanında işlenebilen minimum gerekli verileri oluşturur. AdapterView bunu belleği korumak ve temel alınan veriler büyük olsa bile kullanıcı arabiriminin düzgün görünmesini sağlamak için yapar.
Analiz üzerine, AdapterView mimarisinin doğası, test edilecek belirli görünüm ilk etapta hiç işlenemeyebileceğinden , onView seçeneğini ve onun görünüm eşleştiricilerini ilgisiz kılar . Neyse ki espresso , temeldeki verileri eşleştirmek için hamcrest eşleştiricilerini (temel alınan verilerin veri türüyle ilgili) kabul eden ve eşleşen verilerin görünümüne karşılık gelen DataInteraction türü nesneyi döndüren bir yöntem olan onData ( ) sağlar . Örnek bir kod aşağıdaki gibidir:
onData(allOf(is(instanceOf(String.class)), startsWith("Apple"))).perform(click())
Burada, onData () , temel alınan verilerde (dizi listesi) mevcutsa "Apple" girişiyle eşleşir ve eşleşen görünümle ("Apple" girişine karşılık gelen TextView) etkileşim için DataInteraction nesnesini döndürür .
Yöntemler
DataInteraction , görünümle etkileşim kurmak için aşağıdaki yöntemleri sağlar,
gerçekleştirmek ()
Bu, görüntüleme eylemlerini kabul eder ve geçirilen görünüm eylemlerini ateşler.
onData(allOf(is(instanceOf(String.class)), startsWith("Apple"))).perform(click())
Kontrol()
Bu, görünüm iddialarını kabul eder ve görünümde geçirilen iddiaları kontrol eder.
onData(allOf(is(instanceOf(String.class)), startsWith("Apple")))
.check(matches(withText("Apple")))
inAdapterView ()
Bu, görüş eşleştiricilerini kabul eder. Özellikle seçer AdapterView görünüşüdür matchers ve getiri geçirilen göre DataInteraction eşleşen etkileşim nesnesi AdapterView
onData(allOf())
.inAdapterView(withId(R.id.adapter_view))
.atPosition(5)
.perform(click())
atPosition ()
Bu, tamsayı türünde bir bağımsız değişken kabul eder ve temel verilerdeki öğenin konumunu belirtir. Verinin konumsal değerine karşılık gelen görünümü seçer ve eşleşen görünümle etkileşim kurmak için DataInteraction nesnesini döndürür . Temel verilerin doğru sırasını bilirsek, faydalı olacaktır.
onData(allOf())
.inAdapterView(withId(R.id.adapter_view))
.atPosition(5)
.perform(click())
onChildView ()
Bu, görünüm eşleştiricilerini kabul eder ve belirli alt görünümdeki görünümü eşleştirir. Örneğin, AdapterView tabanlı bir ürün listesi içindeki Satın Al düğmesi gibi belirli öğelerle etkileşim kurabiliriz .
onData(allOf(is(instanceOf(String.class)), startsWith("Apple")))
.onChildView(withId(R.id.buy_button))
.perform(click())
Örnek Bir Uygulama Yazın
AdapterView'a dayalı basit bir uygulama yazmak ve onData () yöntemini kullanarak bir test durumu yazmak için aşağıda gösterilen adımları izleyin .
Android stüdyosunu başlatın.
Daha önce tartışıldığı gibi yeni proje oluşturun ve MyFruitApp olarak adlandırın .
Refactor → Migrate to AndroidX seçenek menüsünü kullanarak uygulamayı AndroidX çerçevesine taşıyın .
Ana aktivitede varsayılan tasarımı kaldırın ve ListView ekleyin . Activity_main.xml dosyasının içeriği aşağıdaki gibidir,
<?xml version = "1.0" encoding = "utf-8"?>
<RelativeLayout xmlns:android = "http://schemas.android.com/apk/res/android"
xmlns:app = "http://schemas.android.com/apk/res-auto"
xmlns:tools = "http://schemas.android.com/tools"
android:layout_width = "match_parent"
android:layout_height = "match_parent"
tools:context = ".MainActivity">
<ListView
android:id = "@+id/listView"
android:layout_width = "wrap_content"
android:layout_height = "wrap_content" />
</RelativeLayout>
Liste görünümünün öğe şablonunu belirtmek için yeni düzen kaynağı, item.xml ekleyin . İtem.xml dosyasının içeriği aşağıdaki gibidir,
<?xml version = "1.0" encoding = "utf-8"?>
<TextView xmlns:android = "http://schemas.android.com/apk/res/android"
android:id = "@+id/name"
android:layout_width = "fill_parent"
android:layout_height = "fill_parent"
android:padding = "8dp"
/>
Şimdi, temel veri olarak meyve dizisine sahip bir bağdaştırıcı oluşturun ve bunu liste görünümüne ayarlayın. Bu ihtiyaçlar yapılacak onCreate () ait MainActivity aşağıda belirtilen şekilde,
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Find fruit list view
final ListView listView = (ListView) findViewById(R.id.listView);
// Initialize fruit data
String[] fruits = new String[]{
"Apple",
"Banana",
"Cherry",
"Dates",
"Elderberry",
"Fig",
"Grapes",
"Grapefruit",
"Guava",
"Jack fruit",
"Lemon",
"Mango",
"Orange",
"Papaya",
"Pears",
"Peaches",
"Pineapple",
"Plums",
"Raspberry",
"Strawberry",
"Watermelon"
};
// Create array list of fruits
final ArrayList<String> fruitList = new ArrayList<String>();
for (int i = 0; i < fruits.length; ++i) {
fruitList.add(fruits[i]);
}
// Create Array adapter
final ArrayAdapter adapter = new ArrayAdapter(this, R.layout.item, fruitList);
// Set adapter in list view
listView.setAdapter(adapter);
}
Şimdi kodu derleyin ve uygulamayı çalıştırın. My Fruit Uygulamasının ekran görüntüsü aşağıdaki gibidir,
Şimdi, ExampleInstrumentedTest.java dosyasını açın ve ActivityTestRule'u aşağıda belirtildiği gibi ekleyin ,
@Rule
public ActivityTestRule<MainActivity> mActivityRule =
new ActivityTestRule<MainActivity>(MainActivity.class);
Ayrıca, test yapılandırmasının app / build.gradle içinde yapıldığından emin olun -
dependencies {
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test:runner:1.1.1'
androidTestImplementation 'androidx.test:rules:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
}
Liste görünümünü aşağıdaki gibi test etmek için yeni bir test senaryosu ekleyin,
@Test
public void listView_isCorrect() {
// check list view is visible
onView(withId(R.id.listView)).check(matches(isDisplayed()));
onData(allOf(is(instanceOf(String.class)), startsWith("Apple"))).perform(click());
onData(allOf(is(instanceOf(String.class)), startsWith("Apple")))
.check(matches(withText("Apple")));
// click a child item
onData(allOf())
.inAdapterView(withId(R.id.listView))
.atPosition(10)
.perform(click());
}
Son olarak, android stüdyosunun içerik menüsünü kullanarak test senaryosunu çalıştırın ve tüm test durumlarının başarılı olup olmadığını kontrol edin.